input/Mouse.js

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;