Mailcommon

filteractionmissingfolderdialog.cpp
1 /*
2 
3  SPDX-FileCopyrightText: 2011-2023 Laurent Montel <[email protected]>
4 
5  SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "filteractionmissingfolderdialog.h"
9 #include "folder/folderrequester.h"
10 #include "kernel/mailkernel.h"
11 #include "util/mailutil.h"
12 
13 #include <Akonadi/EntityMimeTypeFilterModel>
14 
15 #include <KLocalizedString>
16 
17 #include <KConfigGroup>
18 #include <KWindowConfig>
19 #include <QDialogButtonBox>
20 #include <QLabel>
21 #include <QListWidget>
22 #include <QPushButton>
23 #include <QVBoxLayout>
24 #include <QWindow>
25 namespace
26 {
27 static const char myFilterActionMissingCollectionDialogConfigGroupName[] = "FilterActionMissingCollectionDialog";
28 }
29 
30 FilterActionMissingFolderDialog::FilterActionMissingFolderDialog(const Akonadi::Collection::List &list,
31  const QString &filtername,
32  const QString &argStr,
33  QWidget *parent)
34  : QDialog(parent)
35  , mFolderRequester(new MailCommon::FolderRequester(this))
36 {
37  setModal(true);
38  setWindowTitle(i18nc("@title:window", "Select Folder"));
39  auto mainLayout = new QVBoxLayout(this);
40 
41  auto lab = new QLabel(i18n("Folder path was \"%1\".", argStr));
42  lab->setObjectName(QStringLiteral("argumentlabel"));
43  lab->setWordWrap(true);
44  mainLayout->addWidget(lab);
45  if (!list.isEmpty()) {
46  lab = new QLabel(i18n("The following folders can be used for this filter:"));
47  lab->setObjectName(QStringLiteral("label"));
48  lab->setWordWrap(true);
49  mainLayout->addWidget(lab);
50  mListwidget = new QListWidget(this);
51  mainLayout->addWidget(mListwidget);
52  const int numberOfItems(list.count());
53  for (int i = 0; i < numberOfItems; ++i) {
54  const Akonadi::Collection col = list.at(i);
55  auto item = new QListWidgetItem(MailCommon::Util::fullCollectionPath(col));
56  item->setData(FilterActionMissingFolderDialog::IdentifyCollection, col.id());
57  mListwidget->addItem(item);
58  }
59  connect(mListwidget, &QListWidget::currentItemChanged, this, &FilterActionMissingFolderDialog::slotCurrentItemChanged);
60  connect(mListwidget, &QListWidget::itemDoubleClicked, this, &FilterActionMissingFolderDialog::slotDoubleItemClicked);
61  }
62 
63  auto label = new QLabel(this);
64  label->setObjectName(QStringLiteral("folderlabel"));
65  label->setWordWrap(true);
66  if (filtername.isEmpty()) {
67  label->setText(i18n("Please select a folder:"));
68  } else {
69  label->setText(
70  i18n("Filter folder is missing. "
71  "Please select a folder to use with filter \"%1\":",
72  filtername));
73  }
74  mainLayout->addWidget(label);
75  mFolderRequester->setObjectName(QStringLiteral("folderrequester"));
76  connect(mFolderRequester, &MailCommon::FolderRequester::folderChanged, this, &FilterActionMissingFolderDialog::slotFolderChanged);
77  mainLayout->addWidget(mFolderRequester);
78  mainLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Expanding));
79 
81  buttonBox->setObjectName(QStringLiteral("buttonbox"));
82  mOkButton = buttonBox->button(QDialogButtonBox::Ok);
83  mOkButton->setDefault(true);
84  mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return);
85  mOkButton->setEnabled(false);
86  connect(buttonBox, &QDialogButtonBox::accepted, this, &FilterActionMissingFolderDialog::accept);
87  connect(buttonBox, &QDialogButtonBox::rejected, this, &FilterActionMissingFolderDialog::reject);
88  mainLayout->addWidget(buttonBox);
89  readConfig();
90 }
91 
92 FilterActionMissingFolderDialog::~FilterActionMissingFolderDialog()
93 {
94  writeConfig();
95 }
96 
97 void FilterActionMissingFolderDialog::readConfig()
98 {
99  create(); // ensure a window is created
100  windowHandle()->resize(QSize(500, 300));
101  KConfigGroup group(KSharedConfig::openStateConfig(), myFilterActionMissingCollectionDialogConfigGroupName);
102  KWindowConfig::restoreWindowSize(windowHandle(), group);
103  resize(windowHandle()->size()); // workaround for QTBUG-40584
104 }
105 
106 void FilterActionMissingFolderDialog::writeConfig()
107 {
108  KConfigGroup group(KSharedConfig::openStateConfig(), myFilterActionMissingCollectionDialogConfigGroupName);
109  KWindowConfig::saveWindowSize(windowHandle(), group);
110  group.sync();
111 }
112 
113 void FilterActionMissingFolderDialog::slotFolderChanged(const Akonadi::Collection &col)
114 {
115  mOkButton->setEnabled(col.isValid());
116 }
117 
118 void FilterActionMissingFolderDialog::slotDoubleItemClicked(QListWidgetItem *item)
119 {
120  if (!item) {
121  return;
122  }
123 
124  const Akonadi::Collection::Id id = item->data(FilterActionMissingFolderDialog::IdentifyCollection).toLongLong();
125 
126  mFolderRequester->setCollection(Akonadi::Collection(id));
127  accept();
128 }
129 
130 void FilterActionMissingFolderDialog::slotCurrentItemChanged()
131 {
132  QListWidgetItem *currentItem = mListwidget->currentItem();
133  if (currentItem) {
134  const Akonadi::Collection::Id id = currentItem->data(FilterActionMissingFolderDialog::IdentifyCollection).toLongLong();
135  mFolderRequester->setCollection(Akonadi::Collection(id));
136  }
137 }
138 
139 Akonadi::Collection FilterActionMissingFolderDialog::selectedCollection() const
140 {
141  return mFolderRequester->collection();
142 }
143 
144 void FilterActionMissingFolderDialog::getPotentialFolders(const QAbstractItemModel *model,
145  const QModelIndex &parentIndex,
146  const QString &lastElement,
148 {
149  const int rowCount = model->rowCount(parentIndex);
150  for (int row = 0; row < rowCount; ++row) {
151  const QModelIndex index = model->index(row, 0, parentIndex);
152  if (model->rowCount(index) > 0) {
153  getPotentialFolders(model, index, lastElement, list);
154  }
155  if (model->data(index).toString() == lastElement) {
157  }
158  }
159 }
160 
161 Akonadi::Collection::List FilterActionMissingFolderDialog::potentialCorrectFolders(const QString &path, bool &exactPath)
162 {
164  const QString realPath = MailCommon::Util::realFolderPath(path);
165  if (realPath.isEmpty()) {
166  return lst;
167  }
168 
169  if (KernelIf->collectionModel()) {
170  const int lastSlash = realPath.lastIndexOf(QLatin1Char('/'));
171  QString lastElement;
172  if (lastSlash == -1) {
173  lastElement = realPath;
174  } else {
175  lastElement = realPath.right(realPath.length() - lastSlash - 1);
176  }
177 
178  FilterActionMissingFolderDialog::getPotentialFolders(KernelIf->collectionModel(), QModelIndex(), lastElement, lst);
179 
180  const int numberOfItems(lst.count());
181  for (int i = 0; i < numberOfItems; ++i) {
182  if (MailCommon::Util::fullCollectionPath(lst.at(i)) == realPath) {
183  exactPath = true;
184  return Akonadi::Collection::List() << lst.at(i);
185  }
186  }
187  }
188  return lst;
189 }
190 
191 #include "moc_filteractionmissingfolderdialog.cpp"
virtual int rowCount(const QModelIndex &parent) const const=0
virtual QVariant data(const QModelIndex &index, int role) const const=0
int count(const T &value) const const
T value() const const
void readConfig()
void currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
QList< Collection > List
qlonglong toLongLong(bool *ok) const const
KIOFILEWIDGETS_EXPORT QStringList list(const QString &fileClass)
int lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const const
virtual QVariant data(int role) const const
QString i18n(const char *text, const TYPE &arg...)
bool isEmpty() const const
int length() const const
const T & at(int i) const const
static KSharedConfig::Ptr openStateConfig(const QString &fileName=QString())
QAction * create(StandardGameAction id, const QObject *recvr, const char *slot, QObject *parent)
Key_Return
const MAILCOMMON_EXPORT QList< FilterActionDesc * > & list() const
Provides read-only access to a list of all known filter actions.
QString label(StandardShortcut id)
void itemDoubleClicked(QListWidgetItem *item)
QString right(int n) const const
KCONFIGGUI_EXPORT void restoreWindowSize(QWindow *window, const KConfigGroup &config)
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const=0
QString i18nc(const char *context, const char *text, const TYPE &arg...)
bool isValid() const
The filter dialog.
QString toString() const const
KCONFIGGUI_EXPORT void saveWindowSize(const QWindow *window, KConfigGroup &config, KConfigGroup::WriteConfigFlags options=KConfigGroup::Normal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Tue Sep 26 2023 03:56:33 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.