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.

91 lines
2.8KB

  1. #pragma once
  2. #include "widgets/Widget.hpp"
  3. #include "event.hpp"
  4. namespace rack {
  5. /** A widget that responds to events */
  6. struct EventWidget : Widget {
  7. void handleEvent(event::Event &e) override {
  8. // Call visitor's visit method
  9. e.trigger(this);
  10. }
  11. template <class TEvent>
  12. void recurseEvent(TEvent &e) {
  13. for (auto it = children.rbegin(); it != children.rend(); it++) {
  14. Widget *child = *it;
  15. if (!child->visible)
  16. continue;
  17. if (!child->box.contains(e.pos))
  18. continue;
  19. // Clone event so modifications do not up-propagate
  20. TEvent e2 = e;
  21. e2.pos = e.pos.minus(child->box.pos);
  22. child->handleEvent(e2);
  23. // Up-propagate target if consumed
  24. if (e2.target) {
  25. e.target = e2.target;
  26. break;
  27. }
  28. }
  29. }
  30. /** Override these event callbacks to respond to events.
  31. See events.hpp for a description of each event.
  32. */
  33. virtual void on(event::Hover &e) {recurseEvent(e);}
  34. virtual void on(event::Button &e) {recurseEvent(e);}
  35. virtual void on(event::HoverKey &e) {recurseEvent(e);}
  36. virtual void on(event::HoverText &e) {recurseEvent(e);}
  37. virtual void on(event::HoverScroll &e) {recurseEvent(e);}
  38. virtual void on(event::Enter &e) {}
  39. virtual void on(event::Leave &e) {}
  40. virtual void on(event::Select &e) {}
  41. virtual void on(event::Deselect &e) {}
  42. virtual void on(event::SelectKey &e) {}
  43. virtual void on(event::SelectText &e) {}
  44. virtual void on(event::DragStart &e) {}
  45. virtual void on(event::DragEnd &e) {}
  46. virtual void on(event::DragMove &e) {}
  47. virtual void on(event::DragEnter &e) {}
  48. virtual void on(event::DragLeave &e) {}
  49. virtual void on(event::DragDrop &e) {}
  50. virtual void on(event::PathDrop &e) {recurseEvent(e);}
  51. virtual void on(event::Action &e) {}
  52. virtual void on(event::Change &e) {}
  53. virtual void on(event::Zoom &e) {}
  54. };
  55. /** These definitions simply call each `EventWidget::on()` function above.
  56. They need to be defined here because EventWidget is not defined at the time of each event's definition.
  57. */
  58. EVENT_TRIGGER_DEFINITION(event::Hover)
  59. EVENT_TRIGGER_DEFINITION(event::Button)
  60. EVENT_TRIGGER_DEFINITION(event::HoverKey)
  61. EVENT_TRIGGER_DEFINITION(event::HoverText)
  62. EVENT_TRIGGER_DEFINITION(event::HoverScroll)
  63. EVENT_TRIGGER_DEFINITION(event::Enter)
  64. EVENT_TRIGGER_DEFINITION(event::Leave)
  65. EVENT_TRIGGER_DEFINITION(event::Select)
  66. EVENT_TRIGGER_DEFINITION(event::Deselect)
  67. EVENT_TRIGGER_DEFINITION(event::SelectKey)
  68. EVENT_TRIGGER_DEFINITION(event::SelectText)
  69. EVENT_TRIGGER_DEFINITION(event::DragStart)
  70. EVENT_TRIGGER_DEFINITION(event::DragEnd)
  71. EVENT_TRIGGER_DEFINITION(event::DragMove)
  72. EVENT_TRIGGER_DEFINITION(event::DragEnter)
  73. EVENT_TRIGGER_DEFINITION(event::DragLeave)
  74. EVENT_TRIGGER_DEFINITION(event::DragDrop)
  75. EVENT_TRIGGER_DEFINITION(event::PathDrop)
  76. EVENT_TRIGGER_DEFINITION(event::Action)
  77. EVENT_TRIGGER_DEFINITION(event::Change)
  78. EVENT_TRIGGER_DEFINITION(event::Zoom)
  79. } // namespace rack