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);
118 d->mNewAggregationButton =
new QPushButton(
i18n(
"New Aggregation"), base);
119 d->mNewAggregationButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"document-new")));
120 g->addWidget(d->mNewAggregationButton, 0, 1);
123 d->newAggregationButtonClicked();
126 d->mCloneAggregationButton =
new QPushButton(
i18n(
"Clone Aggregation"), base);
127 d->mCloneAggregationButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"edit-copy")));
128 g->addWidget(d->mCloneAggregationButton, 1, 1);
131 d->cloneAggregationButtonClicked();
134 auto f =
new QFrame(base);
136 f->setMinimumHeight(24);
139 d->mExportAggregationButton =
new QPushButton(
i18n(
"Export Aggregation..."), base);
140 g->addWidget(d->mExportAggregationButton, 3, 1);
143 d->exportAggregationButtonClicked();
146 d->mImportAggregationButton =
new QPushButton(
i18n(
"Import Aggregation..."), base);
147 g->addWidget(d->mImportAggregationButton, 4, 1);
149 d->importAggregationButtonClicked();
154 f->setMinimumHeight(24);
157 d->mDeleteAggregationButton =
new QPushButton(
i18n(
"Delete Aggregation"), base);
158 d->mDeleteAggregationButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"edit-delete")));
159 g->addWidget(d->mDeleteAggregationButton, 6, 1);
162 d->deleteAggregationButtonClicked();
166 g->addWidget(d->mEditor, 8, 0, 1, 2);
168 connect(d->mEditor, &AggregationEditor::aggregationNameChanged,
this, [
this]() {
169 d->editedAggregationNameChanged();
172 g->setColumnStretch(0, 1);
173 g->setRowStretch(7, 1);
176 d->okButtonClicked();
179 d->fillAggregationList();
182 ConfigureAggregationsDialog::~ConfigureAggregationsDialog() =
default;
184 void ConfigureAggregationsDialog::selectAggregation(
const QString &aggregationId)
186 AggregationListWidgetItem *item = d->findAggregationItemById(aggregationId);
188 d->mAggregationList->setCurrentItem(item);
189 d->aggregationListItemClicked(item);
193 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::okButtonClicked()
195 if (Manager::instance()) {
198 Manager::instance()->removeAllAggregations();
200 const int c = mAggregationList->count();
203 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->item(i));
205 Manager::instance()->addAggregation(item->aggregation());
206 item->forgetAggregation();
211 Manager::instance()->aggregationsConfigurationCompleted();
213 Q_EMIT q->okClicked();
217 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::commitEditor()
219 Aggregation *editedAggregation = mEditor->editedAggregation();
220 if (!editedAggregation) {
226 AggregationListWidgetItem *editedItem = findAggregationItemByAggregation(editedAggregation);
230 const QString goodName = uniqueNameForAggregation(editedAggregation->
name(), editedAggregation);
231 editedAggregation->
setName(goodName);
232 editedItem->setText(goodName);
235 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::editedAggregationNameChanged()
242 AggregationListWidgetItem *it = findAggregationItemByAggregation(set);
247 const QString goodName = uniqueNameForAggregation(set->
name(), set);
249 it->setText(goodName);
252 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::fillAggregationList()
254 if (!Manager::instance()) {
260 (void)
new AggregationListWidgetItem(mAggregationList, *(*it));
264 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::aggregationListItemClicked(
QListWidgetItem *cur)
270 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::updateButton(
QListWidgetItem *cur)
272 const int numberOfSelectedItem(mAggregationList->selectedItems().count());
274 AggregationListWidgetItem *item = cur ?
dynamic_cast<AggregationListWidgetItem *
>(cur) :
nullptr;
275 mDeleteAggregationButton->setEnabled(item && !item->aggregation()->readOnly() && (mAggregationList->count() > 1));
277 mCloneAggregationButton->setEnabled(numberOfSelectedItem == 1);
278 mExportAggregationButton->setEnabled(numberOfSelectedItem > 0);
279 mEditor->editAggregation(item ? item->aggregation() :
nullptr);
280 if (item && !item->isSelected()) {
281 item->setSelected(
true);
285 AggregationListWidgetItem *ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::findAggregationItemByName(
const QString &name,
288 const int c = mAggregationList->count();
291 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->item(i));
293 if (item->aggregation() != skipAggregation) {
294 if (item->aggregation()->name() ==
name) {
304 AggregationListWidgetItem *ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::findAggregationItemById(
const QString &aggregationId)
306 const int c = mAggregationList->count();
309 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->item(i));
311 if (item->aggregation()->id() == aggregationId) {
320 AggregationListWidgetItem *ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::findAggregationItemByAggregation(
Aggregation *set)
322 const int c = mAggregationList->count();
325 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->item(i));
327 if (item->aggregation() == set) {
336 QString ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::uniqueNameForAggregation(
const QString &baseName,
Aggregation *skipAggregation)
340 ret =
i18n(
"Unnamed Aggregation");
345 AggregationListWidgetItem *item = findAggregationItemByName(ret, skipAggregation);
348 ret = QStringLiteral(
"%1 %2").
arg(baseName).
arg(idx);
349 item = findAggregationItemByName(ret, skipAggregation);
354 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::newAggregationButtonClicked()
357 emptyAggregation.
setName(uniqueNameForAggregation(
i18n(
"New Aggregation")));
358 auto item =
new AggregationListWidgetItem(mAggregationList, emptyAggregation);
360 mAggregationList->setCurrentItem(item);
361 mDeleteAggregationButton->setEnabled(item && !item->aggregation()->readOnly());
364 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::cloneAggregationButtonClicked()
366 auto item =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->currentItem());
371 item->setSelected(
false);
372 Aggregation copyAggregation(*(item->aggregation()));
373 copyAggregation.setReadOnly(
false);
374 copyAggregation.generateUniqueId();
375 copyAggregation.setName(uniqueNameForAggregation(item->aggregation()->name()));
376 item =
new AggregationListWidgetItem(mAggregationList, copyAggregation);
378 mAggregationList->setCurrentItem(item);
379 aggregationListItemClicked(item);
382 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::deleteAggregationButtonClicked()
389 mEditor->editAggregation(
nullptr);
391 auto item =
dynamic_cast<AggregationListWidgetItem *
>(it);
395 if (!item->aggregation()->readOnly()) {
398 if (mAggregationList->count() < 2) {
403 auto newItem =
dynamic_cast<AggregationListWidgetItem *
>(mAggregationList->currentItem());
404 updateButton(newItem);
407 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::importAggregationButtonClicked()
413 if (
config.hasGroup(QStringLiteral(
"MessageListView::Aggregations"))) {
414 KConfigGroup grp(&config, QStringLiteral(
"MessageListView::Aggregations"));
415 const int cnt = grp.readEntry(
"Count", 0);
418 const QString data = grp.readEntry(QStringLiteral(
"Set%1").arg(idx),
QString());
422 set->setReadOnly(
false);
424 set->
setName(uniqueNameForAggregation(set->
name()));
425 (void)
new AggregationListWidgetItem(mAggregationList, *set);
436 void ConfigureAggregationsDialog::ConfigureAggregationsDialogPrivate::exportAggregationButtonClicked()
446 KConfigGroup grp(&config, QStringLiteral(
"MessageListView::Aggregations"));
451 auto themeItem =
static_cast<AggregationListWidgetItem *
>(item);
452 grp.writeEntry(QStringLiteral(
"Set%1").arg(idx), themeItem->aggregation()->saveToString());
458 #include "moc_configureaggregationsdialog.cpp"