avocado-old/packages/input/action-registry.js

79 lines
1.6 KiB
JavaScript
Raw Normal View History

import * as I from 'immutable';
2019-04-28 23:45:03 -05:00
import {compose, EventEmitter} from '@avocado/core';
const decorate = compose(
EventEmitter,
);
export class ActionRegistry extends decorate(class {}) {
constructor() {
super();
this.mapActionToKey = new Map();
this.mapKeyToAction = {};
this.normalizer = undefined;
this._state = I.Map();
}
actionForKey(key) {
return this.mapKeyToAction[key];
}
listen(normalizer) {
// Only listen once.
if (this.normalizer) {
return;
}
this.normalizer = normalizer;
this.normalizer.on('keyUp', this.onKeyUp, this);
this.normalizer.on('keyDown', this.onKeyDown, this);
}
keyForAction(action) {
return this.mapActionToKey.get(action);
}
mapKeysToActions(map) {
for (const key in map) {
const action = map[key];
this.mapKeyToAction[key] = action;
this.mapActionToKey.set(action, key);
}
}
onKeyDown(key) {
if (this.mapKeyToAction[key]) {
const action = this.mapKeyToAction[key];
this._state = this._state.set(action, true);
}
}
onKeyUp(key) {
if (this.mapKeyToAction[key]) {
const action = this.mapKeyToAction[key];
this._state = this._state.delete(action);
}
}
get state() {
return this._state;
}
set state(state) {
this._state = state;
}
stopListening(normalizer) {
if (!this.normalizer) {
return;
}
this.normalizer.off('keyUp', this.onKeyUp);
this.normalizer.off('keyDown', this.onKeyDown);
this.normalizer = undefined;
}
}
export {InputPacket} from './packet/input.packet';