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()
39 void MonitorsModel::init()
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);
52 qCWarning(AKONADICONSOLE_LOG
) << "Failed to connect to org.freedesktop.Akonadi.NotificationManager";
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
)) {
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
);
79 void MonitorsModel::slotSubscriberUnsubscribed(const QDBusObjectPath
&identifier
)
81 if (!mData
.contains(identifier
)) {
85 const int row
= mData
.uniqueKeys().indexOf(identifier
);
86 beginRemoveRows(QModelIndex(), row
, row
);
87 mData
.take(identifier
)->deleteLater();
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
) {
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");
117 QVariant
MonitorsModel::data(const QModelIndex
&index
, int role
) const
119 if (role
!= Qt::DisplayRole
) {
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
;
137 int MonitorsModel::columnCount(const QModelIndex
&parent
) const
143 int MonitorsModel::rowCount(const QModelIndex
&parent
) const
145 if (parent
.isValid()) {
149 return mData
.count();
152 QModelIndex
MonitorsModel::parent(const QModelIndex
&child
) const
156 return QModelIndex();
159 QModelIndex
MonitorsModel::index(int row
, int column
, const QModelIndex
&parent
) const
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());