QVariant ContactModel::data(const QModelIndex &index, int role) const { if (!index.parent().isValid()) { // Groups switch (role) { case Qt::DisplayRole: if(index.column()==0) return groups.keys().at(index.row()); } } else { // Contacts ContactGroup *group = reinterpret_cast<ContactGroup *>(index.internalPointer()); Contact contact = group->contacts.at(index.row()); MAGNORMOBOT *bot = contact.conduit.data(); switch (role) { case Qt::DisplayRole: if(index.column()==1) return bot->getNameFromJid(contact.jid); case Qt::DecorationRole: { RosterItem *item = bot->getRosterItemFromJid(contact.jid); if (!item) return QIcon(":/icons/user-offline"); if (!item->highestResource()) return QIcon(":/icons/user-offline"); switch (item->highestResource()->presence()) { case Presence::Available: case Presence::Chat: if(index.column()==1) return QIcon(":/icons/user-online"); else { return bot->getAccountIcon(); } case Presence::Away: case Presence::DND: case Presence::XA: if(index.column()==1) return QIcon(":/icons/user-away"); else { return bot->getAccountIcon(); } default: return QIcon(":/icons/user-offline"); } break; } case Qt::ToolTipRole: case ContactModel::JIDRole: return contact.jid; case ContactModel::ContactRole: return QVariant::fromValue(contact); case ContactModel::PresenceRole: { RosterItem *item = bot->getRosterItemFromJid(contact.jid); if (!item) return Presence::Unavailable; if (!item->highestResource()) return Presence::Unavailable; return item->highestResource()->presence(); } } } return QVariant(); }