UNPKG

@metacell/geppetto-meta-client

Version:

Geppetto web frontend. Geppetto is an open-source platform to build web-based tools to visualize and simulate neuroscience data and models.

126 lines (118 loc) 3.54 kB
/* * THREEx.KeyboardState.js keep the current state of the keyboard. * It is possible to query it at any time. No need of an event. * This is particularly convenient in loop driven case, like in * 3D demos or games. * * # Usage * * **Step 1**: Create the object * * ```var keyboard = new THREEx.KeyboardState();``` * * **Step 2**: Query the keyboard state * * This will return true if shift and A are pressed, false otherwise * * ```keyboard.pressed("shift+A")``` * * **Step 3**: Stop listening to the keyboard * * ```keyboard.destroy()``` * * NOTE: this library may be nice as standaline. independant from three.js * - rename it keyboardForGame * * # Code * */ define(function () { /** @namespace */ var THREEx = THREEx || {}; window.THREEx = THREEx; /** * - NOTE: it would be quite easy to push event-driven too * - microevent.js for events handling * - in this._onkeyChange, generate a string from the DOM event * - use this as event name */ THREEx.KeyboardState = function () { // to store the current state this.keyCodes = {}; this.modifiers = {}; // create callback to bind/unbind keyboard events var self = this; this._onKeyDown = function (event) { self._onKeyChange(event, true); }; this._onKeyUp = function (event) { self._onKeyChange(event, false); }; // bind keyEvents document.addEventListener("keydown", this._onKeyDown, false); document.addEventListener("keyup", this._onKeyUp, false); }; /** * To stop listening of the keyboard events */ THREEx.KeyboardState.prototype.destroy = function () { // unbind keyEvents document.removeEventListener("keydown", this._onKeyDown, false); document.removeEventListener("keyup", this._onKeyUp, false); }; THREEx.KeyboardState.MODIFIERS = ['shift', 'ctrl', 'alt', 'meta']; THREEx.KeyboardState.ALIAS = { 'left': 37, 'up': 38, 'right': 39, 'down': 40, 'space': 32, 'pageup': 33, 'pagedown': 34, 'enter': 13, 'tab': 9, 'escape': 27 }; /** * to process the keyboard dom event */ THREEx.KeyboardState.prototype._onKeyChange = function (event, pressed) { /* * log to debug * console.log("onKeyChange", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey) */ // update this.keyCodes var keyCode = event.keyCode; this.keyCodes[keyCode] = pressed; // update this.modifiers this.modifiers['shift'] = event.shiftKey; this.modifiers['ctrl'] = event.ctrlKey; this.modifiers['alt'] = event.altKey; this.modifiers['meta'] = event.metaKey; }; /** * query keyboard state to know if a key is pressed of not * * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A * @returns {Boolean} true if the key is pressed, false otherwise */ THREEx.KeyboardState.prototype.pressed = function (keyDesc) { var keys = keyDesc.split("+"); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var pressed; if (THREEx.KeyboardState.MODIFIERS.indexOf(key) !== -1) { pressed = this.modifiers[key]; } else if (Object.keys(THREEx.KeyboardState.ALIAS).indexOf(key) != -1) { pressed = this.keyCodes[THREEx.KeyboardState.ALIAS[key]]; } else { pressed = this.keyCodes[key.toUpperCase().charCodeAt(0)]; } if (!pressed) { return false; } } return true; }; return THREEx; });