vertical knob option exists

master
zetaPRIME 2022-03-19 00:58:45 -04:00
parent 0f3da1f094
commit a3be1bded0
5 changed files with 117 additions and 19 deletions

3
notes
View File

@ -32,8 +32,7 @@ parameters {
TODO { TODO {
settings dialog { settings dialog {
actual window about-license info
menu action to open (single instance)
} }
ping-pong for delay ping-pong for delay

View File

@ -3,6 +3,7 @@
#include "uisocket.h" #include "uisocket.h"
#include "config/uistate.h" #include "config/uistate.h"
#include "config/uiconfig.h"
#include <QDebug> #include <QDebug>
@ -29,6 +30,11 @@ namespace FileOps = Xybrid::FileOps;
using namespace Xybrid::Config; 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() { void FileOps::loadConfig() {
QFile file(Config::Directories::configFile); QFile file(Config::Directories::configFile);
if (file.open(QFile::ReadOnly)) { // file exists! read in if (file.open(QFile::ReadOnly)) { // file exists! read in
@ -37,19 +43,23 @@ void FileOps::loadConfig() {
file.close(); file.close();
if (auto dirs = root[qs("directories")].toMap(); !dirs.isEmpty()) { if (auto dirs = root[qs("directories")].toMap(); !dirs.isEmpty()) {
if (auto s = dirs[qs("projects")].toString(); !s.isNull()) Config::Directories::projects = s; load(dirs[qs("projects")], Directories::projects);
if (auto s = dirs[qs("presets")].toString(); !s.isNull()) Config::Directories::presets = s; 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 // make sure directories exist
if (auto d = QDir(Config::Directories::projects); !d.exists()) d.mkpath("."); if (auto d = QDir(Directories::projects); !d.exists()) d.mkpath(".");
if (auto d = QDir(Config::Directories::presets); !d.exists()) d.mkpath("."); if (auto d = QDir(Directories::presets); !d.exists()) d.mkpath(".");
} }
void FileOps::saveConfig() { void FileOps::saveConfig() {
QFileInfo fi(Config::Directories::configFile); QFileInfo fi(Directories::configFile);
fi.dir().mkpath("."); // make sure directory exists fi.dir().mkpath("."); // make sure directory exists
QFile file(fi.filePath()); QFile file(fi.filePath());
@ -60,12 +70,20 @@ void FileOps::saveConfig() {
{ {
QCborMap dirs; QCborMap dirs;
dirs[qs("projects")] = Config::Directories::projects; dirs[qs("projects")] = Directories::projects;
dirs[qs("presets")] = Config::Directories::presets; dirs[qs("presets")] = Directories::presets;
root[qs("directories")] = dirs; root[qs("directories")] = dirs;
} }
{
QCborMap ui;
ui[qs("verticalKnobs")] = UIConfig::verticalKnobs;
root[qs("ui")] = ui;
}
// write out // write out
QCborStreamWriter w(&file); QCborStreamWriter w(&file);
root.toCborValue().toCbor(w); root.toCborValue().toCbor(w);
@ -73,7 +91,7 @@ void FileOps::saveConfig() {
} }
void FileOps::loadUIState() { void FileOps::loadUIState() {
QFile file(Config::Directories::stateFile); QFile file(Directories::stateFile);
if (file.open(QFile::ReadOnly)) { // file exists! read in if (file.open(QFile::ReadOnly)) { // file exists! read in
QCborStreamReader read(&file); QCborStreamReader read(&file);
auto root = QCborValue::fromCbor(read).toMap(); auto root = QCborValue::fromCbor(read).toMap();
@ -88,7 +106,7 @@ void FileOps::loadUIState() {
} }
void FileOps::saveUIState() { void FileOps::saveUIState() {
QFileInfo fi(Config::Directories::stateFile); QFileInfo fi(Directories::stateFile);
fi.dir().mkpath("."); // make sure directory exists fi.dir().mkpath("."); // make sure directory exists
QFile file(fi.filePath()); QFile file(fi.filePath());

View File

@ -3,14 +3,37 @@
using namespace Xybrid; using namespace Xybrid;
#include <QDialogButtonBox>
#include <QPushButton>
#include "fileops.h"
#include "config/uiconfig.h"
using namespace Xybrid::Config;
SettingsDialog* SettingsDialog::instance = nullptr; SettingsDialog* SettingsDialog::instance = nullptr;
namespace {
std::vector<std::function<void()>>* bnd;
void bind(QCheckBox* o, bool& v) {
o->setChecked(v);
bnd->push_back([o, &v] {
v = o->isChecked();
});
}
}
SettingsDialog::SettingsDialog(QWidget *parent) : SettingsDialog::SettingsDialog(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::SettingsDialog) { ui(new Ui::SettingsDialog) {
ui->setupUi(this); ui->setupUi(this);
connect(ui->buttonBox->button(QDialogButtonBox::Apply), &QPushButton::clicked, this, &SettingsDialog::apply);
instance = this; instance = this;
bnd = &this->binds;
bind(ui->checkVerticalKnobs, UIConfig::verticalKnobs);
} }
SettingsDialog::~SettingsDialog() { SettingsDialog::~SettingsDialog() {
@ -18,8 +41,15 @@ SettingsDialog::~SettingsDialog() {
delete ui; 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; if (instance == this) instance = nullptr;
deleteLater();
} }
void SettingsDialog::tryOpen() { void SettingsDialog::tryOpen() {
@ -33,3 +63,4 @@ void SettingsDialog::tryOpen() {
} }

View File

@ -2,6 +2,8 @@
#include <QDialog> #include <QDialog>
#include <functional>
namespace Ui { namespace Ui {
class SettingsDialog; class SettingsDialog;
} }
@ -10,16 +12,21 @@ namespace Xybrid {
class SettingsDialog : public QDialog { class SettingsDialog : public QDialog {
Q_OBJECT Q_OBJECT
std::vector<std::function<void()>> binds;
public: public:
static SettingsDialog* instance; static SettingsDialog* instance;
explicit SettingsDialog(QWidget *parent = nullptr); explicit SettingsDialog(QWidget *parent = nullptr);
~SettingsDialog() override; ~SettingsDialog() override;
void closeEvent(QCloseEvent*) override;
static void tryOpen(); static void tryOpen();
public slots:
void apply();
void reject() override;
private: private:
Ui::SettingsDialog *ui; Ui::SettingsDialog *ui;
}; };

View File

@ -32,16 +32,59 @@
<item> <item>
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>1</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="tab"> <widget class="QWidget" name="tabUI">
<property name="minimumSize">
<size>
<width>642</width>
<height>0</height>
</size>
</property>
<attribute name="title"> <attribute name="title">
<string>Tab 1</string> <string>UI</string>
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="QCheckBox" name="checkVerticalKnobs">
<property name="text">
<string>Knobs scroll vertically</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget> </widget>
<widget class="QWidget" name="tab_2"> <widget class="QWidget" name="tabAbout">
<attribute name="title"> <attribute name="title">
<string>Tab 2</string> <string>About</string>
</attribute> </attribute>
</widget> </widget>
</widget> </widget>