Mailcommon

filterselectiondialog.cpp
1 /*
2  SPDX-FileCopyrightText: 2013-2023 Laurent Montel <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "filterselectiondialog.h"
8 #include "mailfilter.h"
9 
10 #include <KListWidgetSearchLine>
11 #include <QPushButton>
12 
13 #include <KConfigGroup>
14 #include <KSharedConfig>
15 #include <KWindowConfig>
16 #include <QDialogButtonBox>
17 #include <QListWidget>
18 #include <QVBoxLayout>
19 #include <QWindow>
20 
21 using namespace MailCommon;
22 namespace
23 {
24 static const char myFilterSelectionDialogName[] = "FilterSelectionDialog";
25 }
26 FilterSelectionDialog::FilterSelectionDialog(QWidget *parent)
27  : QDialog(parent)
28  , filtersListWidget(new QListWidget(this))
29  , selectAllButton(new QPushButton(i18n("Select All"), this))
30  , unselectAllButton(new QPushButton(i18n("Unselect All"), this))
31 {
32  setObjectName(QLatin1StringView("filterselection"));
33  setModal(true);
34  setWindowTitle(i18nc("@title:window", "Select Filters"));
35  auto top = new QVBoxLayout(this);
36 
38  mOkButton = buttonBox->button(QDialogButtonBox::Ok);
39  mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return);
40  mOkButton->setDefault(true);
41  connect(buttonBox, &QDialogButtonBox::accepted, this, &FilterSelectionDialog::accept);
42  connect(buttonBox, &QDialogButtonBox::rejected, this, &FilterSelectionDialog::reject);
43 
44  auto searchLine = new KListWidgetSearchLine(this, filtersListWidget);
45  searchLine->setPlaceholderText(i18nc("@info Displayed grayed-out inside the textbox, verb to search", "Search"));
46 
47  top->addWidget(searchLine);
48  top->addWidget(filtersListWidget);
49  filtersListWidget->setAlternatingRowColors(true);
50  filtersListWidget->setSortingEnabled(false);
51  filtersListWidget->setSelectionMode(QAbstractItemView::NoSelection);
52 
53  auto const buttonLayout = new QHBoxLayout();
54  top->addLayout(buttonLayout);
55  buttonLayout->addWidget(selectAllButton);
56  buttonLayout->addWidget(unselectAllButton);
57  top->addWidget(buttonBox);
58 
59  connect(selectAllButton, &QPushButton::clicked, this, &FilterSelectionDialog::slotSelectAllButton);
60  connect(unselectAllButton, &QPushButton::clicked, this, &FilterSelectionDialog::slotUnselectAllButton);
61 
62  readConfig();
63 }
64 
65 FilterSelectionDialog::~FilterSelectionDialog()
66 {
67  writeConfig();
68 }
69 
70 void FilterSelectionDialog::reject()
71 {
72  qDeleteAll(originalFilters);
74 }
75 
76 void FilterSelectionDialog::readConfig()
77 {
78  create(); // ensure a window is created
79  windowHandle()->resize(QSize(300, 350));
80  KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1String(myFilterSelectionDialogName));
81  KWindowConfig::restoreWindowSize(windowHandle(), group);
82  resize(windowHandle()->size()); // workaround for QTBUG-40584
83 }
84 
85 void FilterSelectionDialog::writeConfig()
86 {
87  KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1String(myFilterSelectionDialogName));
88  KWindowConfig::saveWindowSize(windowHandle(), group);
89  group.sync();
90 }
91 
92 void FilterSelectionDialog::setFilters(const QList<MailFilter *> &filters)
93 {
94  if (filters.isEmpty()) {
95  mOkButton->setEnabled(false);
96  return;
97  }
98 
99  originalFilters = filters;
100  filtersListWidget->clear();
101 
102  for (const MailFilter *filter : filters) {
103  auto item = new QListWidgetItem(filter->name(), filtersListWidget);
104  item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
105  item->setCheckState(Qt::Checked);
106  }
107 }
108 
109 QList<MailFilter *> FilterSelectionDialog::selectedFilters() const
110 {
111  QList<MailFilter *> filters;
112 
113  const int filterCount = filtersListWidget->count();
114  for (int i = 0; i < filterCount; ++i) {
115  const QListWidgetItem *item = filtersListWidget->item(i);
116  if (item->checkState() == Qt::Checked) {
117  filters << originalFilters[i];
118  } else {
119  delete originalFilters[i];
120  }
121  }
122 
123  return filters;
124 }
125 
126 void FilterSelectionDialog::slotUnselectAllButton()
127 {
128  const int filterCount = filtersListWidget->count();
129  for (int i = 0; i < filterCount; ++i) {
130  QListWidgetItem *const item = filtersListWidget->item(i);
132  }
133 }
134 
135 void FilterSelectionDialog::slotSelectAllButton()
136 {
137  const int filterCount = filtersListWidget->count();
138  for (int i = 0; i < filterCount; ++i) {
139  QListWidgetItem *const item = filtersListWidget->item(i);
140  item->setCheckState(Qt::Checked);
141  }
142 }
143 
144 #include "moc_filterselectiondialog.cpp"
virtual void reject()
Qt::CheckState checkState() const const
int count(const T &value) const const
void clicked(bool checked)
void readConfig()
The MailFilter class.
Definition: mailfilter.h:28
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void setCheckState(Qt::CheckState state)
QAction * create(StandardAction id, const QObject *recvr, const char *slot, QObject *parent)
ItemIsUserCheckable
QString i18n(const char *text, const TYPE &arg...)
static KSharedConfig::Ptr openStateConfig(const QString &fileName=QString())
QFuture< void > filter(Sequence &sequence, KeepFunctor filterFunction)
bool isEmpty() const const
Key_Return
KCONFIGGUI_EXPORT void restoreWindowSize(QWindow *window, const KConfigGroup &config)
void setObjectName(const QString &name)
void clear()
QString i18nc(const char *context, const char *text, const TYPE &arg...)
The filter dialog.
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 Fri Dec 1 2023 04:03:39 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.