invert scrollwheel option (for knobs etc.); some magic to make config less annoying

master
Zithia Satazaki 2022-03-29 17:36:10 -04:00
parent ab811c363c
commit a7ece838f1
7 changed files with 58 additions and 44 deletions

9
notes
View File

@ -36,16 +36,11 @@ TODO {
}
more ui options for laptop stuff {
invert scrollwheel (knobs)
- invert scrollwheel (knobs)
maybe scroll sensitivity
}
- fix space on note or port column (previewing) generating an undo action
- make space preview on port column
- fix strut not working except to overwrite another param
- add negate function to param columns
- multi select negate
add common oscillators to a nodelib header
revert-to-saved menu action

View File

@ -18,6 +18,7 @@ int AudioConfig::renderSampleRate = 48000;
// UIConfig defaults
bool UIConfig::verticalKnobs = false;
bool UIConfig::invertScrollWheel = false;
// instantiate color scheme
ColorScheme Xybrid::Config::colorScheme;

View File

@ -4,5 +4,8 @@ namespace Xybrid::Config {
namespace UIConfig {
/// Determines if KnobGadgets turn with vertical mouse movement instead of horizontal.
extern bool verticalKnobs;
/// Controls if scroll wheel function is inverted for knobs, etc.
extern bool invertScrollWheel;
}
}

View File

@ -32,12 +32,28 @@ namespace FileOps = Xybrid::FileOps;
using namespace Xybrid::Config;
namespace { // utilities
struct _MapSaver {
QCborMap& root;
QString name;
QCborMap map;
_MapSaver(QCborMap& root, const QString& name) : root(root), name(name) { }
~_MapSaver() {
root[name] = map;
}
inline auto operator[](const QString& s) { return map[s]; }
};
inline void load(QCborValueRef m, QString& v) { v = m.toString(v); }
inline void load(QCborValueRef m, bool& v) { v = m.toBool(v); }
inline void load(QCborValueRef m, int& v) { v = static_cast<int>(m.toInteger(v)); }
}
#define section(NAME) if (auto NAME = root[qs(#NAME)].toMap(); !NAME.isEmpty())
#define lsection(NAME) if (auto _sec = root[qs(#NAME)].toMap(); !_sec.isEmpty())
#define lvar(NS, NAME) load(_sec[qs(#NAME)], NS::NAME)
#define ssection(NAME) if (_MapSaver _sec(root, qs(#NAME)) ; true)
#define svar(NS, NAME) _sec[qs(#NAME)] = NS::NAME
void FileOps::loadConfig() {
QFile file(Config::Directories::configFile);
@ -46,21 +62,22 @@ void FileOps::loadConfig() {
auto root = QCborValue::fromCbor(read).toMap();
file.close();
section(directories) {
load(directories[qs("projects")], Directories::projects);
load(directories[qs("presets")], Directories::presets);
lsection(directories) {
lvar(Directories, projects);
lvar(Directories, presets);
}
section(ui) {
load(ui[qs("verticalKnobs")], UIConfig::verticalKnobs);
lsection(ui) {
lvar(UIConfig, verticalKnobs);
lvar(UIConfig, invertScrollWheel);
}
section(audio) {
load(audio[qs("playbackSampleRate")], AudioConfig::playbackSampleRate);
load(audio[qs("playbackBufferMs")], AudioConfig::playbackBufferMs);
load(audio[qs("previewSampleRate")], AudioConfig::previewSampleRate);
load(audio[qs("previewBufferMs")], AudioConfig::previewBufferMs);
load(audio[qs("renderSampleRate")], AudioConfig::renderSampleRate);
lsection(audio) {
lvar(AudioConfig, playbackSampleRate);
lvar(AudioConfig, playbackBufferMs);
lvar(AudioConfig, previewSampleRate);
lvar(AudioConfig, previewBufferMs);
lvar(AudioConfig, renderSampleRate);
}
}
@ -79,33 +96,22 @@ void FileOps::saveConfig() {
QCborMap root;
{
QCborMap dirs;
dirs[qs("projects")] = Directories::projects;
dirs[qs("presets")] = Directories::presets;
root[qs("directories")] = dirs;
ssection(directories) {
svar(Directories, projects);
svar(Directories, presets);
}
{
QCborMap ui;
ui[qs("verticalKnobs")] = UIConfig::verticalKnobs;
root[qs("ui")] = ui;
ssection(ui) {
svar(UIConfig, verticalKnobs);
svar(UIConfig, invertScrollWheel);
}
{
QCborMap audio;
audio[qs("playbackSampleRate")] = AudioConfig::playbackSampleRate;
audio[qs("playbackBufferMs")] = AudioConfig::playbackBufferMs;
audio[qs("previewSampleRate")] = AudioConfig::previewSampleRate;
audio[qs("previewBufferMs")] = AudioConfig::previewBufferMs;
audio[qs("renderSampleRate")] = AudioConfig::renderSampleRate;
root[qs("audio")] = audio;
ssection(audio) {
svar(AudioConfig, playbackSampleRate);
svar(AudioConfig, playbackBufferMs);
svar(AudioConfig, previewSampleRate);
svar(AudioConfig, previewBufferMs);
svar(AudioConfig, renderSampleRate);
}
// write out

View File

@ -83,7 +83,8 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
bind(ui->renderSampleRate, AudioConfig::renderSampleRate, sampleRates);
// UI page
bind(ui->checkVerticalKnobs, UIConfig::verticalKnobs);
bind(ui->verticalKnobs, UIConfig::verticalKnobs);
bind(ui->invertScrollWheel, UIConfig::invertScrollWheel);
}
SettingsDialog::~SettingsDialog() {

View File

@ -230,12 +230,19 @@
<number>4</number>
</property>
<item>
<widget class="QCheckBox" name="checkVerticalKnobs">
<widget class="QCheckBox" name="verticalKnobs">
<property name="text">
<string>Knobs scroll vertically</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="invertScrollWheel">
<property name="text">
<string>Invert scroll wheel for knobs, sliders, etc.</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">

View File

@ -190,6 +190,7 @@ void KnobGadget::wheelEvent(QGraphicsSceneWheelEvent* e) {
wAcc += e->delta();
auto d = accumulate(wAcc, 120);
if (d == 0) return; // don't need to update anything if incomplete accumulation
if (UIConfig::invertScrollWheel) d *= -1;
auto mod = e->modifiers();
if (highlighted) { // wheel while dragging