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.

263 lines
5.8KB

  1. #include "event.hpp"
  2. #include "widgets/Widget.hpp"
  3. namespace rack {
  4. namespace event {
  5. void State::setHovered(Widget *w) {
  6. if (w == hoveredWidget)
  7. return;
  8. if (hoveredWidget) {
  9. // event::Leave
  10. event::Leave eLeave;
  11. hoveredWidget->onLeave(eLeave);
  12. }
  13. hoveredWidget = w;
  14. if (hoveredWidget) {
  15. // event::Enter
  16. event::Enter eEnter;
  17. hoveredWidget->onEnter(eEnter);
  18. }
  19. }
  20. void State::setDragged(Widget *w) {
  21. if (w == draggedWidget)
  22. return;
  23. if (draggedWidget) {
  24. // event::DragEnd
  25. event::DragEnd eDragEnd;
  26. draggedWidget->onDragEnd(eDragEnd);
  27. }
  28. draggedWidget = w;
  29. if (draggedWidget) {
  30. // event::DragStart
  31. event::DragStart eDragStart;
  32. draggedWidget->onDragStart(eDragStart);
  33. }
  34. }
  35. void State::setDragHovered(Widget *w) {
  36. if (w == dragHoveredWidget)
  37. return;
  38. if (dragHoveredWidget) {
  39. // event::DragLeave
  40. event::DragLeave eDragLeave;
  41. eDragLeave.origin = draggedWidget;
  42. dragHoveredWidget->onDragLeave(eDragLeave);
  43. }
  44. dragHoveredWidget = w;
  45. if (dragHoveredWidget) {
  46. // event::DragEnter
  47. event::DragEnter eDragEnter;
  48. eDragEnter.origin = draggedWidget;
  49. dragHoveredWidget->onDragEnter(eDragEnter);
  50. }
  51. }
  52. void State::setSelected(Widget *w) {
  53. if (w == selectedWidget)
  54. return;
  55. if (selectedWidget) {
  56. // event::Deselect
  57. event::Deselect eDeselect;
  58. selectedWidget->onDeselect(eDeselect);
  59. }
  60. selectedWidget = w;
  61. if (selectedWidget) {
  62. // event::Select
  63. event::Select eSelect;
  64. selectedWidget->onSelect(eSelect);
  65. }
  66. }
  67. void State::finalizeWidget(Widget *w) {
  68. if (hoveredWidget == w) setHovered(NULL);
  69. if (draggedWidget == w) setDragged(NULL);
  70. if (dragHoveredWidget == w) setDragHovered(NULL);
  71. if (selectedWidget == w) setSelected(NULL);
  72. if (scrollWidget == w) scrollWidget = NULL;
  73. }
  74. void State::handleButton(math::Vec pos, int button, int action, int mods) {
  75. // event::Button
  76. event::Context eButtonContext;
  77. event::Button eButton;
  78. eButton.context = &eButtonContext;
  79. eButton.pos = pos;
  80. eButton.button = button;
  81. eButton.action = action;
  82. eButton.mods = mods;
  83. rootWidget->onButton(eButton);
  84. Widget *clickedWidget = eButtonContext.consumed;
  85. if (button == GLFW_MOUSE_BUTTON_LEFT) {
  86. if (action == GLFW_PRESS) {
  87. setDragged(clickedWidget);
  88. }
  89. if (action == GLFW_RELEASE) {
  90. setDragHovered(NULL);
  91. if (clickedWidget && draggedWidget) {
  92. // event::DragDrop
  93. event::DragDrop eDragDrop;
  94. eDragDrop.origin = draggedWidget;
  95. clickedWidget->onDragDrop(eDragDrop);
  96. }
  97. setDragged(NULL);
  98. }
  99. if (action == GLFW_PRESS) {
  100. setSelected(clickedWidget);
  101. }
  102. }
  103. // if (button == GLFW_MOUSE_BUTTON_MIDDLE) {
  104. // if (action == GLFW_PRESS) {
  105. // scrollWidget = clickedWidget;
  106. // }
  107. // if (action == GLFW_RELEASE) {
  108. // scrollWidget = NULL;
  109. // }
  110. // }
  111. }
  112. void State::handleHover(math::Vec pos, math::Vec mouseDelta) {
  113. if (draggedWidget) {
  114. // event::DragMove
  115. event::DragMove eDragMove;
  116. eDragMove.mouseDelta = mouseDelta;
  117. draggedWidget->onDragMove(eDragMove);
  118. // event::DragHover
  119. event::Context eDragHoverContext;
  120. event::DragHover eDragHover;
  121. eDragHover.context = &eDragHoverContext;
  122. eDragHover.pos = pos;
  123. eDragHover.mouseDelta = mouseDelta;
  124. eDragHover.origin = draggedWidget;
  125. rootWidget->onDragHover(eDragHover);
  126. setDragHovered(eDragHoverContext.consumed);
  127. return;
  128. }
  129. // if (scrollWidget) {
  130. // event::HoverScroll
  131. // event::HoverScroll eHoverScroll;
  132. // eHoverScroll.pos = pos;
  133. // eHoverScroll.scrollDelta = scrollDelta;
  134. // rootWidget->onHoverScroll(eHoverScroll);
  135. // }
  136. // event::Hover
  137. event::Context eHoverContext;
  138. event::Hover eHover;
  139. eHover.context = &eHoverContext;
  140. eHover.pos = pos;
  141. eHover.mouseDelta = mouseDelta;
  142. rootWidget->onHover(eHover);
  143. setHovered(eHoverContext.consumed);
  144. }
  145. void State::handleLeave() {
  146. setDragHovered(NULL);
  147. setHovered(NULL);
  148. }
  149. void State::handleScroll(math::Vec pos, math::Vec scrollDelta) {
  150. // event::HoverScroll
  151. event::Context eHoverScrollContext;
  152. event::HoverScroll eHoverScroll;
  153. eHoverScroll.context = &eHoverScrollContext;
  154. eHoverScroll.pos = pos;
  155. eHoverScroll.scrollDelta = scrollDelta;
  156. rootWidget->onHoverScroll(eHoverScroll);
  157. }
  158. void State::handleDrop(math::Vec pos, const std::vector<std::string> &paths) {
  159. // event::PathDrop
  160. event::Context ePathDropContext;
  161. event::PathDrop ePathDrop(paths);
  162. ePathDrop.context = &ePathDropContext;
  163. ePathDrop.pos = pos;
  164. rootWidget->onPathDrop(ePathDrop);
  165. }
  166. void State::handleText(math::Vec pos, int codepoint) {
  167. if (selectedWidget) {
  168. // event::SelectText
  169. event::Context eSelectTextContext;
  170. event::SelectText eSelectText;
  171. eSelectText.context = &eSelectTextContext;
  172. eSelectText.codepoint = codepoint;
  173. selectedWidget->onSelectText(eSelectText);
  174. if (eSelectTextContext.consumed)
  175. return;
  176. }
  177. // event::HoverText
  178. event::Context eHoverTextContext;
  179. event::HoverText eHoverText;
  180. eHoverText.context = &eHoverTextContext;
  181. eHoverText.pos = pos;
  182. eHoverText.codepoint = codepoint;
  183. rootWidget->onHoverText(eHoverText);
  184. }
  185. void State::handleKey(math::Vec pos, int key, int scancode, int action, int mods) {
  186. if (selectedWidget) {
  187. // event::SelectKey
  188. event::Context eSelectKeyContext;
  189. event::SelectKey eSelectKey;
  190. eSelectKey.context = &eSelectKeyContext;
  191. eSelectKey.key = key;
  192. eSelectKey.scancode = scancode;
  193. eSelectKey.action = action;
  194. eSelectKey.mods = mods;
  195. selectedWidget->onSelectKey(eSelectKey);
  196. if (eSelectKeyContext.consumed)
  197. return;
  198. }
  199. // event::HoverKey
  200. event::Context eHoverKeyContext;
  201. event::HoverKey eHoverKey;
  202. eHoverKey.context = &eHoverKeyContext;
  203. eHoverKey.pos = pos;
  204. eHoverKey.key = key;
  205. eHoverKey.scancode = scancode;
  206. eHoverKey.action = action;
  207. eHoverKey.mods = mods;
  208. rootWidget->onHoverKey(eHoverKey);
  209. }
  210. void State::handleZoom() {
  211. // event::Zoom
  212. event::Context eZoomContext;
  213. event::Zoom eZoom;
  214. eZoom.context = &eZoomContext;
  215. rootWidget->onZoom(eZoom);
  216. }
  217. } // namespace event
  218. } // namespace rack