1
#include <QAbstractItemModel>
6
#include "contactlist.h"
7
#include "contactlistitem.h"
8
#include "contactlistgroup.h"
9
#include "contactlistmodel.h"
10
#include "contactlistrootitem.h"
11
#include "contactlistcontact.h"
12
#include "contactlistgroupitem.h"
17
#define GROUPBG_COLOR QColor(0x96,0x96,0x96)
18
#define GROUPFG_COLOR QColor(0xFF,0xFF,0xFF)
19
#define AWAY_COLOR QColor(0x00,0x4b,0xb4)
20
#define OFFLINE_COLOR QColor(0x64,0x64,0x64)
21
#define DND_COLOR QColor(0x7e,0x00,0x00)
22
#define ONLINE_COLOR QColor(0x00,0x00,0x00)
24
ContactListModel::ContactListModel(ContactList* contactList) : contactList_(contactList), showStatus_(true)
26
connect(contactList_,SIGNAL(dataChanged()),this,SLOT(contactList_changed()));
30
QVariant ContactListModel::data(const QModelIndex &index, int role) const
35
ContactListItem* item = static_cast<ContactListItem*>(index.internalPointer());
36
ContactListGroup* group = 0;
37
ContactListGroupItem* groupItem = 0;
38
ContactListContact* contact = 0;
40
if (role == Qt::DisplayRole && index.column() == NameColumn) {
41
if ((contact = dynamic_cast<ContactListContact*>(item))) {
43
if (showStatus_ && !contact->status().message().isEmpty()) {
44
txt = QString("%1 (%2)").arg(contact->name()).arg(contact->status().message());
47
txt = contact->name();
50
else if ((group = dynamic_cast<ContactListGroup*>(item))) {
51
return QVariant(QString("%1 (%2/%3)").arg(group->name()).arg(group->countOnline()).arg(group->count()));
54
else if (role == Qt::EditRole && index.column() == NameColumn) {
55
if ((contact = dynamic_cast<ContactListContact*>(item))) {
56
return QVariant(contact->name());
58
else if ((group = dynamic_cast<ContactListGroup*>(item))) {
59
return QVariant(group->name());
62
else if (role == Qt::DecorationRole && (index.column() == StatusIconColumn || index.column() == PictureColumn)) {
63
if ((contact = dynamic_cast<ContactListContact*>(item))) {
64
if (index.column() == PictureColumn)
65
return QVariant(contact->picture());
66
else if (index.column() == StatusIconColumn)
67
return QVariant(contact->statusIcon());
70
else if (role == Qt::BackgroundColorRole) {
71
if ((group = dynamic_cast<ContactListGroup*>(item))) {
72
return qVariantFromValue(GROUPBG_COLOR);
75
else if (role == Qt::TextColorRole) {
76
if ((contact = dynamic_cast<ContactListContact*>(item))) {
77
if(contact->status().type() == Status::Away || contact->status().type() == Status::XA) {
78
return qVariantFromValue(AWAY_COLOR);
80
else if (contact->status().type() == Status::Offline) {
81
return qVariantFromValue(OFFLINE_COLOR);
83
else if (contact->status().type() == Status::DND) {
84
return qVariantFromValue(DND_COLOR);
87
return qVariantFromValue(ONLINE_COLOR);
90
else if ((group = dynamic_cast<ContactListGroup*>(item))) {
91
return qVariantFromValue(GROUPFG_COLOR);
94
else if (role == Qt::ToolTipRole) {
95
return QVariant(item->toolTip());
97
else if (role == ExpandedRole) {
98
if ((groupItem = dynamic_cast<ContactListGroupItem*>(item))) {
99
if (contactList_->search().isEmpty()) {
100
return QVariant(groupItem->expanded());
103
return QVariant(true);
107
return QVariant(false);
113
bool ContactListModel::setData(const QModelIndex& index, const QVariant& data, int role)
115
if (!index.isValid())
118
ContactListItem* item = static_cast<ContactListItem*>(index.internalPointer());
119
if (role == ContextMenuRole) {
120
item->showContextMenu(data.toPoint());
126
QVariant ContactListModel::headerData(int section, Qt::Orientation orientation, int role) const
129
Q_UNUSED(orientation);
134
QModelIndex ContactListModel::index(int row, int column, const QModelIndex &parent) const
136
ContactListGroupItem* parentItem;
137
if (parent.isValid())
138
parentItem = static_cast<ContactListGroupItem*>(parent.internalPointer());
140
parentItem = contactList_->rootItem();
142
ContactListItem* item = parentItem->atIndex(row);
143
return (item ? createIndex(row, column, item) : QModelIndex());
147
QModelIndex ContactListModel::parent(const QModelIndex &index) const
149
if (!index.isValid())
150
return QModelIndex();
152
ContactListItem* item = static_cast<ContactListItem*>(index.internalPointer());
153
ContactListGroupItem* parent = item->parent();
155
return (parent == contactList_->rootItem() ? QModelIndex() : createIndex(parent->index(),0,parent));
159
int ContactListModel::rowCount(const QModelIndex &parent) const
161
ContactListGroupItem* parentItem;
162
if (parent.isValid()) {
163
ContactListItem* item = static_cast<ContactListItem*>(parent.internalPointer());
164
parentItem = dynamic_cast<ContactListGroupItem*>(item);
167
parentItem = contactList_->rootItem();
170
return (parentItem ? parentItem->items() : 0);
174
int ContactListModel::columnCount(const QModelIndex&) const
179
Qt::ItemFlags ContactListModel::flags(const QModelIndex& index) const
181
Qt::ItemFlags f = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
182
if (index.column() == NameColumn)
183
f = f | Qt::ItemIsEditable;
188
void ContactListModel::contactList_changed()