Astyle kdelibs
[kdepim.git] / akonadiconsole / monitorsmodel.cpp
blob3ba89da9fa2d05efc02c3de0396106854831bb75
1 /*
2 * Copyright (C) 2013 Daniel Vrátil <dvratil@redhat.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "monitorsmodel.h"
21 #include "monitoritem.h"
22 #include "akonadiconsole_debug.h"
23 #include <AkonadiCore/servermanager.h>
25 #include <QtDBus/QDBusConnection>
27 MonitorsModel::MonitorsModel(QObject *parent):
28 QAbstractItemModel(parent), mManager(Q_NULLPTR)
30 QTimer::singleShot(0, this, &MonitorsModel::init);
33 MonitorsModel::~MonitorsModel()
35 qDeleteAll(mData);
36 mData.clear();
39 void MonitorsModel::init()
41 qDeleteAll(mData);
42 mData.clear();
44 QString service = QStringLiteral("org.freedesktop.Akonadi");
45 if (Akonadi::ServerManager::hasInstanceIdentifier()) {
46 service += QStringLiteral(".") + Akonadi::ServerManager::instanceIdentifier();
49 mManager = new org::freedesktop::Akonadi::NotificationManager(service,
50 QStringLiteral("/notifications"), QDBusConnection::sessionBus(), this);
51 if (!mManager) {
52 qCWarning(AKONADICONSOLE_LOG) << "Failed to connect to org.freedesktop.Akonadi.NotificationManager";
53 return;
56 const QList<QDBusObjectPath> subscribers = mManager->subscribers();
57 Q_FOREACH (const QDBusObjectPath &subscriber, subscribers) {
58 slotSubscriberSubscribed(subscriber);
61 connect(mManager, &org::freedesktop::Akonadi::NotificationManager::subscribed, this, &MonitorsModel::slotSubscriberSubscribed);
62 connect(mManager, &org::freedesktop::Akonadi::NotificationManager::unsubscribed, this, &MonitorsModel::slotSubscriberUnsubscribed);
65 void MonitorsModel::slotSubscriberSubscribed(const QDBusObjectPath &identifier)
67 // Avoid akonadiconsole's Monitors being duplicated on startup
68 if (mData.contains(identifier)) {
69 return;
72 MonitorItem *item = new MonitorItem(identifier, this);
73 connect(item, &MonitorItem::changed, this, &MonitorsModel::slotItemChanged);
74 beginInsertRows(QModelIndex(), mData.count(), mData.count());
75 mData.insert(identifier, item);
76 endInsertRows();
79 void MonitorsModel::slotSubscriberUnsubscribed(const QDBusObjectPath &identifier)
81 if (!mData.contains(identifier)) {
82 return;
85 const int row = mData.uniqueKeys().indexOf(identifier);
86 beginRemoveRows(QModelIndex(), row, row);
87 mData.take(identifier)->deleteLater();
88 endRemoveRows();
91 void MonitorsModel::slotItemChanged(MonitorsModel::Column column)
93 MonitorItem *item = qobject_cast<MonitorItem *>(sender());
94 const QModelIndex idx = index(mData.uniqueKeys().indexOf(item->identifier), static_cast<int>(column));
95 Q_EMIT dataChanged(idx, idx);
98 QVariant MonitorsModel::headerData(int section, Qt::Orientation orientation, int role) const
100 if (role == Qt::DisplayRole) {
101 if (orientation == Qt::Horizontal) {
102 switch (section) {
103 case 0: return QStringLiteral("Subscriber");
104 case 1: return QStringLiteral("All Monitored");
105 case 2: return QStringLiteral("Monitored Collections");
106 case 3: return QStringLiteral("Monitored Items");
107 case 4: return QStringLiteral("Monitored Resources");
108 case 5: return QStringLiteral("Monitored Mime Types");
109 case 6: return QStringLiteral("Ignored Sessions");
114 return QVariant();
117 QVariant MonitorsModel::data(const QModelIndex &index, int role) const
119 if (role != Qt::DisplayRole) {
120 return QVariant();
123 MonitorItem *item = static_cast<MonitorItem *>(index.internalPointer());
124 switch (index.column()) {
125 case IdentifierColumn: return item->identifier.path();
126 case IsAllMonitoredColumn: return item->allMonitored;
127 case MonitoredCollectionsColumn: return item->monitoredCollections;
128 case MonitoredItemsColumn: return item->monitoredItems;
129 case MonitoredResourcesColumn: return item->monitoredResources;
130 case MonitoredMimeTypesColumn: return item->monitoredMimeTypes;
131 case IgnoredSessionsColumn: return item->ignoredSessions;
134 return QVariant();
137 int MonitorsModel::columnCount(const QModelIndex &parent) const
139 Q_UNUSED(parent);
140 return ColumnsCount;
143 int MonitorsModel::rowCount(const QModelIndex &parent) const
145 if (parent.isValid()) {
146 return 0;
149 return mData.count();
152 QModelIndex MonitorsModel::parent(const QModelIndex &child) const
154 Q_UNUSED(child);
156 return QModelIndex();
159 QModelIndex MonitorsModel::index(int row, int column, const QModelIndex &parent) const
161 Q_UNUSED(parent);
162 if (row >= mData.uniqueKeys().count()) {
163 return QModelIndex();
166 auto iter = mData.cbegin() + row;
167 if (iter == mData.cend()) {
168 return QModelIndex();
170 return createIndex(row, column, iter.value());