source: SMSSender/src/ui/models/contactgroupmodel.cpp @ 67:578192d6fe64

3.0
Last change on this file since 67:578192d6fe64 was 67:578192d6fe64, checked in by Sämy Zehnder <saemy.zehnder@…>, 12 years ago
  • added synchttp
  • backup before removing these diamond interfaces...
File size: 6.9 KB
Line 
1#include "contactgroupmodel.h"
2
3#include <QImage>
4#include <QPixmap>
5#include <QDebug>
6
7ContactGroupListModel::ContactGroupListModel(QObject* parent)
8    : QAbstractListModel(parent)
9{
10    connect(BCContactManager::instance(), SIGNAL(contactAdded(IContact*)),
11            this, SLOT(listAltered()));
12    connect(BCContactManager::instance(), SIGNAL(contactUpdated(IContact*)),
13            this, SLOT(dataUpdated(IContact*)));
14    connect(BCContactManager::instance(), SIGNAL(contactRemoved(IContact*)),
15            this, SLOT(listAltered()));
16
17    connect(BCGroupManager::instance(), SIGNAL(groupAdded(IGroup*)),
18            this, SLOT(listAltered()));
19    connect(BCGroupManager::instance(), SIGNAL(groupUpdated(IGroup*)),
20            this, SLOT(dataUpdated(IGroup*)));
21    connect(BCGroupManager::instance(), SIGNAL(groupRemoved(IGroup*)),
22            this, SLOT(listAltered()));
23
24    reloadList();
25}
26ContactGroupListModel::~ContactGroupListModel() {
27    disconnect(BCContactManager::instance(), SIGNAL(contactAdded(IContact*)),
28               this, SLOT(listAltered()));
29    disconnect(BCContactManager::instance(), SIGNAL(contactUpdated(IContact*)),
30               this, SLOT(dataUpdated(IContact*)));
31    disconnect(BCContactManager::instance(), SIGNAL(contactRemoved(IContact*)),
32               this, SLOT(listAltered()));
33
34    disconnect(BCGroupManager::instance(), SIGNAL(groupAdded(IGroup*)),
35               this, SLOT(listAltered()));
36    disconnect(BCGroupManager::instance(), SIGNAL(groupUpdated(IGroup*)),
37               this, SLOT(dataUpdated(IGroup*)));
38    disconnect(BCGroupManager::instance(), SIGNAL(groupRemoved(IGroup*)),
39               this, SLOT(listAltered()));
40}
41
42void ContactGroupListModel::listAltered() {
43    reloadList();
44}
45
46void ContactGroupListModel::dataUpdated(IContact* contact) {
47    dataUpdated(static_cast<IInterface*>(contact));
48}
49void ContactGroupListModel::dataUpdated(IGroup* group) {
50    dataUpdated(static_cast<IInterface*>(group));
51}
52void ContactGroupListModel::dataUpdated(IInterface* contactOrGroup) {
53    int row = items_.indexOf(contactOrGroup);
54
55    QModelIndex idx1 = index(row, 0);
56    QModelIndex idx2 = index(row, columnCount());
57
58    if (idx1.isValid() && idx2.isValid()) { // Contact/group in list
59        emit dataChanged(idx1, idx2);
60    }
61}
62
63void ContactGroupListModel::reloadList() {
64    items_.clear();
65    foreach(IContact* contact, BCContactManager::instance()->getContactList()) {
66        items_.append(contact);
67    }
68    foreach(IGroup* group, BCGroupManager::instance()->getGroupList()) {
69        items_.append(group);
70    }
71
72    reset();
73}
74
75void ContactGroupListModel::addFilteredContact(IContact* contact) {
76    filteredItems_.insert(contact);
77    items_.removeAll(contact);
78
79    /* Filter groups, from whose all contacts are filtered */
80    foreach (IGroup* group, groups()) {
81        bool hasUnfilteredContacts = false;
82        foreach (IContact* contact, group->contacts()) {
83            if (items_.contains(contact)) {
84                hasUnfilteredContacts = true;
85                break;
86            }
87        }
88        if (!hasUnfilteredContacts) {
89            /* Add filtered Group */
90            filteredItems_.insert(group);
91            items_.removeAll(group);
92        }
93    }
94
95    reset();
96}
97void ContactGroupListModel::removeFilteredContact(IContact* contact) {
98    items_.append(contact);
99    filteredItems_.remove(contact);
100
101    /* Remove filter from groups, when all its contacts are unfiltered */
102    foreach (IGroup* group, filteredGroups()) {
103        bool hasFilteredContacts = false;
104        foreach (IContact* contact, group->contacts()) {
105            if (filteredItems_.contains(contact)) {
106                hasFilteredContacts = true;
107                break;
108            }
109        }
110        if (!hasFilteredContacts) {
111            /* Remove filtered group */
112            items_.append(group);
113            filteredItems_.remove(group);
114        }
115    }
116
117    reset();
118}
119
120IInterface* ContactGroupListModel::dataObject(const QModelIndex& index) const {
121    return items_.at(index.row());
122}
123
124QVariant ContactGroupListModel::data(const QModelIndex& index, int role) const {
125    if (!index.isValid() || index.row() < 0 || index.row() >= items_.size())
126        return QVariant();
127
128    IInterface* contactOrGroup = items_.at(index.row());
129    IContact*   contact        = dynamic_cast<IContact*>(contactOrGroup);
130    IGroup*     group          = dynamic_cast<IGroup*>(contactOrGroup);
131
132    switch (role) {
133    case Qt::DisplayRole:
134        if (contact != NULL) {
135            QString contactStr = contact->name();
136            QString aliasStr   = "";
137            foreach(QString alias, contact->aliases()) {
138                aliasStr += alias + ", ";
139            }
140            aliasStr.remove(QRegExp(", $"));
141            if (aliasStr != "") {
142                contactStr += " (" + aliasStr + ")";
143            }
144            return contactStr;
145        }
146        if (group != NULL) {
147            return "<" + group->name() + ">";
148        }
149        break;
150
151    case Qt::EditRole:
152        if (contact != NULL)
153            return contact->name();
154        if (group != NULL)
155            return group->name();
156        break;
157
158    case Qt::DecorationRole:
159        QImage img;
160        if (contact != NULL) {
161            img = contact->image();
162        }
163        if (group != NULL) {
164            img = group->image();
165        }
166        return QPixmap::fromImage(img.scaled(32, 32, Qt::KeepAspectRatio));
167    }
168
169/*    if (role == Qt::TextAlignmentRole) {
170        switch (index.column()) {
171            case COL_NAME:
172            case COL_GATEWAY_NAME:
173                return Qt::AlignLeft + Qt::AlignVCenter;
174            case COL_ENABLED:
175                return Qt::AlignCenter + Qt::AlignVCenter;
176        }
177    }*/
178
179    return QVariant();
180}
181
182QSet<IGroup*> ContactGroupListModel::groups() const {
183    QSet<IGroup*> result;
184    foreach (IInterface* i, items_) {
185        IGroup* g = dynamic_cast<IGroup*>(i);
186        if (g != NULL)
187            result.insert(g);
188    }
189    return result;
190}
191QSet<IContact*> ContactGroupListModel::contacts() const {
192    QSet<IContact*> result;
193    foreach (IInterface* i, items_) {
194        IContact* c = dynamic_cast<IContact*>(i);
195        if (c != NULL)
196            result.insert(c);
197    }
198    return result;
199}
200QSet<IGroup*> ContactGroupListModel::filteredGroups() const {
201    QSet<IGroup*> result;
202    foreach (IInterface* i, filteredItems_) {
203        IGroup* g = dynamic_cast<IGroup*>(i);
204        if (g != NULL)
205            result.insert(g);
206    }
207    return result;
208}
209QSet<IContact*> ContactGroupListModel::filteredContacts() const {
210    QSet<IContact*> result;
211    foreach (IInterface* i, filteredItems_) {
212        IContact* c = dynamic_cast<IContact*>(i);
213        if (c != NULL)
214            result.insert(c);
215    }
216    return result;
217}
218
219
220int ContactGroupListModel::columnCount(const QModelIndex& parent) const {
221    return (parent.isValid()) ? 0 : 1;
222}
223
224int ContactGroupListModel::rowCount(const QModelIndex& parent) const {
225    return (parent.isValid()) ? 0 : items_.count();
226}
Note: See TracBrowser for help on using the repository browser.