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 { more ui options for laptop stuff {
invert scrollwheel (knobs) - invert scrollwheel (knobs)
maybe scroll sensitivity maybe scroll sensitivity
} }
- fix space on note or port column (previewing) generating an undo action add common oscillators to a nodelib header
- make space preview on port column
- fix strut not working except to overwrite another param
- add negate function to param columns
- multi select negate
revert-to-saved menu action revert-to-saved menu action

View File

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

View File

@ -4,5 +4,8 @@ namespace Xybrid::Config {
namespace UIConfig { namespace UIConfig {
/// Determines if KnobGadgets turn with vertical mouse movement instead of horizontal. /// Determines if KnobGadgets turn with vertical mouse movement instead of horizontal.
extern bool verticalKnobs; 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; using namespace Xybrid::Config;
namespace { // utilities 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, QString& v) { v = m.toString(v); }
inline void load(QCborValueRef m, bool& v) { v = m.toBool(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)); } 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() { void FileOps::loadConfig() {
QFile file(Config::Directories::configFile); QFile file(Config::Directories::configFile);
@ -46,21 +62,22 @@ void FileOps::loadConfig() {
auto root = QCborValue::fromCbor(read).toMap(); auto root = QCborValue::fromCbor(read).toMap();
file.close(); file.close();
section(directories) { lsection(directories) {
load(directories[qs("projects")], Directories::projects); lvar(Directories, projects);
load(directories[qs("presets")], Directories::presets); lvar(Directories, presets);
} }
section(ui) { lsection(ui) {
load(ui[qs("verticalKnobs")], UIConfig::verticalKnobs); lvar(UIConfig, verticalKnobs);
lvar(UIConfig, invertScrollWheel);
} }
section(audio) { lsection(audio) {
load(audio[qs("playbackSampleRate")], AudioConfig::playbackSampleRate); lvar(AudioConfig, playbackSampleRate);
load(audio[qs("playbackBufferMs")], AudioConfig::playbackBufferMs); lvar(AudioConfig, playbackBufferMs);
load(audio[qs("previewSampleRate")], AudioConfig::previewSampleRate); lvar(AudioConfig, previewSampleRate);
load(audio[qs("previewBufferMs")], AudioConfig::previewBufferMs); lvar(AudioConfig, previewBufferMs);
load(audio[qs("renderSampleRate")], AudioConfig::renderSampleRate); lvar(AudioConfig, renderSampleRate);
} }
} }
@ -79,33 +96,22 @@ void FileOps::saveConfig() {
QCborMap root; QCborMap root;
{ ssection(directories) {
QCborMap dirs; svar(Directories, projects);
svar(Directories, presets);
dirs[qs("projects")] = Directories::projects;
dirs[qs("presets")] = Directories::presets;
root[qs("directories")] = dirs;
} }
{ ssection(ui) {
QCborMap ui; svar(UIConfig, verticalKnobs);
svar(UIConfig, invertScrollWheel);
ui[qs("verticalKnobs")] = UIConfig::verticalKnobs;
root[qs("ui")] = ui;
} }
{ ssection(audio) {
QCborMap audio; svar(AudioConfig, playbackSampleRate);
svar(AudioConfig, playbackBufferMs);
audio[qs("playbackSampleRate")] = AudioConfig::playbackSampleRate; svar(AudioConfig, previewSampleRate);
audio[qs("playbackBufferMs")] = AudioConfig::playbackBufferMs; svar(AudioConfig, previewBufferMs);
audio[qs("previewSampleRate")] = AudioConfig::previewSampleRate; svar(AudioConfig, renderSampleRate);
audio[qs("previewBufferMs")] = AudioConfig::previewBufferMs;
audio[qs("renderSampleRate")] = AudioConfig::renderSampleRate;
root[qs("audio")] = audio;
} }
// write out // write out

View File

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

View File

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

View File

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