Libksieve

multiimapvacationdialog.cpp
1/*
2 SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "multiimapvacationdialog.h"
8#include "vacationpagewidget.h"
9#include <KSieveCore/MultiImapVacationManager>
10#include <KSieveCore/SearchServerWithVacationSupportJob>
11
12#include <KLocalizedString>
13#include <KMessageBox>
14#include <KSharedConfig>
15#include <QTabWidget>
16
17#include <KConfigGroup>
18#include <KWindowConfig>
19#include <QDialogButtonBox>
20#include <QLabel>
21#include <QPushButton>
22#include <QStackedWidget>
23#include <QTabBar>
24#include <QVBoxLayout>
25#include <QWindow>
26
27using namespace KSieveUi;
28namespace
29{
30static const char myMultiImapVacationDialogGroupName[] = "MultiImapVacationDialog";
31}
32class KSieveUi::MultiImapVacationDialogPrivate
33{
34public:
35 MultiImapVacationDialogPrivate() = default;
36
38 QTabWidget *mTabWidget = nullptr;
39 QStackedWidget *mStackedWidget = nullptr;
40 KSieveCore::MultiImapVacationManager *mVacationManager = nullptr;
41};
42
43MultiImapVacationDialog::MultiImapVacationDialog(KSieveCore::MultiImapVacationManager *manager, QWidget *parent)
44 : QDialog(parent)
45 , d(new KSieveUi::MultiImapVacationDialogPrivate)
46{
47 d->mVacationManager = manager;
48
49 setWindowTitle(i18nc("@title:window", "Configure \"Out of Office\" Replies"));
50 init();
51 readConfig();
52}
53
54MultiImapVacationDialog::~MultiImapVacationDialog()
55{
56 writeConfig();
57}
58
59void MultiImapVacationDialog::switchToServerNamePage(const QString &serverName)
60{
61 const int nbTab(d->mTabWidget->count());
62 for (int i = 0; i < nbTab; ++i) {
63 if (d->mTabWidget->tabText(i) == serverName) {
64 d->mTabWidget->setCurrentIndex(i);
65 break;
66 }
67 }
68}
69
70void MultiImapVacationDialog::reject()
71{
72 bool canCloseDialog = true;
73 for (int i = 0; i < d->mTabWidget->count(); ++i) {
74 auto vacationPage = qobject_cast<VacationPageWidget *>(d->mTabWidget->widget(i));
75 if (vacationPage) {
76 if (vacationPage->wasChanged()) {
77 const int answer = KMessageBox::questionTwoActions(this,
78 i18nc("@info", "Do you really want to cancel?"),
79 i18nc("@title:window", "Confirmation"),
80 KGuiItem(i18nc("@action:button", "Cancel Editing"), QStringLiteral("dialog-ok")),
81 KGuiItem(i18nc("@action:button", "Do Not Cancel"), QStringLiteral("dialog-cancel")));
82 if (answer == KMessageBox::ButtonCode::PrimaryAction) {
83 QDialog::reject(); // Discard current changes
84 }
85 canCloseDialog = false;
86 break;
87 }
88 }
89 }
90 if (canCloseDialog) {
92 }
93}
94
95QList<KSieveCore::VacationCreateScriptJob *> MultiImapVacationDialog::listCreateJob() const
96{
97 return d->mListCreateJob;
98}
99
100void MultiImapVacationDialog::init()
101{
102 d->mStackedWidget = new QStackedWidget;
103 auto mainLayout = new QVBoxLayout(this);
104 mainLayout->addWidget(d->mStackedWidget);
105 d->mTabWidget = new QTabWidget;
106 d->mStackedWidget->addWidget(d->mTabWidget);
107
108 auto w = new QWidget;
109 auto vbox = new QVBoxLayout;
110 w->setLayout(vbox);
111 auto lab =
112 new QLabel(i18n("KMail's Out of Office Reply functionality relies on "
113 "server-side filtering. You have not yet configured an "
114 "IMAP server for this. "
115 "You can do this on the \"Filtering\" tab of the IMAP "
116 "account configuration."));
117 lab->setWordWrap(true);
118 lab->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
119 QFont font = lab->font();
120 font.setBold(true);
121 font.setPixelSize(font.pixelSize() + 2);
122 lab->setFont(font);
123 vbox->addWidget(lab);
124 lab->setWordWrap(true);
125 d->mStackedWidget->addWidget(w);
126 d->mStackedWidget->setCurrentIndex(0);
127 mButtonBox = new QDialogButtonBox(this);
128 mButtonBox->setObjectName(QLatin1StringView("mButtonBox"));
129 mainLayout->addWidget(mButtonBox);
130 initialize();
131}
132
133void MultiImapVacationDialog::initialize()
134{
135 auto job = new KSieveCore::SearchServerWithVacationSupportJob(this);
136 job->setPasswordProvider(d->mVacationManager->passwordProvider());
137 connect(job,
138 &KSieveCore::SearchServerWithVacationSupportJob::searchServerWithVacationSupportFinished,
139 this,
140 &MultiImapVacationDialog::slotSearchServerWithVacationSupportFinished);
141 job->start();
142}
143
144void MultiImapVacationDialog::slotSearchServerWithVacationSupportFinished(const QMap<QString, KSieveCore::Util::AccountInfo> &list)
145{
146 bool foundOneImap = false;
147
149 while (i.hasNext()) {
150 i.next();
151 createPage(i.key(), i.value());
152 foundOneImap = true;
153 }
154 if (foundOneImap) {
156 QPushButton *okButton = mButtonBox->button(QDialogButtonBox::Ok);
157 okButton->setDefault(true);
159 connect(mButtonBox, &QDialogButtonBox::accepted, this, &MultiImapVacationDialog::slotOkClicked);
160 connect(mButtonBox, &QDialogButtonBox::rejected, this, &MultiImapVacationDialog::slotCanceled);
161 connect(mButtonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this, &MultiImapVacationDialog::slotDefaultClicked);
162 } else { // Empty
163 d->mStackedWidget->setCurrentIndex(1);
165 connect(mButtonBox, &QDialogButtonBox::accepted, this, &MultiImapVacationDialog::slotOkClicked);
166 connect(mButtonBox, &QDialogButtonBox::rejected, this, &MultiImapVacationDialog::slotCanceled);
167 }
168 if (d->mTabWidget->count() <= 1) {
169 d->mTabWidget->tabBar()->hide();
170 }
171}
172
173void MultiImapVacationDialog::slotCanceled()
174{
175 Q_EMIT cancelClicked();
176}
177
178void MultiImapVacationDialog::createPage(const QString &serverName, const KSieveCore::Util::AccountInfo &info)
179{
180 auto page = new VacationPageWidget;
181 page->setServerUrl(info.sieveUrl);
182 page->setServerName(serverName);
183 page->setVacationManager(d->mVacationManager);
184 page->setSieveImapAccountSettings(info.sieveImapAccountSettings);
185 d->mTabWidget->addTab(page, serverName + QStringLiteral(" (%1)").arg(info.sieveUrl.userName()));
186}
187
188void MultiImapVacationDialog::readConfig()
189{
190 create(); // ensure a window is created
191 windowHandle()->resize(QSize(600, 400));
192 KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(myMultiImapVacationDialogGroupName));
194 resize(windowHandle()->size()); // workaround for QTBUG-40584
195}
196
197void MultiImapVacationDialog::writeConfig()
198{
199 KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(myMultiImapVacationDialogGroupName));
201 group.sync();
202}
203
204void MultiImapVacationDialog::slotOkClicked()
205{
206 bool errorFound = false;
207 qDeleteAll(d->mListCreateJob);
208 d->mListCreateJob.clear();
209 for (int i = 0; i < d->mTabWidget->count(); ++i) {
210 auto vacationPage = qobject_cast<VacationPageWidget *>(d->mTabWidget->widget(i));
211 if (vacationPage) {
212 KSieveCore::VacationCreateScriptJob *job = vacationPage->writeScript(errorFound);
213
214 if (job && !errorFound) {
215 d->mListCreateJob.append(job);
216 }
217 if (errorFound) {
218 // Clean up job
219 qDeleteAll(d->mListCreateJob);
220 d->mListCreateJob.clear();
221 break;
222 }
223 }
224 }
225 if (!errorFound) {
226 Q_EMIT okClicked();
227 }
228}
229
230void MultiImapVacationDialog::slotDefaultClicked()
231{
232 for (int i = 0; i < d->mTabWidget->count(); ++i) {
233 auto vacationPage = qobject_cast<VacationPageWidget *>(d->mTabWidget->widget(i));
234 if (vacationPage) {
235 vacationPage->setDefault();
236 }
237 }
238}
239
240#include "moc_multiimapvacationdialog.cpp"
static KSharedConfig::Ptr openStateConfig(const QString &fileName=QString())
The MultiImapVacationManager class.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
ButtonCode questionTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Notify)
KCONFIGGUI_EXPORT void saveWindowSize(const QWindow *window, KConfigGroup &config, KConfigGroup::WriteConfigFlags options=KConfigGroup::Normal)
KCONFIGGUI_EXPORT void restoreWindowSize(QWindow *window, const KConfigGroup &config)
QCA_EXPORT void init()
void clicked(bool checked)
void setShortcut(const QKeySequence &key)
virtual void reject()
QPushButton * button(StandardButton which) const const
void setStandardButtons(StandardButtons buttons)
void setBold(bool enable)
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void setObjectName(QAnyStringView name)
void setDefault(bool)
AlignHCenter
Key_Return
QString userName(ComponentFormattingOptions options) const const
QWidget(QWidget *parent, Qt::WindowFlags f)
void create(WId window, bool initializeWindow, bool destroyOldWindow)
void resize(const QSize &)
QWindow * windowHandle() const const
void resize(const QSize &newSize)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:17:19 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.