diff --git a/notes b/notes index 6defa70..b71399a 100644 --- a/notes +++ b/notes @@ -32,8 +32,7 @@ parameters { TODO { settings dialog { - actual window - menu action to open (single instance) + about-license info } ping-pong for delay diff --git a/xybrid/fileops-config.cpp b/xybrid/fileops-config.cpp index 1a72227..48aae2f 100644 --- a/xybrid/fileops-config.cpp +++ b/xybrid/fileops-config.cpp @@ -3,6 +3,7 @@ #include "uisocket.h" #include "config/uistate.h" +#include "config/uiconfig.h" #include @@ -29,6 +30,11 @@ namespace FileOps = Xybrid::FileOps; using namespace Xybrid::Config; +namespace { // utilities + inline void load(QCborValueRef m, QString& v) { v = m.toString(v); } + inline void load(QCborValueRef m, bool& v) { v = m.toBool(v); } +} + void FileOps::loadConfig() { QFile file(Config::Directories::configFile); if (file.open(QFile::ReadOnly)) { // file exists! read in @@ -37,19 +43,23 @@ void FileOps::loadConfig() { file.close(); if (auto dirs = root[qs("directories")].toMap(); !dirs.isEmpty()) { - if (auto s = dirs[qs("projects")].toString(); !s.isNull()) Config::Directories::projects = s; - if (auto s = dirs[qs("presets")].toString(); !s.isNull()) Config::Directories::presets = s; + load(dirs[qs("projects")], Directories::projects); + load(dirs[qs("presets")], Directories::presets); + } + + if (auto ui = root[qs("ui")].toMap(); !ui.isEmpty()) { + load(ui[qs("verticalKnobs")], UIConfig::verticalKnobs); } } // make sure directories exist - if (auto d = QDir(Config::Directories::projects); !d.exists()) d.mkpath("."); - if (auto d = QDir(Config::Directories::presets); !d.exists()) d.mkpath("."); + if (auto d = QDir(Directories::projects); !d.exists()) d.mkpath("."); + if (auto d = QDir(Directories::presets); !d.exists()) d.mkpath("."); } void FileOps::saveConfig() { - QFileInfo fi(Config::Directories::configFile); + QFileInfo fi(Directories::configFile); fi.dir().mkpath("."); // make sure directory exists QFile file(fi.filePath()); @@ -60,12 +70,20 @@ void FileOps::saveConfig() { { QCborMap dirs; - dirs[qs("projects")] = Config::Directories::projects; - dirs[qs("presets")] = Config::Directories::presets; + dirs[qs("projects")] = Directories::projects; + dirs[qs("presets")] = Directories::presets; root[qs("directories")] = dirs; } + { + QCborMap ui; + + ui[qs("verticalKnobs")] = UIConfig::verticalKnobs; + + root[qs("ui")] = ui; + } + // write out QCborStreamWriter w(&file); root.toCborValue().toCbor(w); @@ -73,7 +91,7 @@ void FileOps::saveConfig() { } void FileOps::loadUIState() { - QFile file(Config::Directories::stateFile); + QFile file(Directories::stateFile); if (file.open(QFile::ReadOnly)) { // file exists! read in QCborStreamReader read(&file); auto root = QCborValue::fromCbor(read).toMap(); @@ -88,7 +106,7 @@ void FileOps::loadUIState() { } void FileOps::saveUIState() { - QFileInfo fi(Config::Directories::stateFile); + QFileInfo fi(Directories::stateFile); fi.dir().mkpath("."); // make sure directory exists QFile file(fi.filePath()); diff --git a/xybrid/settingsdialog.cpp b/xybrid/settingsdialog.cpp index 478eba6..08ca0de 100644 --- a/xybrid/settingsdialog.cpp +++ b/xybrid/settingsdialog.cpp @@ -3,14 +3,37 @@ using namespace Xybrid; +#include +#include + +#include "fileops.h" +#include "config/uiconfig.h" +using namespace Xybrid::Config; + SettingsDialog* SettingsDialog::instance = nullptr; +namespace { + std::vector>* bnd; + + void bind(QCheckBox* o, bool& v) { + o->setChecked(v); + bnd->push_back([o, &v] { + v = o->isChecked(); + }); + } +} + SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SettingsDialog) { ui->setupUi(this); + connect(ui->buttonBox->button(QDialogButtonBox::Apply), &QPushButton::clicked, this, &SettingsDialog::apply); + instance = this; + bnd = &this->binds; + + bind(ui->checkVerticalKnobs, UIConfig::verticalKnobs); } SettingsDialog::~SettingsDialog() { @@ -18,8 +41,15 @@ SettingsDialog::~SettingsDialog() { delete ui; } -void SettingsDialog::closeEvent(QCloseEvent *) { +void SettingsDialog::apply() { + for (auto& f : binds) f(); + FileOps::saveConfig(); +} + +void SettingsDialog::reject() { + QDialog::reject(); if (instance == this) instance = nullptr; + deleteLater(); } void SettingsDialog::tryOpen() { @@ -33,3 +63,4 @@ void SettingsDialog::tryOpen() { } + diff --git a/xybrid/settingsdialog.h b/xybrid/settingsdialog.h index 706638b..af11bc9 100644 --- a/xybrid/settingsdialog.h +++ b/xybrid/settingsdialog.h @@ -2,6 +2,8 @@ #include +#include + namespace Ui { class SettingsDialog; } @@ -10,16 +12,21 @@ namespace Xybrid { class SettingsDialog : public QDialog { Q_OBJECT + std::vector> binds; + public: static SettingsDialog* instance; explicit SettingsDialog(QWidget *parent = nullptr); ~SettingsDialog() override; - void closeEvent(QCloseEvent*) override; - static void tryOpen(); + public slots: + + void apply(); + void reject() override; + private: Ui::SettingsDialog *ui; }; diff --git a/xybrid/settingsdialog.ui b/xybrid/settingsdialog.ui index 080faea..ef4724c 100644 --- a/xybrid/settingsdialog.ui +++ b/xybrid/settingsdialog.ui @@ -32,16 +32,59 @@ - 1 + 0 - + + + + 642 + 0 + + - Tab 1 + UI + + + 4 + + + 4 + + + 4 + + + 4 + + + 4 + + + + + Knobs scroll vertically + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + - + - Tab 2 + About