| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- import { point } from "./point.js";
- /**
- * This is controler. Controler is responsible for managing events after
- * mouse move. App can create controler for each view, and ads more
- * listeners, which could be removed with one instruction. Listeners get
- * point with mouse move difference as parameter.
- */
- export class controler {
- #last;
- #event;
- #listeners;
- /**
- * This create new controler.
- * @return {controler} - New controler
- */
- constructor() {
- this.#last = null;
- this.#event = null;
- this.#listeners = [];
- }
- /**
- * This is inside function, which calculate mouse move, and save it new
- * position, to calculate it after next move. It also run all listeners.
- *
- * @param {MouseEvent} event - Event from mousemove
- */
- #moved(event) {
- const current = new point(event.screenX, event.screenY);
- if (this.#last === null) {
- this.#last = current;
- return;
- }
- const difference = this.#last.compare(current);
- this.#last = current;
-
- this.#run(difference);
- }
- /**
- * This run all listeners, and give them as parameter difference between
- * last and current mouse position.
- *
- * @param {point} target - Difference between mouse positions
- */
- #run(target) {
- this.#listeners.forEach(item => item(target));
- }
- /**
- * This enable event listening on window.
- */
- enable() {
- if (this.#event) {
- return;
- }
- this.#event = (event) => { this.#moved(event); };
- window.addEventListener("mousemove", this.#event);
- }
- /**
- * This disable even listening on window. It is recomended to use, when
- * view is changing.
- */
- clean() {
- if (this.#event === null) {
- return;
- }
- window.removeEventListener("mousemove", this.#event);
- this.#event = null;
- }
- /**
- * This add new listener. Listener get point with difference between
- * old and new mouse position as argument.
- *
- * @param {function} target - New listener
- * @returns {bool} - True when added, false when already exists
- */
- add_listener(target) {
- if (this.#listeners.includes(target)) {
- return false;
- }
- this.#listeners.push(target);
- return true;
- }
- /**
- * This remove listener which is given as argument.
- *
- * @param {function} target - Function to remove
- * @returns {?function} - Null when function is not removed, or function
- */
- remove_listener(target) {
- const where = this.#listeners.indexOf(target);
- if (where === -1) {
- return null;
- }
- return this.#listeners.pop(where);
- }
- }
|