From 2e7924a07d45c1d1468552f951dcd2f2dcc948fa Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Mon, 26 Sep 2022 22:14:18 -0400 Subject: Add a few basic settings items. Yes I stole qmp's settings design and silently relicensed the (largely identical) code. But who in the world cares, plus I'm the author of qmp anyway. --- qdeduper/preferencedialog.cpp | 170 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 qdeduper/preferencedialog.cpp (limited to 'qdeduper/preferencedialog.cpp') diff --git a/qdeduper/preferencedialog.cpp b/qdeduper/preferencedialog.cpp new file mode 100644 index 0000000..6851634 --- /dev/null +++ b/qdeduper/preferencedialog.cpp @@ -0,0 +1,170 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "preferencedialog.hpp" +#include "settings.hpp" + +PreferenceDialog::PreferenceDialog(SettingsRegistry *sr, QWidget *parent) : QDialog(parent) +{ + this->sr = sr; + tw = new QTabWidget(this); + bb = new QDialogButtonBox(QDialogButtonBox::StandardButton::Ok | QDialogButtonBox::StandardButton::Cancel, this); + this->setWindowTitle("Preferences"); + QVBoxLayout *l = new QVBoxLayout(); + this->setLayout(l); + l->addWidget(tw); + l->addWidget(bb); + QObject::connect(bb, &QDialogButtonBox::accepted, this, &PreferenceDialog::accept); + QObject::connect(bb, &QDialogButtonBox::rejected, this, &PreferenceDialog::reject); + setup_widgets(); +} + +void PreferenceDialog::open() +{ + load_widget_status(); + QDialog::open(); +} + +void PreferenceDialog::accept() +{ + save_widget_status(); + QDialog::accept(); +} + +void PreferenceDialog::setup_widgets() +{ + for (auto &i : sr->tabs) + { + QWidget *container = new QWidget(); + QGridLayout *l = new QGridLayout(container); + tw->addTab(container, i); + tabs.push_back(l); + } + for (auto &k : sr->klist) + { + auto &p = sr->smap[k]; + QWidget *w = nullptr; + QGridLayout *l = p.tab < tabs.size() ? tabs[p.tab] : nullptr; + if (!l) continue; + switch (p.type) + { + case SettingsItem::ParameterType::_int: + { + QSpinBox *sb = new QSpinBox(); + sb->setMinimum(p.min.value()); + sb->setMaximum(p.max.value()); + w = sb; + } + break; + case SettingsItem::ParameterType::_bool: + { + QCheckBox *cb = new QCheckBox(p.desc); + w = cb; + } + break; + case SettingsItem::ParameterType::_double: + { + QDoubleSpinBox *sb = new QDoubleSpinBox(); + sb->setMinimum(p.min.value()); + sb->setMaximum(p.max.value()); + sb->setSingleStep((sb->maximum() - sb->minimum()) / 100.); + w = sb; + } + break; + case SettingsItem::ParameterType::_keyseq: + break; + default: + break; + } + if (!w) continue; + p.w = w; + if (p.type == SettingsItem::ParameterType::_bool) + { + l->addWidget(w, l->rowCount(), 0, 1, 2); + } + else + { + QLabel *lb = new QLabel(p.desc); + lb->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + int r = l->rowCount(); + l->addWidget(lb, r, 0); + l->addWidget(w, r, 1); + } + } +} + +void PreferenceDialog::load_widget_status() +{ + for (auto &k : sr->klist) + { + auto &p = sr->smap[k]; + QWidget *w = p.w; + switch (p.type) + { + case SettingsItem::ParameterType::_int: + { + QSpinBox *sb = qobject_cast(w); + if (!sb) continue; + sb->setValue(sr->get_option_int(p.key)); + } + break; + case SettingsItem::ParameterType::_bool: + { + QCheckBox *cb = qobject_cast(w); + cb->setChecked(sr->get_option_bool(p.key)); + } + break; + case SettingsItem::ParameterType::_double: + { + QDoubleSpinBox *sb = qobject_cast(w); + sb->setValue(sr->get_option_double(p.key)); + } + break; + case SettingsItem::ParameterType::_keyseq: + break; + default: + break; + } + } +} + +void PreferenceDialog::save_widget_status() +{ + for (auto &k : sr->klist) + { + auto &p = sr->smap[k]; + QWidget *w = p.w; + switch (p.type) + { + case SettingsItem::ParameterType::_int: + { + QSpinBox *sb = qobject_cast(w); + if (!sb) continue; + sr->set_option_int(p.key, sb->value()); + } + break; + case SettingsItem::ParameterType::_bool: + { + QCheckBox *cb = qobject_cast(w); + sr->set_option_bool(p.key, cb->isChecked()); + } + break; + case SettingsItem::ParameterType::_double: + { + QDoubleSpinBox *sb = qobject_cast(w); + sr->set_option_double(p.key, sb->value()); + } + break; + case SettingsItem::ParameterType::_keyseq: + break; + default: + break; + } + } +} -- cgit v1.2.3