From e60ed0cf98916a27cd80dd8209d738f12ddc665e Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Tue, 5 Mar 2019 08:27:01 -0500 Subject: [PATCH] Added "invertZoom" to settings. --- include/settings.hpp | 1 + src/app/RackScrollWidget.cpp | 2 ++ src/settings.cpp | 6 ++++++ src/widget/FramebufferWidget.cpp | 3 +++ 4 files changed, 12 insertions(+) diff --git a/include/settings.hpp b/include/settings.hpp index ba8acdb6..ed66015e 100644 --- a/include/settings.hpp +++ b/include/settings.hpp @@ -12,6 +12,7 @@ struct Settings { math::Vec windowSize; math::Vec windowPos; float zoom = 1.0; + bool invertZoom = false; float cableOpacity = 0.5; float cableTension = 0.5; bool allowCursorLock = true; diff --git a/src/app/RackScrollWidget.cpp b/src/app/RackScrollWidget.cpp index 6b5243ac..768a2e0e 100644 --- a/src/app/RackScrollWidget.cpp +++ b/src/app/RackScrollWidget.cpp @@ -93,6 +93,8 @@ void RackScrollWidget::onHoverScroll(const widget::HoverScrollEvent &e) { if ((APP->window->getMods() & WINDOW_MOD_MASK) == WINDOW_MOD_CTRL) { // Increase zoom float zoomDelta = e.scrollDelta.y / 50 / 4; + if (settings.invertZoom) + zoomDelta *= -1; settings.zoom *= std::pow(2, zoomDelta); settings.zoom = math::clamp(settings.zoom, 0.25f, 2.f); zoomPos = e.pos; diff --git a/src/settings.cpp b/src/settings.cpp index d37cc0c4..cd735c37 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -25,6 +25,8 @@ json_t *Settings::toJson() { json_object_set_new(rootJ, "zoom", json_real(zoom)); + json_object_set_new(rootJ, "invertZoom", json_boolean(invertZoom)); + json_object_set_new(rootJ, "cableOpacity", json_real(cableOpacity)); json_object_set_new(rootJ, "cableTension", json_real(cableTension)); @@ -81,6 +83,10 @@ void Settings::fromJson(json_t *rootJ) { if (zoomJ) zoom = json_number_value(zoomJ); + json_t *invertZoomJ = json_object_get(rootJ, "invertZoom"); + if (invertZoomJ) + invertZoom = json_boolean_value(invertZoomJ); + json_t *cableOpacityJ = json_object_get(rootJ, "cableOpacity"); if (cableOpacityJ) cableOpacity = json_number_value(cableOpacityJ); diff --git a/src/widget/FramebufferWidget.cpp b/src/widget/FramebufferWidget.cpp index 85898c22..d75e219b 100644 --- a/src/widget/FramebufferWidget.cpp +++ b/src/widget/FramebufferWidget.cpp @@ -35,6 +35,9 @@ void FramebufferWidget::step() { NVGcontext *vg = APP->window->vg; fbScale = scale; + // Set scale to zero so we must wait for the next draw() call before drawing the framebuffer again. + // Otherwise, if the zoom level is changed while the FramebufferWidget is off-screen, the next draw() call will be skipped, the `dirty` flag will be true, and the framebuffer will be redrawn, but at the wrong scale, since it was not set in draw(). + scale = math::Vec(); // Get subpixel offset in range [0, 1) math::Vec offsetI = offset.floor(); fbOffset = offset.minus(offsetI);