#pragma once #include "widgets/EventWidget.hpp" namespace rack { struct ZoomWidget : virtual EventWidget { 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) { if (zoom != this->zoom) { event::Zoom eZoom; EventWidget::on(eZoom); } this->zoom = zoom; } 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); } void on(event::Hover &e) override { event::Hover e2 = e; e2.pos = e.pos.div(zoom); EventWidget::on(e2); } void on(event::Button &e) override { event::Button e2 = e; e2.pos = e.pos.div(zoom); EventWidget::on(e2); } void on(event::HoverKey &e) override { event::HoverKey e2 = e; e2.pos = e.pos.div(zoom); EventWidget::on(e2); } void on(event::HoverText &e) override { event::HoverText e2 = e; e2.pos = e.pos.div(zoom); EventWidget::on(e2); } void on(event::HoverScroll &e) override { event::HoverScroll e2 = e; e2.pos = e.pos.div(zoom); EventWidget::on(e2); } void on(event::PathDrop &e) override { event::PathDrop e2 = e; e2.pos = e.pos.div(zoom); EventWidget::on(e2); } }; } // namespace rack