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.

268 lines
6.2KB

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