Akonadi

manageaccountwidget.cpp
1/*
2 SPDX-FileCopyrightText: 2014-2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "manageaccountwidget.h"
8
9#include "agentconfigurationdialog.h"
10#include "agentfilterproxymodel.h"
11#include "agentinstance.h"
12#include "agentinstancecreatejob.h"
13#include "agentinstancefilterproxymodel.h"
14#include "agentmanager.h"
15#include "agenttypedialog.h"
16
17#include "ui_manageaccountwidget.h"
18
19#include <KLocalizedString>
20#include <KMessageBox>
21#include <QAbstractItemDelegate>
22#include <QAbstractItemView>
23#include <QKeyEvent>
24#include <QPointer>
25
26using namespace Akonadi;
27
28class Akonadi::ManageAccountWidgetPrivate
29{
30public:
31 QString mSpecialCollectionIdentifier;
32
33 QStringList mMimeTypeFilter;
34 QStringList mCapabilityFilter;
35 QStringList mExcludeCapabilities;
36
37 Ui::ManageAccountWidget ui;
38};
39
40ManageAccountWidget::ManageAccountWidget(QWidget *parent)
41 : QWidget(parent)
42 , d(new Akonadi::ManageAccountWidgetPrivate)
43{
44 d->ui.setupUi(this);
45 connect(d->ui.mAddAccountButton, &QPushButton::clicked, this, &ManageAccountWidget::slotAddAccount);
46
47 connect(d->ui.mModifyAccountButton, &QPushButton::clicked, this, &ManageAccountWidget::slotModifySelectedAccount);
48
49 connect(d->ui.mRemoveAccountButton, &QPushButton::clicked, this, &ManageAccountWidget::slotRemoveSelectedAccount);
50 connect(d->ui.mRestartAccountButton, &QPushButton::clicked, this, &ManageAccountWidget::slotRestartSelectedAccount);
51
52 connect(d->ui.mAccountList, &Akonadi::AgentInstanceWidget::clicked, this, &ManageAccountWidget::slotAccountSelected);
53 connect(d->ui.mAccountList, &Akonadi::AgentInstanceWidget::doubleClicked, this, &ManageAccountWidget::slotModifySelectedAccount);
54
55 d->ui.mAccountList->view()->setSelectionMode(QAbstractItemView::SingleSelection);
56
57 connect(d->ui.mFilterAccount, &QLineEdit::textChanged, this, &ManageAccountWidget::slotSearchAgentType);
58
59 d->ui.mFilterAccount->installEventFilter(this);
60 d->ui.accountOnCurrentActivity->setVisible(false);
61 slotAccountSelected(d->ui.mAccountList->currentAgentInstance());
62}
63
64ManageAccountWidget::~ManageAccountWidget() = default;
65
66void ManageAccountWidget::slotSearchAgentType(const QString &str)
67{
68 d->ui.mAccountList->agentInstanceFilterProxyModel()->setFilterRegularExpression(str);
69}
70
71void ManageAccountWidget::disconnectAddAccountButton()
72{
73 disconnect(d->ui.mAddAccountButton, &QPushButton::clicked, this, &ManageAccountWidget::slotAddAccount);
74}
75
76bool ManageAccountWidget::enablePlasmaActivities() const
77{
78 return d->ui.mAccountList->enablePlasmaActivities();
79}
80
81void ManageAccountWidget::setEnablePlasmaActivities(bool newEnablePlasmaActivities)
82{
83 d->ui.accountOnCurrentActivity->setVisible(newEnablePlasmaActivities);
84 d->ui.mAccountList->setEnablePlasmaActivities(newEnablePlasmaActivities);
85}
86
87AccountActivitiesAbstract *ManageAccountWidget::accountActivitiesAbstract() const
88{
89 return d->ui.mAccountList->accountActivitiesAbstract();
90}
91
92void ManageAccountWidget::setAccountActivitiesAbstract(AccountActivitiesAbstract *abstract)
93{
94 d->ui.mAccountList->setAccountActivitiesAbstract(abstract);
95}
96
97QPushButton *ManageAccountWidget::addAccountButton() const
98{
99 return d->ui.mAddAccountButton;
100}
101
102void ManageAccountWidget::setDescriptionLabelText(const QString &text)
103{
104 d->ui.label->setText(text);
105}
106
107bool ManageAccountWidget::eventFilter(QObject *obj, QEvent *event)
108{
109 if (event->type() == QEvent::KeyPress && obj == d->ui.mFilterAccount) {
110 auto key = static_cast<QKeyEvent *>(event);
111 if ((key->key() == Qt::Key_Enter) || (key->key() == Qt::Key_Return)) {
112 event->accept();
113 return true;
114 }
115 }
116 return QWidget::eventFilter(obj, event);
117}
118
119QAbstractItemView *ManageAccountWidget::view() const
120{
121 return d->ui.mAccountList->view();
122}
123
124void ManageAccountWidget::setSpecialCollectionIdentifier(const QString &identifier)
125{
126 d->mSpecialCollectionIdentifier = identifier;
127}
128
129void ManageAccountWidget::slotAddAccount()
130{
131 Akonadi::AgentTypeDialog dlg(this);
132
133 Akonadi::AgentFilterProxyModel *filter = dlg.agentFilterProxyModel();
134 for (const QString &filterStr : std::as_const(d->mMimeTypeFilter)) {
135 filter->addMimeTypeFilter(filterStr);
136 }
137 for (const QString &capa : std::as_const(d->mCapabilityFilter)) {
138 filter->addCapabilityFilter(capa);
139 }
140 for (const QString &capa : std::as_const(d->mExcludeCapabilities)) {
141 filter->excludeCapabilities(capa);
142 }
143 if (dlg.exec()) {
144 const Akonadi::AgentType agentType = dlg.agentType();
145
146 if (agentType.isValid()) {
147 auto job = new Akonadi::AgentInstanceCreateJob(agentType, this);
148 connect(job, &KJob::result, this, [this, job](KJob *) {
149 if (job->error()) {
150 return;
151 }
152
153 auto configureDialog = new Akonadi::AgentConfigurationDialog(job->instance(), this);
154 configureDialog->setAttribute(Qt::WA_DeleteOnClose);
155 connect(configureDialog, &QDialog::rejected, this, [instance = job->instance()] {
156 Akonadi::AgentManager::self()->removeInstance(instance);
157 });
158 configureDialog->show();
159 });
160 job->start();
161 }
162 }
163}
164
165QStringList ManageAccountWidget::excludeCapabilities() const
166{
167 return d->mExcludeCapabilities;
168}
169
170void ManageAccountWidget::setExcludeCapabilities(const QStringList &excludeCapabilities)
171{
172 d->mExcludeCapabilities = excludeCapabilities;
173 for (const QString &capability : std::as_const(d->mExcludeCapabilities)) {
174 d->ui.mAccountList->agentInstanceFilterProxyModel()->excludeCapabilities(capability);
175 }
176}
177
178void ManageAccountWidget::setItemDelegate(QAbstractItemDelegate *delegate)
179{
180 d->ui.mAccountList->view()->setItemDelegate(delegate);
181}
182
183QStringList ManageAccountWidget::capabilityFilter() const
184{
185 return d->mCapabilityFilter;
186}
187
188void ManageAccountWidget::setCapabilityFilter(const QStringList &capabilityFilter)
189{
190 d->mCapabilityFilter = capabilityFilter;
191 for (const QString &capability : std::as_const(d->mCapabilityFilter)) {
192 d->ui.mAccountList->agentInstanceFilterProxyModel()->addCapabilityFilter(capability);
193 }
194}
195
196QStringList ManageAccountWidget::mimeTypeFilter() const
197{
198 return d->mMimeTypeFilter;
199}
200
201void ManageAccountWidget::setMimeTypeFilter(const QStringList &mimeTypeFilter)
202{
203 d->mMimeTypeFilter = mimeTypeFilter;
204 for (const QString &mimeType : std::as_const(d->mMimeTypeFilter)) {
205 d->ui.mAccountList->agentInstanceFilterProxyModel()->addMimeTypeFilter(mimeType);
206 }
207}
208
209void ManageAccountWidget::slotModifySelectedAccount()
210{
211 Akonadi::AgentInstance instance = d->ui.mAccountList->currentAgentInstance();
212 if (instance.isValid()) {
213 QPointer<AgentConfigurationDialog> dlg(new AgentConfigurationDialog(instance, this));
214 dlg->exec();
215 delete dlg;
216 }
217}
218
219void ManageAccountWidget::slotRestartSelectedAccount()
220{
221 const Akonadi::AgentInstance instance = d->ui.mAccountList->currentAgentInstance();
222 if (instance.isValid()) {
223 instance.restart();
224 }
225}
226
227void ManageAccountWidget::slotRemoveSelectedAccount()
228{
229 const Akonadi::AgentInstance instance = d->ui.mAccountList->currentAgentInstance();
230
231 const int rc = KMessageBox::questionTwoActions(this,
232 i18n("Do you want to remove account '%1'?", instance.name()),
233 i18nc("@title:window", "Remove account?"),
236 if (rc == KMessageBox::ButtonCode::SecondaryAction) {
237 return;
238 }
239
240 if (instance.isValid()) {
242 }
243
244 slotAccountSelected(d->ui.mAccountList->currentAgentInstance());
245}
246
247void ManageAccountWidget::slotAccountSelected(const Akonadi::AgentInstance &current)
248{
249 if (current.isValid()) {
250 d->ui.mModifyAccountButton->setEnabled(!current.type().capabilities().contains(QLatin1StringView("NoConfig")));
251 d->ui.mRemoveAccountButton->setEnabled(d->mSpecialCollectionIdentifier != current.identifier());
252 // Restarting an agent is not possible if it's in Running status... (see AgentProcessInstance::restartWhenIdle)
253 d->ui.mRestartAccountButton->setEnabled((current.status() != 1));
254 } else {
255 d->ui.mModifyAccountButton->setEnabled(false);
256 d->ui.mRemoveAccountButton->setEnabled(false);
257 d->ui.mRestartAccountButton->setEnabled(false);
258 }
259}
260
261#include "moc_manageaccountwidget.cpp"
void doubleClicked(const Akonadi::AgentInstance &current)
This signal is emitted whenever there is a double click on an agent instance.
void clicked(const Akonadi::AgentInstance &current)
This signal is emitted whenever there is a click on an agent instance.
void restart() const
Restart the agent process.
AgentType type() const
Returns the agent type of this instance.
static AgentManager * self()
Returns the global instance of the agent manager.
void removeInstance(const AgentInstance &instance)
Removes the given agent instance.
bool isValid() const
Returns whether the agent type is valid.
QStringList capabilities() const
Returns the list of supported capabilities of the agent type.
void result(KJob *job)
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
Helper integration between Akonadi and Qt.
ButtonCode questionTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Notify)
KGuiItem remove()
KGuiItem cancel()
void clicked(bool checked)
void rejected()
void textChanged(const QString &text)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool disconnect(const QMetaObject::Connection &connection)
virtual bool event(QEvent *e)
virtual bool eventFilter(QObject *watched, QEvent *event)
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
Key_Enter
WA_DeleteOnClose
QFuture< void > filter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&filterFunction)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
void setupUi(QWidget *widget)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Mar 28 2025 11:53:22 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.