9#include "utils/configureaggregationsdialog.h"
10#include "utils/configureaggregationsdialog_p.h"
12#include "core/aggregation.h"
13#include "utils/aggregationeditor.h"
15#include "core/manager.h"
23#include <KConfigGroup>
24#include <KLocalizedString>
25#include <QDialogButtonBox>
34class AggregationListWidgetItem :
public QListWidgetItem
37 Core::Aggregation *mAggregation =
nullptr;
40 AggregationListWidgetItem(QListWidget *par,
const Core::Aggregation &set)
43 mAggregation =
new Core::Aggregation(set);
46 ~AggregationListWidgetItem()
override
52 [[nodiscard]] Core::Aggregation *aggregation()
const
57 void forgetAggregation()
59 mAggregation =
nullptr;
68class AggregationListWidget :
public QListWidget
78 [[nodiscard]] QSize sizeHint()
const override
87using namespace MessageList::Utils;
89ConfigureAggregationsDialog::ConfigureAggregationsDialog(
QWidget *parent)
91 , d(new ConfigureAggregationsDialogPrivate(this))
100 setWindowTitle(
i18nc(
"@title:window",
"Customize Message Aggregation Modes"));
103 mainLayout->addWidget(base);
104 mainLayout->addWidget(buttonBox);
107 g->setContentsMargins({});
109 d->mAggregationList =
new AggregationListWidget(base);
111 d->mAggregationList->setSortingEnabled(
true);
112 g->addWidget(d->mAggregationList, 0, 0, 7, 1);
115 d->aggregationListItemClicked(item);
118 d->aggregationListItemClicked(item);
121 d->mNewAggregationButton =
new QPushButton(
i18nc(
"@action:button",
"New Aggregation"), base);
122 d->mNewAggregationButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"document-new")));
123 g->addWidget(d->mNewAggregationButton, 0, 1);
126 d->newAggregationButtonClicked();
129 d->mCloneAggregationButton =
new QPushButton(
i18nc(
"@action:button",
"Clone Aggregation"), base);
130 d->mCloneAggregationButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"edit-copy")));
131 g->addWidget(d->mCloneAggregationButton, 1, 1);
134 d->cloneAggregationButtonClicked();
137 auto f =
new QFrame(base);
139 f->setMinimumHeight(24);
142 d->mExportAggregationButton =
new QPushButton(
i18nc(
"@action:button",
"Export Aggregation..."), base);
143 g->addWidget(d->mExportAggregationButton, 3, 1);
146 d->exportAggregationButtonClicked();
149 d->mImportAggregationButton =
new QPushButton(
i18nc(
"@action:button",
"Import Aggregation..."), base);
150 g->addWidget(d->mImportAggregationButton, 4, 1);
152 d->importAggregationButtonClicked();
157 f->setMinimumHeight(24);
160 d->mDeleteAggregationButton =
new QPushButton(
i18nc(
"@action:button",
"Delete Aggregation"), base);
161 d->mDeleteAggregationButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"edit-delete")));
162 g->addWidget(d->mDeleteAggregationButton, 6, 1);
165 d->deleteAggregationButtonClicked();
169 g->addWidget(d->mEditor, 8, 0, 1, 2);
172 d->editedAggregationNameChanged();
175 g->setColumnStretch(0, 1);
176 g->setRowStretch(7, 1);
179 d->okButtonClicked();
182 d->fillAggregationList();
185ConfigureAggregationsDialog::~ConfigureAggregationsDialog() =
default;
187void ConfigureAggregationsDialog::selectAggregation(
const QString &aggregationId)
189 AggregationListWidgetItem *item = d->findAggregationItemById(aggregationId);
191 d->mAggregationList->setCurrentItem(item);
192 d->aggregationListItemClicked(item);
196void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::okButtonClicked()
198 if (Manager::instance()) {
201 Manager::instance()->removeAllAggregations();
203 const int c = mAggregationList->count();
206 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->item(i));
208 Manager::instance()->addAggregation(item->aggregation());
209 item->forgetAggregation();
214 Manager::instance()->aggregationsConfigurationCompleted();
216 Q_EMIT q->okClicked();
220void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::commitEditor()
222 Aggregation *editedAggregation = mEditor->editedAggregation();
223 if (!editedAggregation) {
229 AggregationListWidgetItem *editedItem = findAggregationItemByAggregation(editedAggregation);
233 const QString goodName = uniqueNameForAggregation(editedAggregation->
name(), editedAggregation);
234 editedAggregation->
setName(goodName);
238void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::editedAggregationNameChanged()
240 Aggregation *set = mEditor->editedAggregation();
245 AggregationListWidgetItem *it = findAggregationItemByAggregation(set);
250 const QString goodName = uniqueNameForAggregation(set->
name(), set);
255void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::fillAggregationList()
257 if (!Manager::instance()) {
260 const QMap<QString, Aggregation *> &sets = Manager::instance()->aggregations();
263 (void)
new AggregationListWidgetItem(mAggregationList, *(*it));
267void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::aggregationListItemClicked(QListWidgetItem *cur)
273void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::updateButton(QListWidgetItem *cur)
275 const int numberOfSelectedItem(mAggregationList->selectedItems().count());
277 AggregationListWidgetItem *item = cur ?
dynamic_cast<AggregationListWidgetItem *
>(cur) : nullptr;
278 mDeleteAggregationButton->setEnabled(item && !item->aggregation()->readOnly() && (mAggregationList->count() > 1));
280 mCloneAggregationButton->setEnabled(numberOfSelectedItem == 1);
281 mExportAggregationButton->setEnabled(numberOfSelectedItem > 0);
282 mEditor->editAggregation(item ? item->aggregation() :
nullptr);
288AggregationListWidgetItem *ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::findAggregationItemByName(
const QString &name,
289 Aggregation *skipAggregation)
291 const int c = mAggregationList->count();
294 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->item(i));
296 if (item->aggregation() != skipAggregation) {
297 if (item->aggregation()->
name() == name) {
307AggregationListWidgetItem *ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::findAggregationItemById(
const QString &aggregationId)
309 const int c = mAggregationList->count();
312 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->item(i));
314 if (item->aggregation()->
id() == aggregationId) {
323AggregationListWidgetItem *ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::findAggregationItemByAggregation(Aggregation *set)
325 const int c = mAggregationList->count();
328 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->item(i));
330 if (item->aggregation() == set) {
339QString ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::uniqueNameForAggregation(
const QString &baseName, Aggregation *skipAggregation)
341 QString ret = baseName;
343 ret =
i18n(
"Unnamed Aggregation");
348 AggregationListWidgetItem *item = findAggregationItemByName(ret, skipAggregation);
351 ret = QStringLiteral(
"%1 %2").
arg(baseName).
arg(idx);
352 item = findAggregationItemByName(ret, skipAggregation);
357void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::newAggregationButtonClicked()
359 Aggregation emptyAggregation;
360 emptyAggregation.
setName(uniqueNameForAggregation(
i18n(
"New Aggregation")));
361 auto item =
new AggregationListWidgetItem(mAggregationList, emptyAggregation);
363 mAggregationList->clearSelection();
364 mAggregationList->setCurrentItem(item);
365 mDeleteAggregationButton->setEnabled(item && !item->aggregation()->readOnly());
368void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::cloneAggregationButtonClicked()
370 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->currentItem());
376 Aggregation copyAggregation(*(item->aggregation()));
377 copyAggregation.setReadOnly(
false);
378 copyAggregation.generateUniqueId();
379 copyAggregation.setName(uniqueNameForAggregation(item->aggregation()->
name()));
380 item =
new AggregationListWidgetItem(mAggregationList, copyAggregation);
382 mAggregationList->setCurrentItem(item);
383 aggregationListItemClicked(item);
386void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::deleteAggregationButtonClicked()
388 const QList<QListWidgetItem *>
list = mAggregationList->selectedItems();
393 mEditor->editAggregation(
nullptr);
394 for (QListWidgetItem *it : list) {
395 auto item =
dynamic_cast<AggregationListWidgetItem *
>(it);
399 if (!item->aggregation()->readOnly()) {
402 if (mAggregationList->count() < 2) {
407 auto newItem =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->currentItem());
408 updateButton(newItem);
411void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::importAggregationButtonClicked()
415 KConfig config(filename);
417 if (config.hasGroup(QStringLiteral(
"MessageListView::Aggregations"))) {
418 KConfigGroup grp(&config, QStringLiteral(
"MessageListView::Aggregations"));
419 const int cnt = grp.readEntry(
"Count", 0);
422 const QString data = grp.readEntry(QStringLiteral(
"Set%1").arg(idx), QString());
424 auto set =
new Aggregation();
426 set->setReadOnly(
false);
428 set->
setName(uniqueNameForAggregation(set->
name()));
429 (void)
new AggregationListWidgetItem(mAggregationList, *set);
440void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::exportAggregationButtonClicked()
442 const QList<QListWidgetItem *>
list = mAggregationList->selectedItems();
448 KConfig config(filename);
450 KConfigGroup grp(&config, QStringLiteral(
"MessageListView::Aggregations"));
454 for (QListWidgetItem *item : list) {
455 auto themeItem =
static_cast<AggregationListWidgetItem *
>(item);
456 grp.writeEntry(QStringLiteral(
"Set%1").arg(idx), themeItem->aggregation()->saveToString());
462#include "moc_configureaggregationsdialog.cpp"
const QString & id() const
Returns the unique id of this OptionSet.
void generateUniqueId()
(Re)generates a (hopefully) unique identifier for this option set.
void setName(const QString &name)
Sets the name of this OptionSet.
const QString & name() const
Returns the name of this OptionSet.
bool loadFromString(const QString &data)
Attempts to unpack this configuration object from a string (that is likely to come out from a config ...
A widget that allows editing a single MessageList::Aggregation.
void aggregationNameChanged()
This is triggered when the aggregation name changes in the editor text field.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
KIOCORE_EXPORT QStringList list(const QString &fileClass)
QString name(StandardAction id)
const QList< QKeySequence > & end()
The implementation independent part of the MessageList library.
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, Options options)
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, Options options)
QIcon fromTheme(const QString &name)
qsizetype count() const const
bool isEmpty() const const
void setText(const QString &text)
const_iterator constBegin() const const
const_iterator constEnd() const const
QObject * parent() const const
QString arg(Args &&... args) const const
bool isEmpty() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)