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.

87 lines
2.7KB

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