Akonadi

subscriptiondialog.cpp
1/*
2 SPDX-FileCopyrightText: 2007 Volker Krause <vkrause@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "subscriptiondialog.h"
8#include "ui_subscriptiondialog.h"
9
10#include "controlgui.h"
11#include "monitor.h"
12#include "recursivecollectionfilterproxymodel.h"
13#include "subscriptionjob_p.h"
14#include "subscriptionmodel_p.h"
15
16#include "akonadiwidgets_debug.h"
17#include <KSharedConfig>
18
19#include <KConfigGroup>
20#include <KLocalizedString>
21
22#include <KMessageBox>
23#include <QCheckBox>
24#include <QDialogButtonBox>
25#include <QHBoxLayout>
26#include <QHeaderView>
27#include <QLabel>
28#include <QLineEdit>
29#include <QPushButton>
30#include <QTreeView>
31#include <QVBoxLayout>
32#include <qnamespace.h>
33
34using namespace Akonadi;
35
36namespace
37{
38static const char mySubscriptionDialogGroupName[] = "SubscriptionDialog";
39}
40/**
41 * @internal
42 */
43class Akonadi::SubscriptionDialogPrivate
44{
45public:
46 explicit SubscriptionDialogPrivate(SubscriptionDialog *parent)
47 : q(parent)
48 , model(&monitor, parent)
49 {
50 ui.setupUi(q);
51
52 QObject::connect(&model, &SubscriptionModel::modelLoaded, q, [this]() {
53 filterRecursiveCollectionFilter.sort(0, Qt::AscendingOrder);
54 ui.collectionView->setEnabled(true);
55 ui.collectionView->expandAll();
56 ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
57 });
58
59 filterRecursiveCollectionFilter.setSourceModel(&model);
60 filterRecursiveCollectionFilter.setFilterCaseSensitivity(Qt::CaseInsensitive);
61 filterRecursiveCollectionFilter.setSortRole(Qt::DisplayRole);
62 filterRecursiveCollectionFilter.setSortCaseSensitivity(Qt::CaseSensitive);
63 filterRecursiveCollectionFilter.setSortLocaleAware(true);
64 filterRecursiveCollectionFilter.setExcludeUnifiedMailBox(true);
65
66 ui.collectionView->setModel(&filterRecursiveCollectionFilter);
67 ui.searchLineEdit->setFocus();
68 q->connect(ui.searchLineEdit, &QLineEdit::textChanged, q, [this](const QString &str) {
69 filterRecursiveCollectionFilter.setSearchPattern(str);
70 ui.collectionView->expandAll();
71 });
72 q->connect(ui.subscribedOnlyCheckBox, &QCheckBox::toggled, q, [this](bool state) {
73 filterRecursiveCollectionFilter.setIncludeCheckedOnly(state);
74 });
75 q->connect(ui.subscribeButton, &QPushButton::clicked, q, [this]() {
76 toggleSubscribed(Qt::Checked);
77 });
78 q->connect(ui.unsubscribeButton, &QPushButton::clicked, q, [this]() {
79 toggleSubscribed(Qt::Unchecked);
80 });
81
82 auto okButton = ui.buttonBox->button(QDialogButtonBox::Ok);
83 okButton->setEnabled(false);
84 QObject::connect(okButton, &QPushButton::clicked, q, [this]() {
85 done();
86 });
87 }
88
89 void done()
90 {
91 auto job = new SubscriptionJob(q);
92 job->subscribe(model.subscribed());
93 job->unsubscribe(model.unsubscribed());
94 QObject::connect(job, &SubscriptionJob::result, q, [this](KJob *job) {
95 if (job->error()) {
96 qCWarning(AKONADIWIDGETS_LOG) << job->errorString();
97 KMessageBox::error(q, i18n("Failed to update subscription: %1", job->errorString()), i18nc("@title:window", "Subscription Error"));
98 q->reject();
99 }
100 q->accept();
101 });
102 }
103
104 void writeConfig() const
105 {
106 KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(mySubscriptionDialogGroupName));
107 group.writeEntry("Size", q->size());
108 }
109
110 void readConfig() const
111 {
112 KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(mySubscriptionDialogGroupName));
113 const QSize sizeDialog = group.readEntry("Size", QSize(500, 400));
114 if (sizeDialog.isValid()) {
115 q->resize(sizeDialog);
116 }
117 }
118
119 void toggleSubscribed(Qt::CheckState state)
120 {
121 const QModelIndexList list = ui.collectionView->selectionModel()->selectedIndexes();
122 for (const QModelIndex &index : list) {
123 model.setData(index, state, Qt::CheckStateRole);
124 }
125 ui.collectionView->setFocus();
126 }
127
128 SubscriptionDialog *const q;
129 Ui::SubscriptionDialog ui;
130
131 Monitor monitor;
132 SubscriptionModel model;
133 RecursiveCollectionFilterProxyModel filterRecursiveCollectionFilter;
134};
135
136SubscriptionDialog::SubscriptionDialog(QWidget *parent)
137 : SubscriptionDialog({}, parent)
138{
139}
140
142 : QDialog(parent)
143 , d(new SubscriptionDialogPrivate(this))
144{
146
147 if (!mimetypes.isEmpty()) {
148 d->filterRecursiveCollectionFilter.addContentMimeTypeInclusionFilters(mimetypes);
149 }
151 d->readConfig();
152}
153
155{
156 d->writeConfig();
157}
158
160{
161 d->model.setShowHiddenCollections(showHidden);
162}
163
164#include "moc_subscriptiondialog.cpp"
static void widgetNeedsAkonadi(QWidget *widget)
Disable the given widget when Akonadi is not operational and show an error overlay (given enough spac...
Monitors an item or collection for changes.
Definition monitor.h:72
A model to filter out collections of non-matching content types.
void setExcludeUnifiedMailBox(bool exclude)
Don't show unified mailbox.
Local subscription dialog.
void showHiddenCollection(bool showHidden)
~SubscriptionDialog() override
Destroys the subscription dialog.
SubscriptionDialog(QWidget *parent=nullptr)
Creates a new subscription dialog.
int error() const
static KSharedConfig::Ptr openStateConfig(const QString &fileName=QString())
Helper integration between Akonadi and Qt.
KIOCORE_EXPORT QStringList list(const QString &fileClass)
void clicked(bool checked)
void toggled(bool checked)
virtual void accept()
void textChanged(const QString &text)
bool isEmpty() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T qobject_cast(QObject *object)
bool isValid() const const
void setFilterCaseSensitivity(Qt::CaseSensitivity cs)
void setSortLocaleAware(bool on)
virtual void setSourceModel(QAbstractItemModel *sourceModel) override
virtual void sort(int column, Qt::SortOrder order) override
void setSortCaseSensitivity(Qt::CaseSensitivity cs)
void setSortRole(int role)
CaseInsensitive
CheckState
DisplayRole
AscendingOrder
WA_DeleteOnClose
void setAttribute(Qt::WidgetAttribute attribute, bool on)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:13:38 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.