From de240c231afe02a91b4fdde96643af70c66a57bf Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Fri, 18 Jan 2019 02:46:27 -0500 Subject: [PATCH] Fix zoom. Move ZoomWidget implementation to source file. --- include/widgets/ZoomWidget.hpp | 31 ++++----------------------- src/app/Scene.cpp | 3 +++ src/app/Toolbar.cpp | 2 -- src/widgets/Widget.cpp | 1 + src/widgets/ZoomWidget.cpp | 38 ++++++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 29 deletions(-) create mode 100644 src/widgets/ZoomWidget.cpp diff --git a/include/widgets/ZoomWidget.hpp b/include/widgets/ZoomWidget.hpp index d8158146..f3a49950 100644 --- a/include/widgets/ZoomWidget.hpp +++ b/include/widgets/ZoomWidget.hpp @@ -8,33 +8,10 @@ namespace rack { struct ZoomWidget : Widget { float zoom = 1.f; - math::Vec getRelativeOffset(math::Vec v, Widget *relative) override { - return Widget::getRelativeOffset(v.mult(zoom), relative); - } - - math::Rect getViewport(math::Rect r) override { - r.pos = r.pos.mult(zoom); - r.size = r.size.mult(zoom); - r = Widget::getViewport(r); - r.pos = r.pos.div(zoom); - r.size = r.size.div(zoom); - return r; - } - - void setZoom(float zoom) { - this->zoom = zoom; - - event::Context eZoomContext; - event::Zoom eZoom; - eZoom.context = &eZoomContext; - Widget::onZoom(eZoom); - } - - void draw(NVGcontext *vg) override { - // No need to save the state because that is done in the parent - nvgScale(vg, zoom, zoom); - Widget::draw(vg); - } + math::Vec getRelativeOffset(math::Vec v, Widget *relative) override; + math::Rect getViewport(math::Rect r) override; + void setZoom(float zoom); + void draw(NVGcontext *vg) override; void onHover(const event::Hover &e) override { event::Hover e2 = e; diff --git a/src/app/Scene.cpp b/src/app/Scene.cpp index 52297aa4..7e40a62e 100644 --- a/src/app/Scene.cpp +++ b/src/app/Scene.cpp @@ -6,6 +6,7 @@ #include "app/RackScrollWidget.hpp" #include "app.hpp" #include "history.hpp" +#include "settings.hpp" #include @@ -52,6 +53,8 @@ void Scene::step() { zoomWidget->box.size = rackWidget->box.size.mult(zoomWidget->zoom); moduleBrowser->box.size = box.size; + zoomWidget->setZoom(settings::zoom); + // Request latest version from server if (!devMode && checkVersion && !checkedVersion) { std::thread t(&Scene::runCheckVersion, this); diff --git a/src/app/Toolbar.cpp b/src/app/Toolbar.cpp index b79ada5c..88426dac 100644 --- a/src/app/Toolbar.cpp +++ b/src/app/Toolbar.cpp @@ -152,7 +152,6 @@ struct ZoomQuantity : Quantity { void setDisplayValue(float displayValue) override {setValue(displayValue / 100.0);} std::string getLabel() override {return "Zoom";} std::string getUnit() override {return "%";} - int getDisplayPrecision() override {return 0;} }; @@ -168,7 +167,6 @@ struct CableOpacityQuantity : Quantity { void setDisplayValue(float displayValue) override {setValue(displayValue / 100.0);} std::string getLabel() override {return "Cable opacity";} std::string getUnit() override {return "%";} - int getDisplayPrecision() override {return 0;} }; diff --git a/src/widgets/Widget.cpp b/src/widgets/Widget.cpp index 754e1cbe..0b3c24c0 100644 --- a/src/widgets/Widget.cpp +++ b/src/widgets/Widget.cpp @@ -6,6 +6,7 @@ namespace rack { + Widget::~Widget() { // You should only delete orphaned widgets assert(!parent); diff --git a/src/widgets/ZoomWidget.cpp b/src/widgets/ZoomWidget.cpp new file mode 100644 index 00000000..5c2eed1e --- /dev/null +++ b/src/widgets/ZoomWidget.cpp @@ -0,0 +1,38 @@ +#include "widgets/ZoomWidget.hpp" + + +namespace rack { + + +math::Vec ZoomWidget::getRelativeOffset(math::Vec v, Widget *relative) { + return Widget::getRelativeOffset(v.mult(zoom), relative); +} + +math::Rect ZoomWidget::getViewport(math::Rect r) { + r.pos = r.pos.mult(zoom); + r.size = r.size.mult(zoom); + r = Widget::getViewport(r); + r.pos = r.pos.div(zoom); + r.size = r.size.div(zoom); + return r; +} + +void ZoomWidget::setZoom(float zoom) { + if (zoom == this->zoom) + return; + this->zoom = zoom; + + event::Context eZoomContext; + event::Zoom eZoom; + eZoom.context = &eZoomContext; + Widget::onZoom(eZoom); +} + +void ZoomWidget::draw(NVGcontext *vg) { + // No need to save the state because that is done in the parent + nvgScale(vg, zoom, zoom); + Widget::draw(vg); +} + + +} // namespace rack