Example #1
0
void ContactListModel::Private::removeContact(PsiContact *contact)
{
    Q_ASSERT(monitoredContacts.contains(contact));
    if (!monitoredContacts.contains(contact))
        return;

    while (monitoredContacts.contains(contact)) {
        QModelIndex index = monitoredContacts.take(contact);
        if (!index.isValid()) {
            continue;
        }

        q->beginRemoveRows(index.parent(), index.row(), index.row());
        ContactListItem *item = q->toItem(index);
        ContactListItem *group = item->parent();

        delete item;
        q->endRemoveRows();

        index = q->toModelIndex(group);
        // Delete empty group
        if (group->isGroup() && !group->childCount()) {
            q->beginRemoveRows(index.parent(), index.row(), index.row());
            delete group;
            q->endRemoveRows();

        }
        else {
            // Update group
            emit q->dataChanged(index, index);
        }
    }
    disconnect(contact, nullptr, this, nullptr);
    operationQueue.remove(contact);
}
Example #2
0
bool ContactListModel::setData(const QModelIndex &index, const QVariant &data, int role)
{
    if (!index.isValid())
        return false;

    ContactListItem *item = toItem(index);
    if (!item)
        return false;
    PsiContact *contact = item->isContact() ? item->contact() : nullptr;

    if (role == ActivateRole) {
        if (!contact)
            return false;

        contact->activate();
        return true;
    }
    else if (role == Qt::EditRole) {
        QString name = data.toString();
        if (contact) {
            item->setName(name);
            emit dataChanged(index, index);
        }
        else if (item->isGroup() && !name.isEmpty()) {
            QString oldName = item->name();
            QList<PsiContact*> contacts;
            for (int i = 0; i < item->childCount(); ++i) {
                if (item->child(i)->isContact())
                contacts << item->child(i)->contact();
            }

            for (PsiContact *contact: contacts) {
                QStringList groups = contact->groups();
                groups.removeOne(oldName);
                groups << name;
                contact->setGroups(groups);
            }

        }

        return true;
    }
    else if (role == ExpandedRole) {
        if (!item->isContact()) {
            item->setExpanded(data.toBool());
        }
    }

    return true;
}