9 #include "utils/configurethemesdialog.h"
10 #include "utils/configurethemesdialog_p.h"
12 #include "core/theme.h"
13 #include "utils/themeeditor.h"
15 #include "core/manager.h"
18 #include <QGridLayout>
20 #include <QPushButton>
23 #include <KConfigGroup>
24 #include <KLocalizedString>
25 #include <KMessageBox>
26 #include <QDialogButtonBox>
27 #include <QFileDialog>
29 #include <QVBoxLayout>
38 ThemeListWidgetItem(
QListWidget *par,
const Core::Theme &set)
41 mTheme =
new Core::Theme(set);
44 ~ThemeListWidgetItem()
override
49 Q_REQUIRED_RESULT Core::Theme *theme()
const
60 Core::Theme *mTheme =
nullptr;
66 ThemeListWidget(
QWidget *parent)
82 using namespace MessageList::Utils;
84 ConfigureThemesDialog::ConfigureThemesDialog(
QWidget *parent)
86 , d(new ConfigureThemesDialogPrivate(this))
98 mainLayout->addWidget(base);
99 mainLayout->addWidget(buttonBox);
102 g->setContentsMargins({});
104 d->mThemeList =
new ThemeListWidget(base);
106 d->mThemeList->setSortingEnabled(
true);
107 g->addWidget(d->mThemeList, 0, 0, 7, 1);
110 d->themeListItemClicked(item);
114 d->mNewThemeButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"document-new")));
115 g->addWidget(d->mNewThemeButton, 0, 1);
118 d->newThemeButtonClicked();
122 d->mCloneThemeButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"edit-copy")));
123 g->addWidget(d->mCloneThemeButton, 1, 1);
126 d->cloneThemeButtonClicked();
129 auto f =
new QFrame(base);
131 f->setMinimumHeight(24);
134 d->mExportThemeButton =
new QPushButton(
i18n(
"Export Theme..."), base);
135 g->addWidget(d->mExportThemeButton, 3, 1);
138 d->exportThemeButtonClicked();
141 d->mImportThemeButton =
new QPushButton(
i18n(
"Import Theme..."), base);
142 g->addWidget(d->mImportThemeButton, 4, 1);
144 d->importThemeButtonClicked();
149 f->setMinimumHeight(24);
153 d->mDeleteThemeButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"edit-delete")));
154 g->addWidget(d->mDeleteThemeButton, 6, 1);
157 d->deleteThemeButtonClicked();
160 d->mEditor =
new ThemeEditor(base);
161 g->addWidget(d->mEditor, 8, 0, 1, 2);
163 connect(d->mEditor, &ThemeEditor::themeNameChanged,
this, [
this]() {
164 d->editedThemeNameChanged();
167 g->setColumnStretch(0, 1);
168 g->setRowStretch(4, 1);
171 d->okButtonClicked();
177 ConfigureThemesDialog::~ConfigureThemesDialog() =
default;
179 void ConfigureThemesDialog::selectTheme(
const QString &themeId)
181 ThemeListWidgetItem *item = d->findThemeItemById(themeId);
183 d->mThemeList->setCurrentItem(item);
184 d->themeListItemClicked(item);
188 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::okButtonClicked()
192 Manager::instance()->removeAllThemes();
194 const int c = mThemeList->count();
197 auto item =
dynamic_cast<ThemeListWidgetItem *
>(mThemeList->item(i));
199 Manager::instance()->addTheme(item->theme());
205 Manager::instance()->themesConfigurationCompleted();
206 Q_EMIT q->okClicked();
210 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::commitEditor()
212 Theme *editedTheme = mEditor->editedTheme();
219 ThemeListWidgetItem *editedItem = findThemeItemByTheme(editedTheme);
228 QString goodName = uniqueNameForTheme(editedTheme->
name(), editedTheme);
229 editedTheme->
setName(goodName);
230 editedItem->setText(goodName);
233 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::editedThemeNameChanged()
235 Theme *set = mEditor->editedTheme();
240 ThemeListWidgetItem *it = findThemeItemByTheme(set);
245 QString goodName = uniqueNameForTheme(set->
name(), set);
247 it->setText(goodName);
250 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::fillThemeList()
256 (void)
new ThemeListWidgetItem(mThemeList, *(*it));
260 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::themeListItemClicked(
QListWidgetItem *cur)
264 const int numberOfSelectedItem(mThemeList->selectedItems().count());
266 ThemeListWidgetItem *item = cur ?
dynamic_cast<ThemeListWidgetItem *
>(cur) :
nullptr;
267 mDeleteThemeButton->setEnabled(item && !item->theme()->readOnly());
268 mCloneThemeButton->setEnabled(numberOfSelectedItem == 1);
269 mEditor->editTheme(item ? item->theme() :
nullptr);
270 mExportThemeButton->setEnabled(numberOfSelectedItem > 0);
272 if (item && !item->isSelected()) {
273 item->setSelected(
true);
277 ThemeListWidgetItem *ConfigureThemesDialog::ConfigureThemesDialogPrivate::findThemeItemById(
const QString &themeId)
279 const int c = mThemeList->count();
282 auto item =
dynamic_cast<ThemeListWidgetItem *
>(mThemeList->item(i));
284 if (item->theme()->id() == themeId) {
293 ThemeListWidgetItem *ConfigureThemesDialog::ConfigureThemesDialogPrivate::findThemeItemByName(
const QString &name,
Theme *skipTheme)
295 const int c = mThemeList->count();
298 auto item =
dynamic_cast<ThemeListWidgetItem *
>(mThemeList->item(i));
300 if (item->theme() != skipTheme) {
301 if (item->theme()->name() ==
name) {
311 ThemeListWidgetItem *ConfigureThemesDialog::ConfigureThemesDialogPrivate::findThemeItemByTheme(
Theme *set)
313 const int c = mThemeList->count();
316 auto item =
dynamic_cast<ThemeListWidgetItem *
>(mThemeList->item(i));
318 if (item->theme() == set) {
327 QString ConfigureThemesDialog::ConfigureThemesDialogPrivate::uniqueNameForTheme(
const QString &baseName,
Theme *skipTheme)
331 ret =
i18n(
"Unnamed Theme");
336 ThemeListWidgetItem *item = findThemeItemByName(ret, skipTheme);
340 item = findThemeItemByName(ret, skipTheme);
345 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::newThemeButtonClicked()
347 const int numberOfSelectedItem(mThemeList->selectedItems().count());
349 emptyTheme.
setName(uniqueNameForTheme(
i18n(
"New Theme")));
350 auto col =
new Theme::Column();
351 col->setLabel(
i18n(
"New Column"));
352 col->setVisibleByDefault(
true);
353 col->addMessageRow(
new Theme::Row());
354 col->addGroupHeaderRow(
new Theme::Row());
356 auto item =
new ThemeListWidgetItem(mThemeList, emptyTheme);
358 mThemeList->setCurrentItem(item);
359 Core::Theme *theme = item->theme();
361 mEditor->editTheme(theme);
363 mDeleteThemeButton->setEnabled(!theme->readOnly());
364 mExportThemeButton->setEnabled(item);
365 mCloneThemeButton->setEnabled(numberOfSelectedItem == 1);
367 mDeleteThemeButton->setEnabled(
false);
368 mExportThemeButton->setEnabled(
false);
369 mCloneThemeButton->setEnabled(
false);
373 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::cloneThemeButtonClicked()
375 auto item =
dynamic_cast<ThemeListWidgetItem *
>(mThemeList->currentItem());
380 item->setSelected(
false);
381 Theme copyTheme(*(item->theme()));
382 copyTheme.setReadOnly(
false);
384 copyTheme.generateUniqueId();
385 copyTheme.setName(uniqueNameForTheme(item->theme()->name()));
386 item =
new ThemeListWidgetItem(mThemeList, copyTheme);
388 mThemeList->setCurrentItem(item);
389 mEditor->editTheme(item->theme());
391 const int numberOfSelectedItem(mThemeList->selectedItems().count());
392 mDeleteThemeButton->setEnabled(!item->theme()->readOnly());
393 mExportThemeButton->setEnabled(
true);
394 mCloneThemeButton->setEnabled(numberOfSelectedItem == 1);
397 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::deleteThemeButtonClicked()
403 const QString question =
list.
count() > 1 ?
i18n(
"Do you want to delete selected themes?") :
i18n(
"Do you want to delete \"%1\"?",
list.first()->text());
405 if (answer == KMessageBox::Yes) {
406 mEditor->editTheme(
nullptr);
408 auto item =
dynamic_cast<ThemeListWidgetItem *
>(it);
412 if (!item->theme()->readOnly()) {
415 if (mThemeList->count() < 2) {
420 auto newItem =
dynamic_cast<ThemeListWidgetItem *
>(mThemeList->currentItem());
421 mDeleteThemeButton->setEnabled(newItem && !newItem->theme()->readOnly());
422 mExportThemeButton->setEnabled(newItem);
423 const int numberOfSelectedItem(mThemeList->selectedItems().count());
424 mCloneThemeButton->setEnabled(numberOfSelectedItem == 1);
428 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::importThemeButtonClicked()
434 if (
config.hasGroup(QStringLiteral(
"MessageListView::Themes"))) {
435 KConfigGroup grp(&config, QStringLiteral(
"MessageListView::Themes"));
436 const int cnt = grp.readEntry(
"Count", 0);
439 const QString data = grp.readEntry(QStringLiteral(
"Set%1").arg(idx),
QString());
441 auto set =
new Theme();
443 set->setReadOnly(
false);
447 (void)
new ThemeListWidgetItem(mThemeList, *set);
458 void ConfigureThemesDialog::ConfigureThemesDialogPrivate::exportThemeButtonClicked()
468 KConfigGroup grp(&config, QStringLiteral(
"MessageListView::Themes"));
473 auto themeItem =
static_cast<ThemeListWidgetItem *
>(item);
474 grp.writeEntry(QStringLiteral(
"Set%1").arg(idx), themeItem->theme()->saveToString());
480 #include "moc_configurethemesdialog.cpp"