controler.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { point } from "./point.js";
  2. /**
  3. * This is controler. Controler is responsible for managing events after
  4. * mouse move. App can create controler for each view, and ads more
  5. * listeners, which could be removed with one instruction. Listeners get
  6. * point with mouse move difference as parameter.
  7. */
  8. export class controler {
  9. #last;
  10. #event;
  11. #listeners;
  12. /**
  13. * This create new controler.
  14. * @return {controler} - New controler
  15. */
  16. constructor() {
  17. this.#last = null;
  18. this.#event = null;
  19. this.#listeners = [];
  20. }
  21. /**
  22. * This is inside function, which calculate mouse move, and save it new
  23. * position, to calculate it after next move. It also run all listeners.
  24. *
  25. * @param {MouseEvent} event - Event from mousemove
  26. */
  27. #moved(event) {
  28. const current = new point(event.screenX, event.screenY);
  29. if (this.#last === null) {
  30. this.#last = current;
  31. return;
  32. }
  33. const difference = this.#last.compare(current);
  34. this.#last = current;
  35. this.#run(difference);
  36. }
  37. /**
  38. * This run all listeners, and give them as parameter difference between
  39. * last and current mouse position.
  40. *
  41. * @param {point} target - Difference between mouse positions
  42. */
  43. #run(target) {
  44. this.#listeners.forEach(item => item(target));
  45. }
  46. /**
  47. * This enable event listening on window.
  48. */
  49. enable() {
  50. if (this.#event) {
  51. return;
  52. }
  53. this.#event = (event) => { this.#moved(event); };
  54. window.addEventListener("mousemove", this.#event);
  55. }
  56. /**
  57. * This disable even listening on window. It is recomended to use, when
  58. * view is changing.
  59. */
  60. clean() {
  61. if (this.#event === null) {
  62. return;
  63. }
  64. window.removeEventListener("mousemove", this.#event);
  65. this.#event = null;
  66. }
  67. /**
  68. * This add new listener. Listener get point with difference between
  69. * old and new mouse position as argument.
  70. *
  71. * @param {function} target - New listener
  72. * @returns {bool} - True when added, false when already exists
  73. */
  74. add_listener(target) {
  75. if (this.#listeners.includes(target)) {
  76. return false;
  77. }
  78. this.#listeners.push(target);
  79. return true;
  80. }
  81. /**
  82. * This remove listener which is given as argument.
  83. *
  84. * @param {function} target - Function to remove
  85. * @returns {?function} - Null when function is not removed, or function
  86. */
  87. remove_listener(target) {
  88. const where = this.#listeners.indexOf(target);
  89. if (where === -1) {
  90. return null;
  91. }
  92. return this.#listeners.pop(where);
  93. }
  94. }