Pith - whittle
whittle/src/ui/SchemeDialogs.cpp [3.6 kb]
Modified: 19:51:46 130 026 (27 Jul 026)
0 Days Ago
#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();
}

}
Updates
Whittle - Linux 130.026
Wedge - Android 126.026
Wedge - Linux 124.026
Shim - Android 117.026
Miter - 114.026
Dev
TVShow (227) 'CSA'
TVShow (228) 'APT'
TVProgram (83) 'BXT'
Miter Update(s)
Peen (Messaging)

Menu
Calendar
Project Tin (024/029)
Miter
RSS Feed
User Avatar
@vgmlr
=SUM(parts)