You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
1.5KB

  1. #pragma once
  2. #include "widgets/Widget.hpp"
  3. namespace rack {
  4. struct ZoomWidget : virtual Widget {
  5. float zoom = 1.f;
  6. math::Vec getRelativeOffset(math::Vec v, Widget *relative) override {
  7. return Widget::getRelativeOffset(v.mult(zoom), relative);
  8. }
  9. math::Rect getViewport(math::Rect r) override {
  10. r.pos = r.pos.mult(zoom);
  11. r.size = r.size.mult(zoom);
  12. r = Widget::getViewport(r);
  13. r.pos = r.pos.div(zoom);
  14. r.size = r.size.div(zoom);
  15. return r;
  16. }
  17. void setZoom(float zoom) {
  18. if (zoom != this->zoom) {
  19. event::Zoom eZoom;
  20. Widget::onZoom(eZoom);
  21. }
  22. this->zoom = zoom;
  23. }
  24. void draw(NVGcontext *vg) override {
  25. // No need to save the state because that is done in the parent
  26. nvgScale(vg, zoom, zoom);
  27. Widget::draw(vg);
  28. }
  29. void onHover(event::Hover &e) override {
  30. e.pos = e.pos.div(zoom);
  31. Widget::onHover(e);
  32. }
  33. void onButton(event::Button &e) override {
  34. e.pos = e.pos.div(zoom);
  35. Widget::onButton(e);
  36. }
  37. void onHoverKey(event::HoverKey &e) override {
  38. e.pos = e.pos.div(zoom);
  39. Widget::onHoverKey(e);
  40. }
  41. void onHoverText(event::HoverText &e) override {
  42. e.pos = e.pos.div(zoom);
  43. Widget::onHoverText(e);
  44. }
  45. void onHoverScroll(event::HoverScroll &e) override {
  46. e.pos = e.pos.div(zoom);
  47. Widget::onHoverScroll(e);
  48. }
  49. void onDragHover(event::DragHover &e) override {
  50. e.pos = e.pos.div(zoom);
  51. Widget::onDragHover(e);
  52. }
  53. void onPathDrop(event::PathDrop &e) override {
  54. e.pos = e.pos.div(zoom);
  55. Widget::onPathDrop(e);
  56. }
  57. };
  58. } // namespace rack