File indexing completed on 2024-05-12 05:12:47
0001 /* 0002 * SPDX-FileCopyrightText: 2013 Daniel Vrátil <dvratil@redhat.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 * 0006 */ 0007 0008 #include "monitorswidget.h" 0009 #include "monitorsmodel.h" 0010 #include "utils.h" 0011 0012 #include <QHBoxLayout> 0013 #include <QSortFilterProxyModel> 0014 #include <QStandardItemModel> 0015 #include <qheaderview.h> 0016 0017 #include <Akonadi/CollectionFetchScope> 0018 #include <Akonadi/ControlGui> 0019 #include <Akonadi/ItemFetchScope> 0020 #include <Akonadi/NotificationSubscriber> 0021 #include <Akonadi/TagFetchScope> 0022 0023 #include <KConfigGroup> 0024 #include <KLocalizedString> 0025 #include <KSharedConfig> 0026 0027 Q_DECLARE_METATYPE(Akonadi::NotificationSubscriber) 0028 0029 MonitorsWidget::MonitorsWidget(QWidget *parent) 0030 : QWidget(parent) 0031 , mModel(new MonitorsModel(this)) 0032 { 0033 auto layout = new QHBoxLayout(this); 0034 0035 mTreeView = new QTreeView(this); 0036 auto mProxyModel = new QSortFilterProxyModel(this); 0037 mProxyModel->setDynamicSortFilter(true); 0038 mProxyModel->sort(0); 0039 mProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); 0040 mProxyModel->setSourceModel(mModel); 0041 mTreeView->setModel(mProxyModel); 0042 mTreeView->setAlternatingRowColors(true); 0043 mTreeView->setRootIsDecorated(true); 0044 connect(mTreeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MonitorsWidget::onSubscriberSelected); 0045 layout->addWidget(mTreeView); 0046 0047 mSubscriberView = new QTreeView(this); 0048 mSubscriberView->setEditTriggers(QAbstractItemView::NoEditTriggers); 0049 mSubscriberView->setModel(new QStandardItemModel(this)); 0050 layout->addWidget(mSubscriberView); 0051 0052 onSubscriberSelected({}); 0053 0054 Akonadi::ControlGui::widgetNeedsAkonadi(this); 0055 0056 KConfigGroup config(KSharedConfig::openConfig(), QStringLiteral("MonitorsWidget")); 0057 0058 mTreeView->header()->restoreState(config.readEntry<QByteArray>("state", QByteArray())); 0059 mSubscriberView->header()->restoreState(config.readEntry<QByteArray>("subscriberViewState", QByteArray())); 0060 } 0061 0062 MonitorsWidget::~MonitorsWidget() 0063 { 0064 KConfigGroup config(KSharedConfig::openConfig(), QStringLiteral("MonitorsWidget")); 0065 config.writeEntry("state", mTreeView->header()->saveState()); 0066 config.writeEntry("subscriberViewState", mSubscriberView->header()->saveState()); 0067 } 0068 0069 // Specialization of function template from utils.h 0070 template<> 0071 QString toString(const QSet<Akonadi::Monitor::Type> &set) 0072 { 0073 QStringList rv; 0074 for (const auto &v : set) { 0075 switch (v) { 0076 case Akonadi::Monitor::Items: 0077 rv << i18n("Items"); 0078 break; 0079 case Akonadi::Monitor::Collections: 0080 rv << i18n("Collections"); 0081 break; 0082 case Akonadi::Monitor::Tags: 0083 rv << i18n("Tags"); 0084 break; 0085 case Akonadi::Monitor::Relations: 0086 rv << i18n("Relations"); 0087 break; 0088 case Akonadi::Monitor::Subscribers: 0089 rv << i18n("Subscribers"); 0090 break; 0091 case Akonadi::Monitor::Notifications: 0092 rv << i18n("Notification"); 0093 break; 0094 } 0095 } 0096 return rv.join(QLatin1StringView(", ")); 0097 } 0098 0099 void MonitorsWidget::populateCollectionFetchScope(QStandardItem *parent, const Akonadi::CollectionFetchScope &cfs) 0100 { 0101 appendRow(parent, i18n("List Filter"), toString(cfs.listFilter())); 0102 appendRow(parent, i18n("Include Statistics"), toString(cfs.includeStatistics())); 0103 appendRow(parent, i18n("Resource"), cfs.resource()); 0104 appendRow(parent, i18n("Content MimeTypes"), toString(static_cast<QList<QString>>(cfs.contentMimeTypes()))); 0105 appendRow(parent, i18n("Ancestor Retrieval"), toString(cfs.ancestorRetrieval())); 0106 0107 const auto ancestorFs = cfs.ancestorFetchScope(); 0108 if (!ancestorFs.isEmpty()) { 0109 auto ancestorItem = new QStandardItem(i18n("Ancestor Fetch Scope")); 0110 populateCollectionFetchScope(ancestorItem, cfs.ancestorFetchScope()); 0111 parent->appendRow(ancestorItem); 0112 } 0113 0114 appendRow(parent, i18n("Attributes"), toString(cfs.attributes())); 0115 appendRow(parent, i18n("Fetch ID Only"), toString(cfs.fetchIdOnly())); 0116 appendRow(parent, i18n("Ignore Retrieval Error"), toString(cfs.ignoreRetrievalErrors())); 0117 } 0118 0119 void MonitorsWidget::populateTagFetchScope(QStandardItem *parent, const Akonadi::TagFetchScope &tfs) 0120 { 0121 appendRow(parent, i18n("Attributes"), toString(tfs.attributes())); 0122 appendRow(parent, i18n("Fetch ID Only"), toString(tfs.fetchIdOnly())); 0123 } 0124 0125 void MonitorsWidget::onSubscriberSelected(const QModelIndex &index) 0126 { 0127 auto model = qobject_cast<QStandardItemModel *>(mSubscriberView->model()); 0128 const auto state = mSubscriberView->header()->saveState(); 0129 model->clear(); 0130 model->setHorizontalHeaderLabels({i18n("Properties"), i18n("Values")}); 0131 mSubscriberView->header()->restoreState(state); 0132 0133 const auto subscriber = index.data(MonitorsModel::SubscriberRole).value<Akonadi::NotificationSubscriber>(); 0134 if (!subscriber.isValid()) { 0135 return; 0136 } 0137 0138 appendRow(model, i18n("Subscriber"), QString::fromUtf8(subscriber.subscriber())); 0139 appendRow(model, i18n("Session ID"), QString::fromUtf8(subscriber.sessionId())); 0140 appendRow(model, i18n("Monitored Collections:"), toString(subscriber.monitoredCollections())); 0141 appendRow(model, i18n("Monitored Items:"), toString(subscriber.monitoredItems())); 0142 appendRow(model, i18n("Monitored Tags:"), toString(subscriber.monitoredTags())); 0143 appendRow(model, i18n("Monitored Types:"), toString(subscriber.monitoredTypes())); 0144 appendRow(model, i18n("Monitored Mime Types:"), toString(subscriber.monitoredMimeTypes())); 0145 appendRow(model, i18n("Monitored Resources:"), toString(subscriber.monitoredResources())); 0146 appendRow(model, i18n("Ignored Sessions:"), toString(subscriber.ignoredSessions())); 0147 appendRow(model, i18n("All Monitored:"), toString(subscriber.isAllMonitored())); 0148 appendRow(model, i18n("Is Exclusive:"), toString(subscriber.isExclusive())); 0149 0150 auto ifsItem = new QStandardItem(i18n("Item Fetch Scope")); 0151 const auto ifs = subscriber.itemFetchScope(); 0152 appendRow(ifsItem, i18n("Payload Parts"), toString(ifs.payloadParts())); 0153 appendRow(ifsItem, i18n("Full Payload"), toString(ifs.fullPayload())); 0154 appendRow(ifsItem, i18n("Attributes"), toString(ifs.attributes())); 0155 appendRow(ifsItem, i18n("All Attributes"), toString(ifs.allAttributes())); 0156 appendRow(ifsItem, i18n("Cache only"), toString(ifs.cacheOnly())); 0157 appendRow(ifsItem, i18n("Check for Cached Payloads Parts Only"), toString(ifs.checkForCachedPayloadPartsOnly())); 0158 appendRow(ifsItem, i18n("Ancestor Retrieval"), toString(ifs.ancestorRetrieval())); 0159 appendRow(ifsItem, i18n("Fetch mtime"), toString(ifs.fetchModificationTime())); 0160 appendRow(ifsItem, i18n("Fetch GID"), toString(ifs.fetchGid())); 0161 appendRow(ifsItem, i18n("Ignore Retrieval Errors"), toString(ifs.ignoreRetrievalErrors())); 0162 appendRow(ifsItem, i18n("Fetch Change Since"), toString(ifs.fetchChangedSince())); 0163 appendRow(ifsItem, i18n("Fetch RID"), toString(ifs.fetchRemoteIdentification())); 0164 appendRow(ifsItem, i18n("Fetch Tags"), toString(ifs.fetchTags())); 0165 0166 const auto cfs = subscriber.collectionFetchScope(); 0167 auto cfsItem = new QStandardItem(i18n("Collection Fetch Scope")); 0168 populateCollectionFetchScope(cfsItem, cfs); 0169 0170 auto tagScope = new QStandardItem(i18n("Tag Fetch Scope")); 0171 populateTagFetchScope(tagScope, subscriber.tagFetchScope()); 0172 model->appendRow(tagScope); 0173 0174 mSubscriberView->expandAll(); 0175 } 0176 0177 #include "moc_monitorswidget.cpp"