Home Reference Source

cables_dev/cables_ui/src/ui/glpatch/mousestate.js

  1. import { Events } from "cables-shared-client";
  2. import userSettings from "../components/usersettings.js";
  3.  
  4.  
  5. /**
  6. * managing mouse states buttons/position/dragging etc
  7. *
  8. * @export
  9. * @class MouseState
  10. * @extends {Events}
  11. */
  12. export default class MouseState extends Events
  13. {
  14. constructor(canvas)
  15. {
  16. super();
  17. this._mouseOverCanvas = false;
  18. this._x = 0;
  19. this._y = 0;
  20. this._buttonStates = {};
  21. this._buttonStates[MouseState.BUTTON_LEFT] = { "down": false };
  22. this._buttonStates[MouseState.BUTTON_RIGHT] = { "down": false };
  23. this._buttonStates[MouseState.BUTTON_WHEEL] = { "down": false };
  24. this._buttonStates[MouseState.BUTTON_4] = { "down": false };
  25. this._buttonStates[MouseState.BUTTON_5] = { "down": false };
  26. this._numFingers = 0;
  27.  
  28. this._isDragging = false;
  29. this._mouseDownX = 0;
  30. this._mouseDownY = 0;
  31.  
  32. this._useDragCablesButton = MouseState.BUTTON_RIGHT;
  33. this.buttonForScrolling = MouseState.BUTTON_RIGHT;
  34. this.buttonForSelecting = MouseState.BUTTON_LEFT;
  35.  
  36.  
  37. this._initUserPrefs();
  38.  
  39. userSettings.on("change", this._initUserPrefs.bind(this));
  40.  
  41. canvas.addEventListener("pointerenter", (e) =>
  42. {
  43. if (e.pointerType == "touch") this._mouseOverCanvas = true;
  44. else this._mouseOverCanvas = true;
  45. });
  46.  
  47. canvas.addEventListener("pointerleave", (e) =>
  48. {
  49. if (e.pointerType == "touch") this._mouseOverCanvas = true;
  50. else this._mouseOverCanvas = false;
  51. });
  52.  
  53. canvas.addEventListener("pointerdown", this._down.bind(this), { "passive": false });
  54. canvas.addEventListener("pointerup", this._up.bind(this), { "passive": false });
  55. canvas.addEventListener("pointermove", this._move.bind(this), { "passive": false });
  56. // canvas.addEventListener("touchmove", this._move.bind(this), { "passive": false });
  57.  
  58. // canvas.addEventListener("touchstart", this._down.bind(this), { "passive": false });
  59. // canvas.addEventListener("touchend", this._up.bind(this), { "passive": false });
  60.  
  61. canvas.addEventListener("touchenter", (e) =>
  62. {
  63. this._numFingers = e.touches.length;
  64. });
  65.  
  66. canvas.addEventListener("touchleave", (e) =>
  67. {
  68. this._numFingers = e.touches.length;
  69. });
  70. }
  71.  
  72. get x() { return this._x; }
  73.  
  74. get y() { return this._y; }
  75.  
  76. get numFingers() { return this._numFingers; }
  77.  
  78. get mouseOverCanvas() { return this._mouseOverCanvas; }
  79.  
  80. get buttonAny() { return this._buttonStates[MouseState.BUTTON_LEFT].down || this._buttonStates[MouseState.BUTTON_RIGHT].down || this._buttonStates[MouseState.BUTTON_WHEEL].down || this._buttonStates[MouseState.BUTTON_4].down || this._buttonStates[MouseState.BUTTON_5].down; }
  81.  
  82. get buttonLeft() { return this._buttonStates[MouseState.BUTTON_LEFT].down; }
  83.  
  84. get buttonRight() { return this._buttonStates[MouseState.BUTTON_RIGHT].down; }
  85.  
  86. get buttonMiddle() { return this._buttonStates[MouseState.BUTTON_WHEEL].down; }
  87.  
  88. get isDragging() { return this._isDragging; }
  89.  
  90.  
  91. _initUserPrefs()
  92. {
  93. const userSettingScrollButton = userSettings.get("patch_button_scroll");
  94.  
  95. if (userSettingScrollButton == 4) this.buttonForScrolling = MouseState.BUTTON_WHEEL;
  96. if (userSettingScrollButton == 4) this.buttonForScrolling = MouseState.BUTTON_WHEEL;
  97. if (userSettingScrollButton == 1) this.buttonForScrolling = MouseState.BUTTON_LEFT;
  98. if (userSettingScrollButton == 1) this.buttonForScrolling = MouseState.BUTTON_LEFT;
  99. if (userSettingScrollButton == 2) this.buttonForScrolling = MouseState.BUTTON_RIGHT;
  100. if (userSettingScrollButton == 2) this.buttonForScrolling = MouseState.BUTTON_RIGHT;
  101. }
  102.  
  103. _updateDebug()
  104. {
  105. let str = "";
  106.  
  107. for (let i in this._buttonStates)
  108. {
  109. str += i + ":" + (this._buttonStates[i].down ? "X" : "-") + " | ";
  110. }
  111.  
  112. gui.patchView._patchRenderer.debugData.mouseState = str;
  113. }
  114.  
  115.  
  116. getButton()
  117. {
  118. if (this._buttonStates[MouseState.BUTTON_LEFT].down) return MouseState.BUTTON_LEFT;
  119. if (this._buttonStates[MouseState.BUTTON_RIGHT].down) return MouseState.BUTTON_RIGHT;
  120. if (this._buttonStates[MouseState.BUTTON_WHEEL].down) return MouseState.BUTTON_WHEEL;
  121. if (this._buttonStates[MouseState.BUTTON_4].down) return MouseState.BUTTON_4;
  122. if (this._buttonStates[MouseState.BUTTON_5].down) return MouseState.BUTTON_5;
  123. return MouseState.BUTTON_NONE;
  124. }
  125.  
  126. isButtonDown(button)
  127. {
  128. if (button === undefined) return this.buttonAny;
  129. return this._buttonStates[button].down;
  130. }
  131.  
  132. _setButtonsUp()
  133. {
  134. for (const i in this._buttonStates)
  135. {
  136. this._buttonUp(i);
  137. }
  138. }
  139.  
  140. _buttonUp(button)
  141. {
  142. if (this._buttonStates[button])
  143. {
  144. this._buttonStates[button].down = false;
  145. this.emitEvent("buttonUp", button);
  146. }
  147. this._updateDebug();
  148. }
  149.  
  150. _buttonDown(button)
  151. {
  152. if (!this._buttonStates[button].down)
  153. {
  154. this._buttonStates[button].down = true;
  155. this.emitEvent("buttonDown", button);
  156. }
  157. this._updateDebug();
  158. }
  159.  
  160.  
  161. _setButton(button, newState)
  162. {
  163. if (button == MouseState.BUTTON_LEFT + MouseState.BUTTON_RIGHT)
  164. {
  165. this._setButton(MouseState.BUTTON_LEFT, newState);
  166. this._setButton(MouseState.BUTTON_RIGHT, newState);
  167. return;
  168. }
  169. if (button == MouseState.BUTTON_LEFT + MouseState.BUTTON_WHEEL)
  170. {
  171. this._setButton(MouseState.BUTTON_LEFT, newState);
  172. this._setButton(MouseState.BUTTON_WHEEL, newState);
  173. return;
  174. }
  175. if (button == MouseState.BUTTON_RIGHT + MouseState.BUTTON_WHEEL)
  176. {
  177. this._setButton(MouseState.BUTTON_RIGHT, newState);
  178. this._setButton(MouseState.BUTTON_WHEEL, newState);
  179. return;
  180. }
  181.  
  182. if (!button) return;
  183.  
  184. if (!this._buttonStates[button]) this._buttonStates[button] = {};
  185.  
  186. if (this._buttonStates[button].down != newState)
  187. {
  188. const oldState = this._buttonStates[button].down;
  189. if (oldState && !newState) this._buttonUp(button);
  190. if (!oldState && newState) this._buttonDown(button);
  191. }
  192. }
  193.  
  194. debug(data)
  195. {
  196. data.mouse_OverCanvas = this._mouseOverCanvas;
  197. data.mouse_buttonStates = JSON.stringify(this._buttonStates);// .join(",");
  198. }
  199.  
  200. _move(e)
  201. {
  202. if (!e.pointerType) return;
  203. this._mouseOverCanvas = true;
  204.  
  205. if (this.buttonAny)
  206. {
  207. this._isDragging = this._mouseDownX != e.offsetX || this._mouseDownY != e.offsetY;
  208. this.draggingDistance = Math.sqrt((e.offsetX - this._mouseDownX) ** 2 + (e.offsetY - this._mouseDownY) ** 2);
  209. }
  210.  
  211. if (e.buttons)
  212. {
  213. for (let i in this._buttonStates) this._buttonStates[i].down = false;
  214. this._setButton(e.buttons, true);
  215. }
  216. else this._setButtonsUp();
  217. }
  218.  
  219. _down(e)
  220. {
  221. this._mouseDownX = e.offsetX;
  222. this._mouseDownY = e.offsetY;
  223. this._isDragging = false;
  224. this.draggingDistance = 0;
  225. this._setButton(e.buttons, true);
  226. }
  227.  
  228. _up(e)
  229. {
  230. this._isDragging = false;
  231.  
  232. // console.log("up", e.buttons, e);
  233. // this._setButton(e.buttons, false);
  234. if (e.buttons == 0) this._setButtonsUp();
  235. }
  236.  
  237. get buttonStateForScrolling()
  238. {
  239. if (this.buttonForScrolling == this._useDragCablesButton && gui.patchView.patchRenderer.isDraggingPort()) return false;
  240. if (this.buttonForScrolling == this._useDragCablesButton && gui.patchView.patchRenderer.isDraggingPort()) return false;
  241. return this._buttonStates[this.buttonForScrolling].down;
  242. }
  243.  
  244. get buttonStateForSelecting()
  245. {
  246. return this._buttonStates[this.buttonForSelecting].down;
  247. }
  248.  
  249. get buttonStateForLinkDrag()
  250. {
  251. return this._buttonStates[this._useDragCablesButton].down;
  252. }
  253.  
  254. get buttonStateForSelectionArea()
  255. {
  256. return this._buttonStates[MouseState.BUTTON_LEFT].down;
  257. }
  258.  
  259. get buttonForRemoveLink()
  260. {
  261. return MouseState.BUTTON_RIGHT;
  262. }
  263.  
  264. get buttonForLinkInsertOp()
  265. {
  266. return MouseState.BUTTON_LEFT;
  267. }
  268. }
  269.  
  270.  
  271.  
  272. MouseState.BUTTON_NONE = 0;
  273. MouseState.BUTTON_LEFT = 1;
  274. MouseState.BUTTON_RIGHT = 2;
  275. MouseState.BUTTON_WHEEL = 4;
  276. MouseState.BUTTON_4 = 8;
  277. MouseState.BUTTON_5 = 16;
  278.  
  279.