Closes #117 Signed-off-by: falkTX <falktx@falktx.com>tags/22.02
| @@ -54,6 +54,12 @@ | |||||
| # include <unistd.h> | # include <unistd.h> | ||||
| #endif | #endif | ||||
| namespace rack { | |||||
| namespace settings { | |||||
| int rateLimit = 0; | |||||
| } | |||||
| } | |||||
| namespace patchUtils | namespace patchUtils | ||||
| { | { | ||||
| @@ -27,9 +27,15 @@ | |||||
| namespace rack | namespace rack | ||||
| { | { | ||||
| namespace settings { | |||||
| extern int rateLimit; | |||||
| } | |||||
| namespace ui { | namespace ui { | ||||
| struct Menu; | struct Menu; | ||||
| } | } | ||||
| } | } | ||||
| namespace patchUtils | namespace patchUtils | ||||
| @@ -376,6 +376,7 @@ public: | |||||
| fWindowParameters[kWindowParameterWheelKnobControl] = 0.0f; | fWindowParameters[kWindowParameterWheelKnobControl] = 0.0f; | ||||
| fWindowParameters[kWindowParameterWheelSensitivity] = 1.0f; | fWindowParameters[kWindowParameterWheelSensitivity] = 1.0f; | ||||
| fWindowParameters[kWindowParameterLockModulePositions] = 0.0f; | fWindowParameters[kWindowParameterLockModulePositions] = 0.0f; | ||||
| fWindowParameters[kWindowParameterUpdateRateLimit] = 0.0f; | |||||
| #endif | #endif | ||||
| // create unique temporary path for this instance | // create unique temporary path for this instance | ||||
| @@ -751,6 +752,23 @@ protected: | |||||
| parameter.ranges.min = 0.0f; | parameter.ranges.min = 0.0f; | ||||
| parameter.ranges.max = 1.0f; | parameter.ranges.max = 1.0f; | ||||
| break; | break; | ||||
| case kWindowParameterUpdateRateLimit: | |||||
| parameter.name = "Update rate limit"; | |||||
| parameter.symbol = "rateLimit"; | |||||
| parameter.hints = kParameterIsAutomatable|kParameterIsInteger; | |||||
| parameter.ranges.def = 0.0f; | |||||
| parameter.ranges.min = 0.0f; | |||||
| parameter.ranges.max = 2.0f; | |||||
| parameter.enumValues.count = 3; | |||||
| parameter.enumValues.restrictedMode = true; | |||||
| parameter.enumValues.values = new ParameterEnumerationValue[3]; | |||||
| parameter.enumValues.values[0].label = "None"; | |||||
| parameter.enumValues.values[0].value = 0.0f; | |||||
| parameter.enumValues.values[1].label = "2x"; | |||||
| parameter.enumValues.values[1].value = 1.0f; | |||||
| parameter.enumValues.values[2].label = "4x"; | |||||
| parameter.enumValues.values[2].value = 2.0f; | |||||
| break; | |||||
| } | } | ||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -233,6 +233,7 @@ class CardinalUI : public CardinalBaseUI, | |||||
| rack::math::Vec fLastMousePos; | rack::math::Vec fLastMousePos; | ||||
| ResizeHandle fResizeHandle; | ResizeHandle fResizeHandle; | ||||
| WindowParameters fWindowParameters; | WindowParameters fWindowParameters; | ||||
| int fRateLimitStep = 0; | |||||
| struct ScopedContext { | struct ScopedContext { | ||||
| CardinalPluginContext* const context; | CardinalPluginContext* const context; | ||||
| @@ -361,6 +362,10 @@ public: | |||||
| filebrowserhandle = nullptr; | filebrowserhandle = nullptr; | ||||
| } | } | ||||
| if (fWindowParameters.rateLimit != 0 && ++fRateLimitStep % (fWindowParameters.rateLimit * 2)) | |||||
| return; | |||||
| fRateLimitStep = 0; | |||||
| repaint(); | repaint(); | ||||
| } | } | ||||
| @@ -416,6 +421,10 @@ public: | |||||
| case kWindowParameterLockModulePositions: | case kWindowParameterLockModulePositions: | ||||
| fWindowParameters.lockModules = value > 0.5f; | fWindowParameters.lockModules = value > 0.5f; | ||||
| break; | break; | ||||
| case kWindowParameterUpdateRateLimit: | |||||
| fWindowParameters.rateLimit = static_cast<int>(value + 0.5f); | |||||
| fRateLimitStep = 0; | |||||
| break; | |||||
| default: | default: | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -476,6 +485,10 @@ protected: | |||||
| case kWindowParameterLockModulePositions: | case kWindowParameterLockModulePositions: | ||||
| fWindowParameters.lockModules = value > 0.5f; | fWindowParameters.lockModules = value > 0.5f; | ||||
| break; | break; | ||||
| case kWindowParameterUpdateRateLimit: | |||||
| fWindowParameters.rateLimit = static_cast<int>(value + 0.5f); | |||||
| fRateLimitStep = 0; | |||||
| break; | |||||
| default: | default: | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -43,6 +43,7 @@ enum WindowParameterList { | |||||
| kWindowParameterWheelKnobControl, | kWindowParameterWheelKnobControl, | ||||
| kWindowParameterWheelSensitivity, | kWindowParameterWheelSensitivity, | ||||
| kWindowParameterLockModulePositions, | kWindowParameterLockModulePositions, | ||||
| kWindowParameterUpdateRateLimit, | |||||
| kWindowParameterCount, | kWindowParameterCount, | ||||
| }; | }; | ||||
| @@ -56,6 +57,8 @@ struct WindowParameters { | |||||
| bool tooltips = true; | bool tooltips = true; | ||||
| bool knobScroll = false; | bool knobScroll = false; | ||||
| bool lockModules = false; | bool lockModules = false; | ||||
| // cardinal specific | |||||
| int rateLimit = 0; | |||||
| }; | }; | ||||
| struct WindowParametersCallback { | struct WindowParametersCallback { | ||||
| @@ -507,6 +507,21 @@ struct ViewButton : MenuButton { | |||||
| menu->addChild(knobScrollSensitivitySlider); | menu->addChild(knobScrollSensitivitySlider); | ||||
| menu->addChild(createBoolPtrMenuItem("Lock module positions", "", &settings::lockModules)); | menu->addChild(createBoolPtrMenuItem("Lock module positions", "", &settings::lockModules)); | ||||
| static const std::vector<std::string> rateLimitLabels = { | |||||
| "None", | |||||
| "2x", | |||||
| "4x", | |||||
| }; | |||||
| static const std::vector<int> rateLimits = {0, 1, 2}; | |||||
| menu->addChild(createSubmenuItem("Update rate limit", rateLimitLabels[settings::rateLimit], [=](ui::Menu* menu) { | |||||
| for (int rateLimit : rateLimits) { | |||||
| menu->addChild(createCheckMenuItem(rateLimitLabels[rateLimit], "", | |||||
| [=]() {return settings::rateLimit == rateLimit;}, | |||||
| [=]() {settings::rateLimit = rateLimit;} | |||||
| )); | |||||
| } | |||||
| })); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -45,6 +45,7 @@ | |||||
| #include "DistrhoUI.hpp" | #include "DistrhoUI.hpp" | ||||
| #include "Application.hpp" | #include "Application.hpp" | ||||
| #include "../CardinalCommon.hpp" | |||||
| #include "../WindowParameters.hpp" | #include "../WindowParameters.hpp" | ||||
| #ifndef DGL_NO_SHARED_RESOURCES | #ifndef DGL_NO_SHARED_RESOURCES | ||||
| @@ -138,6 +139,7 @@ struct Window::Internal { | |||||
| double monitorRefreshRate = 60.0; // FIXME | double monitorRefreshRate = 60.0; // FIXME | ||||
| double frameTime = 0.0; | double frameTime = 0.0; | ||||
| double lastFrameDuration = 0.0; | double lastFrameDuration = 0.0; | ||||
| int currentRateLimit = 0; | |||||
| std::map<std::string, std::shared_ptr<FontWithOriginalContext>> fontCache; | std::map<std::string, std::shared_ptr<FontWithOriginalContext>> fontCache; | ||||
| std::map<std::string, std::shared_ptr<ImageWithOriginalContext>> imageCache; | std::map<std::string, std::shared_ptr<ImageWithOriginalContext>> imageCache; | ||||
| @@ -593,6 +595,13 @@ void WindowParametersSave(rack::window::Window* const window) | |||||
| window->internal->callback->WindowParametersChanged(kWindowParameterLockModulePositions, | window->internal->callback->WindowParametersChanged(kWindowParameterLockModulePositions, | ||||
| rack::settings::lockModules); | rack::settings::lockModules); | ||||
| } | } | ||||
| if (window->internal->params.rateLimit != rack::settings::rateLimit) | |||||
| { | |||||
| window->internal->params.rateLimit = rack::settings::rateLimit; | |||||
| if (window->internal->callback != nullptr) | |||||
| window->internal->callback->WindowParametersChanged(kWindowParameterUpdateRateLimit, | |||||
| rack::settings::rateLimit); | |||||
| } | |||||
| } | } | ||||
| void WindowParametersRestore(rack::window::Window* const window) | void WindowParametersRestore(rack::window::Window* const window) | ||||
| @@ -606,6 +615,7 @@ void WindowParametersRestore(rack::window::Window* const window) | |||||
| rack::settings::tooltips = window->internal->params.tooltips; | rack::settings::tooltips = window->internal->params.tooltips; | ||||
| rack::settings::knobScroll = window->internal->params.knobScroll; | rack::settings::knobScroll = window->internal->params.knobScroll; | ||||
| rack::settings::lockModules = window->internal->params.lockModules; | rack::settings::lockModules = window->internal->params.lockModules; | ||||
| rack::settings::rateLimit = window->internal->params.rateLimit; | |||||
| } | } | ||||
| void WindowParametersSetCallback(rack::window::Window* const window, WindowParametersCallback* const callback) | void WindowParametersSetCallback(rack::window::Window* const window, WindowParametersCallback* const callback) | ||||