#include "core/ConfigStore.h"
#include "ui/SchemeDialogs.h"
#include <QAbstractButton>
#include <QDialogButtonBox>
#include <QHBoxLayout>
#include <QIcon>
#include <QLabel>
#include <QLineEdit>
#include <QListWidget>
#include <QMessageBox>
#include <QPushButton>
#include <QVBoxLayout>
namespace whittle {
namespace {
QMessageBox::StandardButton askYesNo(QWidget* parent, const QString& title,
const QString& text) {
QMessageBox box(QMessageBox::Question, title, text,
QMessageBox::Yes | QMessageBox::No, parent);
box.setDefaultButton(QMessageBox::No);
for (QAbstractButton* b : box.buttons()) b->setIcon(QIcon());
box.exec();
return box.standardButton(box.clickedButton());
}
}
SaveSchemeDialog::SaveSchemeDialog(const QStringList& existing, bool allowSave,
QWidget* parent)
: QDialog(parent), m_existing(existing), m_allowSave(allowSave) {
setWindowTitle(tr("Schemes"));
setModal(true);
resize(300, 250);
auto* v = new QVBoxLayout(this);
v->addWidget(new QLabel(tr("Moniker")));
m_edit = new QLineEdit;
m_edit->setEnabled(allowSave);
if (!allowSave)
m_edit->setPlaceholderText(tr("Nothing to save!"));
v->addWidget(m_edit);
v->addWidget(new QLabel(tr("Saved Schemes")));
m_list = new QListWidget;
m_list->addItems(existing);
v->addWidget(m_list, 1);
m_del = new QPushButton(tr("Delete"));
m_del->setEnabled(false);
auto* buttons = new QDialogButtonBox(
QDialogButtonBox::Save | QDialogButtonBox::Cancel);
for (QAbstractButton* b : buttons->buttons()) b->setIcon(QIcon());
m_ok = buttons->button(QDialogButtonBox::Save);
m_ok->setEnabled(false);
v->addWidget(buttons);
auto* buttonRow = new QHBoxLayout;
buttonRow->addWidget(m_del);
buttonRow->addStretch();
buttonRow->addWidget(buttons);
v->addLayout(buttonRow);
connect(m_edit, &QLineEdit::textChanged, this, &SaveSchemeDialog::validate);
connect(m_list, &QListWidget::itemClicked, this, [this](QListWidgetItem* i) {
if (m_allowSave && i) m_edit->setText(i->text());
});
connect(m_list, &QListWidget::currentRowChanged,
this, [this](int row) { m_del->setEnabled(row >= 0); });
connect(m_del, &QPushButton::clicked, this, &SaveSchemeDialog::onDelete);
connect(buttons, &QDialogButtonBox::accepted, this, &SaveSchemeDialog::tryAccept);
connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
}
void SaveSchemeDialog::validate() {
m_ok->setEnabled(m_allowSave && !m_edit->text().trimmed().isEmpty());
}
void SaveSchemeDialog::onDelete() {
auto* item = m_list->currentItem();
if (!item) return;
const QString name = item->text();
const auto btn = askYesNo(this, tr("Delete"), tr("Delete \"%1\"?").arg(name));
if (btn != QMessageBox::Yes) return;
if (!ConfigStore::deleteScheme(name)) {
QMessageBox::warning(this, tr("Delete"),
tr("Could not delete \"%1\".").arg(name));
return;
}
delete m_list->takeItem(m_list->row(item));
m_existing.removeAll(name);
m_listChanged = true;
m_del->setEnabled(m_list->currentRow() >= 0);
}
void SaveSchemeDialog::tryAccept() {
const QString name = schemeName();
if (name.isEmpty()) return;
if (m_existing.contains(name)) {
const auto btn = askYesNo(this, tr("Over-Write?"),
tr("\"%1\" already exists.").arg(name));
if (btn != QMessageBox::Yes) return;
}
accept();
}
QString SaveSchemeDialog::schemeName() const {
return m_edit->text().trimmed();
}
}