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"