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.

224 lines
5.0KB

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