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) | ||||