#pragma once #include namespace rack { namespace widget { /** Resizes the scale of appearance and PositionEvents of children. */ struct ZoomWidget : Widget { /** Use setZoom() and getZoom() instead of using this variable directly. */ float zoom = 1.f; math::Vec getRelativeOffset(math::Vec v, Widget* ancestor) override; float getRelativeZoom(Widget* ancestor) override; math::Rect getViewport(math::Rect r) override; float getZoom(); /** Sets zoom scale and triggers DirtyEvent recursively if scale is changed, so children FramebufferWidgets are redrawn. */ void setZoom(float zoom); void draw(const DrawArgs& args) override; void drawLayer(const DrawArgs& args, int layer) override; void onHover(const HoverEvent& e) override { HoverEvent e2 = e; e2.pos = e.pos.div(zoom); Widget::onHover(e2); } void onButton(const ButtonEvent& e) override { ButtonEvent e2 = e; e2.pos = e.pos.div(zoom); Widget::onButton(e2); } void onHoverKey(const HoverKeyEvent& e) override { HoverKeyEvent e2 = e; e2.pos = e.pos.div(zoom); Widget::onHoverKey(e2); } void onHoverText(const HoverTextEvent& e) override { HoverTextEvent e2 = e; e2.pos = e.pos.div(zoom); Widget::onHoverText(e2); } void onHoverScroll(const HoverScrollEvent& e) override { HoverScrollEvent e2 = e; e2.pos = e.pos.div(zoom); Widget::onHoverScroll(e2); } void onDragHover(const DragHoverEvent& e) override { DragHoverEvent e2 = e; e2.pos = e.pos.div(zoom); Widget::onDragHover(e2); } void onPathDrop(const PathDropEvent& e) override { PathDropEvent e2 = e; e2.pos = e.pos.div(zoom); Widget::onPathDrop(e2); } }; } // namespace widget } // namespace rack