You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.3 KiB
155 lines
5.3 KiB
/* |
|
SPDX-FileCopyrightText: 2018 Daniel Vrátil <dvratil@kde.org> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
#include "settingsdialog.h" |
|
#include "unifiedmailboxeditor.h" |
|
#include "unifiedmailbox.h" |
|
#include "mailkernel.h" |
|
|
|
#include <QStandardItemModel> |
|
#include <QStandardItem> |
|
#include <QListView> |
|
#include <QVBoxLayout> |
|
#include <QDialogButtonBox> |
|
#include <QPushButton> |
|
#include <QItemSelectionModel> |
|
|
|
#include <KLocalizedString> |
|
#include <KMessageBox> |
|
#include <KConfigGroup> |
|
|
|
#include <memory> |
|
|
|
namespace { |
|
static constexpr const char *DialogGroup = "UnifiedMailboxSettingsDialog"; |
|
} |
|
|
|
SettingsDialog::SettingsDialog(const KSharedConfigPtr &config, UnifiedMailboxManager &boxManager, WId, QWidget *parent) |
|
: QDialog(parent) |
|
, mBoxManager(boxManager) |
|
, mKernel(new MailKernel(config, this)) |
|
, mConfig(config) |
|
{ |
|
setWindowIcon(QIcon::fromTheme(QStringLiteral("kmail"))); |
|
auto l = new QVBoxLayout(this); |
|
|
|
auto h = new QHBoxLayout; |
|
l->addLayout(h); |
|
mBoxModel = new QStandardItemModel(this); |
|
auto view = new QListView(this); |
|
view->setEditTriggers(QListView::NoEditTriggers); |
|
view->setModel(mBoxModel); |
|
h->addWidget(view); |
|
|
|
auto v = new QVBoxLayout; |
|
h->addLayout(v); |
|
auto addButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-add-symbolic")), i18n("Add")); |
|
v->addWidget(addButton); |
|
connect(addButton, &QPushButton::clicked, |
|
this, [this]() { |
|
auto mailbox = std::make_unique<UnifiedMailbox>(); |
|
auto editor = new UnifiedMailboxEditor(mailbox.get(), mConfig, this); |
|
if (editor->exec()) { |
|
mailbox->setId(mailbox->name()); // assign ID |
|
addBox(mailbox.get()); |
|
mBoxManager.insertBox(std::move(mailbox)); |
|
mBoxManager.saveBoxes(); |
|
} |
|
delete editor; |
|
}); |
|
auto editButton = new QPushButton(QIcon::fromTheme(QStringLiteral("entry-edit")), i18n("Modify")); |
|
editButton->setEnabled(false); |
|
v->addWidget(editButton); |
|
|
|
const auto modifyMailBox = [this, view]() { |
|
const auto indexes = view->selectionModel()->selectedIndexes(); |
|
if (!indexes.isEmpty()) { |
|
auto item = mBoxModel->itemFromIndex(indexes[0]); |
|
auto mailbox = item->data().value<UnifiedMailbox *>(); |
|
auto editor = new UnifiedMailboxEditor(mailbox, mConfig, this); |
|
if (editor->exec()) { |
|
item->setText(mailbox->name()); |
|
item->setIcon(QIcon::fromTheme(mailbox->icon())); |
|
} |
|
delete editor; |
|
mBoxManager.saveBoxes(); |
|
} |
|
}; |
|
|
|
connect(view, &QListView::doubleClicked, this, modifyMailBox); |
|
connect(editButton, &QPushButton::clicked, |
|
this, modifyMailBox); |
|
|
|
auto removeButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-remove-symbolic")), i18n("Remove")); |
|
removeButton->setEnabled(false); |
|
v->addWidget(removeButton); |
|
connect(removeButton, &QPushButton::clicked, |
|
this, [this, view]() { |
|
const auto indexes = view->selectionModel()->selectedIndexes(); |
|
if (!indexes.isEmpty()) { |
|
auto item = mBoxModel->itemFromIndex(indexes[0]); |
|
const auto mailbox = item->data().value<UnifiedMailbox *>(); |
|
if (KMessageBox::warningYesNo( |
|
this, i18n("Do you really want to remove unified mailbox <b>%1</b>?", mailbox->name()), |
|
i18n("Really Remove?"), KStandardGuiItem::remove(), KStandardGuiItem::cancel()) == KMessageBox::Yes) { |
|
mBoxModel->removeRow(item->row()); |
|
mBoxManager.removeBox(mailbox->id()); |
|
mBoxManager.saveBoxes(); |
|
} |
|
} |
|
}); |
|
v->addStretch(1); |
|
|
|
connect(view->selectionModel(), &QItemSelectionModel::selectionChanged, |
|
this, [view, editButton, removeButton]() { |
|
const bool hasSelection = view->selectionModel()->hasSelection(); |
|
editButton->setEnabled(hasSelection); |
|
removeButton->setEnabled(hasSelection); |
|
}); |
|
|
|
auto box = new QDialogButtonBox(QDialogButtonBox::Close, this); |
|
connect(box, &QDialogButtonBox::rejected, this, &SettingsDialog::reject); |
|
l->addWidget(box); |
|
|
|
loadBoxes(); |
|
readConfig(); |
|
} |
|
|
|
SettingsDialog::~SettingsDialog() |
|
{ |
|
writeConfig(); |
|
} |
|
|
|
void SettingsDialog::readConfig() |
|
{ |
|
auto dlgGroup = mConfig->group(DialogGroup); |
|
const QSize size = dlgGroup.readEntry("Size", QSize(500, 500)); |
|
if (size.isValid()) { |
|
resize(size); |
|
} |
|
} |
|
|
|
void SettingsDialog::writeConfig() |
|
{ |
|
auto dlgGroup = mConfig->group(DialogGroup); |
|
dlgGroup.writeEntry("Size", size()); |
|
dlgGroup.sync(); |
|
} |
|
|
|
void SettingsDialog::loadBoxes() |
|
{ |
|
mBoxModel->clear(); |
|
for (const auto &mailboxIt : mBoxManager) { |
|
addBox(mailboxIt.second.get()); |
|
} |
|
} |
|
|
|
void SettingsDialog::addBox(UnifiedMailbox *box) |
|
{ |
|
auto item = new QStandardItem(QIcon::fromTheme(box->icon()), box->name()); |
|
item->setData(QVariant::fromValue(box)); |
|
mBoxModel->appendRow(item); |
|
}
|
|
|