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"
18 #include <QGridLayout>
20 #include <QPushButton>
23 #include <KConfigGroup>
24 #include <KLocalizedString>
25 #include <QDialogButtonBox>
26 #include <QFileDialog>
28 #include <QVBoxLayout>
37 Core::Aggregation *mAggregation =
nullptr;
40 AggregationListWidgetItem(
QListWidget *par,
const Core::Aggregation &set)
43 mAggregation =
new Core::Aggregation(set);
46 ~AggregationListWidgetItem()
override
52 Q_REQUIRED_RESULT Core::Aggregation *aggregation()
const
57 void forgetAggregation()
59 mAggregation =
nullptr;
71 AggregationListWidget(
QWidget *parent)
87 using namespace MessageList::Utils;
89 ConfigureAggregationsDialog::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);
114 connect(d->mAggregationList, &AggregationListWidget::itemClicked,
this, [
this](
QListWidgetItem *item) {
115 d->aggregationListItemClicked(item);
117 connect(d->mAggregationList, &AggregationListWidget::currentItemChanged,
this, [
this](
QListWidgetItem *item) {
118 d->aggregationListItemClicked(item);
121 d->mNewAggregationButton =
new QPushButton(
i18n(
"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(
i18n(
"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(
i18n(
"Export Aggregation..."), base);
143 g->addWidget(d->mExportAggregationButton, 3, 1);
146 d->exportAggregationButtonClicked();
149 d->mImportAggregationButton =
new QPushButton(
i18n(
"Import Aggregation..."), base);
150 g->addWidget(d->mImportAggregationButton, 4, 1);
152 d->importAggregationButtonClicked();
157 f->setMinimumHeight(24);
160 d->mDeleteAggregationButton =
new QPushButton(
i18n(
"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);
171 connect(d->mEditor, &AggregationEditor::aggregationNameChanged,
this, [
this]() {
172 d->editedAggregationNameChanged();
175 g->setColumnStretch(0, 1);
176 g->setRowStretch(7, 1);
179 d->okButtonClicked();
182 d->fillAggregationList();
185 ConfigureAggregationsDialog::~ConfigureAggregationsDialog() =
default;
187 void ConfigureAggregationsDialog::selectAggregation(
const QString &aggregationId)
189 AggregationListWidgetItem *item = d->findAggregationItemById(aggregationId);
191 d->mAggregationList->setCurrentItem(item);
192 d->aggregationListItemClicked(item);
196 void 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();
220 void 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);
235 editedItem->setText(goodName);
238 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::editedAggregationNameChanged()
245 AggregationListWidgetItem *it = findAggregationItemByAggregation(set);
250 const QString goodName = uniqueNameForAggregation(set->
name(), set);
252 it->setText(goodName);
255 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::fillAggregationList()
257 if (!Manager::instance()) {
263 (void)
new AggregationListWidgetItem(mAggregationList, *(*it));
267 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::aggregationListItemClicked(
QListWidgetItem *cur)
273 void 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);
283 if (item && !item->isSelected()) {
284 item->setSelected(
true);
288 AggregationListWidgetItem *ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::findAggregationItemByName(
const QString &name,
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) {
307 AggregationListWidgetItem *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) {
323 AggregationListWidgetItem *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) {
339 QString ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::uniqueNameForAggregation(
const QString &baseName,
Aggregation *skipAggregation)
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);
357 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::newAggregationButtonClicked()
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());
368 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::cloneAggregationButtonClicked()
370 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->currentItem());
375 item->setSelected(
false);
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);
386 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::deleteAggregationButtonClicked()
393 mEditor->editAggregation(
nullptr);
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);
411 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::importAggregationButtonClicked()
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());
426 set->setReadOnly(
false);
428 set->
setName(uniqueNameForAggregation(set->
name()));
429 (void)
new AggregationListWidgetItem(mAggregationList, *set);
440 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::exportAggregationButtonClicked()
450 KConfigGroup grp(&config, QStringLiteral(
"MessageListView::Aggregations"));
455 auto themeItem =
static_cast<AggregationListWidgetItem *
>(item);
456 grp.writeEntry(QStringLiteral(
"Set%1").arg(idx), themeItem->aggregation()->saveToString());
462 #include "moc_configureaggregationsdialog.cpp"