| @@ -10,7 +10,11 @@ namespace rack { | |||||
| struct Switch : ParamWidget { | struct Switch : ParamWidget { | ||||
| /** Return to original position when released */ | /** Return to original position when released */ | ||||
| bool momentary = false; | bool momentary = false; | ||||
| /** Hysteresis state for momentary switch */ | |||||
| bool momentaryPressed = false; | |||||
| bool momentaryReleased = false; | |||||
| void step() override; | |||||
| void onDragStart(const event::DragStart &e) override; | void onDragStart(const event::DragStart &e) override; | ||||
| void onDragEnd(const event::DragEnd &e) override; | void onDragEnd(const event::DragEnd &e) override; | ||||
| }; | }; | ||||
| @@ -7,11 +7,27 @@ | |||||
| namespace rack { | namespace rack { | ||||
| void Switch::step() { | |||||
| if (momentaryPressed) { | |||||
| momentaryPressed = false; | |||||
| // Wait another frame. | |||||
| } | |||||
| else if (momentaryReleased) { | |||||
| momentaryReleased = false; | |||||
| if (paramQuantity) { | |||||
| // Set to minimum value | |||||
| paramQuantity->setMin(); | |||||
| } | |||||
| } | |||||
| ParamWidget::step(); | |||||
| } | |||||
| void Switch::onDragStart(const event::DragStart &e) { | void Switch::onDragStart(const event::DragStart &e) { | ||||
| if (momentary) { | if (momentary) { | ||||
| if (paramQuantity) { | if (paramQuantity) { | ||||
| // Set to maximum value | // Set to maximum value | ||||
| paramQuantity->setMax(); | paramQuantity->setMax(); | ||||
| momentaryPressed = true; | |||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| @@ -41,10 +57,7 @@ void Switch::onDragStart(const event::DragStart &e) { | |||||
| void Switch::onDragEnd(const event::DragEnd &e) { | void Switch::onDragEnd(const event::DragEnd &e) { | ||||
| if (momentary) { | if (momentary) { | ||||
| if (paramQuantity) { | |||||
| // Set to minimum value | |||||
| paramQuantity->setMin(); | |||||
| } | |||||
| momentaryReleased = true; | |||||
| } | } | ||||
| } | } | ||||
| @@ -77,7 +77,7 @@ int main(int argc, char *argv[]) { | |||||
| gamepad::init(); | gamepad::init(); | ||||
| ui::init(); | ui::init(); | ||||
| plugin::init(devMode); | plugin::init(devMode); | ||||
| INFO("Initialized environment") | |||||
| INFO("Initialized environment"); | |||||
| // Initialize app | // Initialize app | ||||
| appInit(); | appInit(); | ||||
| @@ -105,7 +105,7 @@ int main(int argc, char *argv[]) { | |||||
| app()->scene->rackWidget->load(patchFile); | app()->scene->rackWidget->load(patchFile); | ||||
| app()->scene->rackWidget->lastPath = patchFile; | app()->scene->rackWidget->lastPath = patchFile; | ||||
| } | } | ||||
| INFO("Initialized app") | |||||
| INFO("Initialized app"); | |||||
| app()->engine->start(); | app()->engine->start(); | ||||
| app()->window->run(); | app()->window->run(); | ||||
| @@ -116,14 +116,14 @@ int main(int argc, char *argv[]) { | |||||
| app()->scene->rackWidget->save(asset::user("autosave.vcv")); | app()->scene->rackWidget->save(asset::user("autosave.vcv")); | ||||
| settings::save(asset::user("settings.json")); | settings::save(asset::user("settings.json")); | ||||
| appDestroy(); | appDestroy(); | ||||
| INFO("Cleaned up app") | |||||
| INFO("Cleaned up app"); | |||||
| // Destroy environment | // Destroy environment | ||||
| plugin::destroy(); | plugin::destroy(); | ||||
| ui::destroy(); | ui::destroy(); | ||||
| bridgeDestroy(); | bridgeDestroy(); | ||||
| midi::destroy(); | midi::destroy(); | ||||
| INFO("Cleaned up environment") | |||||
| INFO("Cleaned up environment"); | |||||
| logger::destroy(); | logger::destroy(); | ||||
| return 0; | return 0; | ||||