import EventEmitter from "../../common/events/EventEmitter.js";
/**
*
*/
class Mouse extends EventEmitter {
/**
* @param {DomElement} target where to bind the listeners to, defaults to document
*/
constructor(target) {
super();
this.active = true;
this.buttons = {};
this.pos = {
x: 0,
y: 0
};
var self = this;
this._onMouseMove = function(event) {
if (!self.active) return;
self.pos.x = event.clientX;
self.pos.y = event.clientY;
self.pos.px = event.clientX / window.innerWidth;
self.pos.py = event.clientY / window.innerHeight;
/**
* Mouse move event.
* @event Mouse#move
*/
self.emit("move", event);
};
this._onMouseDown = function(event) {
if (!self.active) return;
event.preventDefault();
event.stopPropagation();
self.buttons["btn" + event.button] = true;
/**
* Mouse down event.
* @event Mouse#down
*/
self.emit("down", event);
};
this._onMouseUp = function(event) {
if (!self.active) return;
event.preventDefault();
event.stopPropagation();
self.buttons["btn" + event.button] = false;
/**
* Mouse up event.
* @event Mouse#up
*/
self.emit("up", event);
};
if (typeof target === "undefined") target = document;
target.addEventListener("mousemove", this._onMouseMove, false);
target.addEventListener("mousedown", this._onMouseDown, false);
target.addEventListener("mouseup", this._onMouseUp, false);
target.addEventListener("mouseleave", this._onMouseUp, false);
target.addEventListener("contextmenu", e => {
e.preventDefault();
return false
}, false);
this.target = target;
}
/**
* unbind all event listeners to the target
*/
destroy() {
// unbind keyEvents
this.target.removeEventListener("mousemove", this._onMouseMove, false);
this.target.removeEventListener("mousedown", this._onMouseDown, false);
this.target.removeEventListener("mouseup", this._onMouseUp, false);
this.target.removeEventListener("mouseleave", this._onMouseUp, false);
this.target.removeEventListener("contextmenu", this._onMouseUp, false);
}
/**
*
* @param {Number} n button key
* @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button#value
* @returns {Boolean} if it is pressed or not
*/
isButtonPressed(n) {
return this.buttons["btn" + n];
}
/**
* Check if left button is pressed
* @returns {Boolean} if it is pressed or not
*/
left() {
return this.isButtonPressed(0);
}
/**
* Check if middle button is pressed
* @returns {Boolean} if it is pressed or not
*/
middle() {
return this.isButtonPressed(1);
}
/**
* Check if right button is pressed
* @returns {Boolean} if it is pressed or not
*/
right() {
return this.isButtonPressed(2);
}
}
export default Mouse;