| @@ -38,6 +38,8 @@ extern math::Vec windowSize; | |||||
| extern math::Vec windowPos; | extern math::Vec windowPos; | ||||
| /** Rack zoom level, log2. E.g. 100% = 0, 200% = 1, 50% = -1. */ | /** Rack zoom level, log2. E.g. 100% = 0, 200% = 1, 50% = -1. */ | ||||
| extern float zoom; | extern float zoom; | ||||
| static const float zoomMax = 2.f; | |||||
| static const float zoomMin = -2.f; | |||||
| /** Reverse the zoom scroll direction */ | /** Reverse the zoom scroll direction */ | ||||
| extern bool invertZoom; | extern bool invertZoom; | ||||
| /** Opacity of cables in the range [0, 1] */ | /** Opacity of cables in the range [0, 1] */ | ||||
| @@ -325,10 +325,10 @@ struct ZoomQuantity : Quantity { | |||||
| return settings::zoom; | return settings::zoom; | ||||
| } | } | ||||
| float getMinValue() override { | float getMinValue() override { | ||||
| return -2.0; | |||||
| return settings::zoomMin; | |||||
| } | } | ||||
| float getMaxValue() override { | float getMaxValue() override { | ||||
| return 2.0; | |||||
| return settings::zoomMax; | |||||
| } | } | ||||
| float getDefaultValue() override { | float getDefaultValue() override { | ||||
| return 0.0; | return 0.0; | ||||
| @@ -28,8 +28,6 @@ void RackScrollWidget::reset() { | |||||
| void RackScrollWidget::step() { | void RackScrollWidget::step() { | ||||
| // Clamp zoom | |||||
| settings::zoom = math::clamp(settings::zoom, -2.f, 2.f); | |||||
| // Compute zoom from exponential zoom | // Compute zoom from exponential zoom | ||||
| float zoom = std::pow(2.f, settings::zoom); | float zoom = std::pow(2.f, settings::zoom); | ||||
| if (zoom != zoomWidget->zoom) { | if (zoom != zoomWidget->zoom) { | ||||
| @@ -137,6 +135,11 @@ void RackScrollWidget::onHoverScroll(const HoverScrollEvent& e) { | |||||
| if (settings::invertZoom) | if (settings::invertZoom) | ||||
| zoomDelta *= -1; | zoomDelta *= -1; | ||||
| settings::zoom += zoomDelta; | settings::zoom += zoomDelta; | ||||
| // Limit min/max depending on the direction of zooming | |||||
| if (zoomDelta > 0.f) | |||||
| settings::zoom = std::fmin(settings::zoom, settings::zoomMax); | |||||
| else | |||||
| settings::zoom = std::fmax(settings::zoom, settings::zoomMin); | |||||
| zoomPos = e.pos; | zoomPos = e.pos; | ||||
| e.consume(this); | e.consume(this); | ||||
| } | } | ||||
| @@ -162,10 +165,12 @@ void RackScrollWidget::onButton(const ButtonEvent& e) { | |||||
| if (e.action == GLFW_PRESS) { | if (e.action == GLFW_PRESS) { | ||||
| if (e.button == GLFW_MOUSE_BUTTON_4) { | if (e.button == GLFW_MOUSE_BUTTON_4) { | ||||
| settings::zoom -= 0.5f; | settings::zoom -= 0.5f; | ||||
| settings::zoom = std::fmax(settings::zoom, settings::zoomMin); | |||||
| e.consume(this); | e.consume(this); | ||||
| } | } | ||||
| if (e.button == GLFW_MOUSE_BUTTON_5) { | if (e.button == GLFW_MOUSE_BUTTON_5) { | ||||
| settings::zoom += 0.5f; | settings::zoom += 0.5f; | ||||
| settings::zoom = std::fmin(settings::zoom, settings::zoomMax); | |||||
| e.consume(this); | e.consume(this); | ||||
| } | } | ||||
| } | } | ||||
| @@ -152,6 +152,7 @@ void Scene::onHoverKey(const HoverKeyEvent& e) { | |||||
| zoom = std::ceil(zoom - 0.01f) - 1; | zoom = std::ceil(zoom - 0.01f) - 1; | ||||
| zoom /= 2; | zoom /= 2; | ||||
| settings::zoom = zoom; | settings::zoom = zoom; | ||||
| settings::zoom = std::fmax(settings::zoom, settings::zoomMin); | |||||
| e.consume(this); | e.consume(this); | ||||
| } | } | ||||
| // Numpad has a "+" key, but the main keyboard section hides it under "=" | // Numpad has a "+" key, but the main keyboard section hides it under "=" | ||||
| @@ -161,6 +162,7 @@ void Scene::onHoverKey(const HoverKeyEvent& e) { | |||||
| zoom = std::floor(zoom + 0.01f) + 1; | zoom = std::floor(zoom + 0.01f) + 1; | ||||
| zoom /= 2; | zoom /= 2; | ||||
| settings::zoom = zoom; | settings::zoom = zoom; | ||||
| settings::zoom = std::fmin(settings::zoom, settings::zoomMax); | |||||
| e.consume(this); | e.consume(this); | ||||
| } | } | ||||
| if ((e.keyName == "0") && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | if ((e.keyName == "0") && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | ||||