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.

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