152 lines
3.6 KiB
JavaScript
152 lines
3.6 KiB
JavaScript
|
|
var KeyCombo = require('./key-combo');
|
|
|
|
|
|
function Locale(name) {
|
|
this.localeName = name;
|
|
this.pressedKeys = [];
|
|
this._appliedMacros = [];
|
|
this._keyMap = {};
|
|
this._killKeyCodes = [];
|
|
this._macros = [];
|
|
}
|
|
|
|
Locale.prototype.bindKeyCode = function(keyCode, keyNames) {
|
|
if (typeof keyNames === 'string') {
|
|
keyNames = [keyNames];
|
|
}
|
|
|
|
this._keyMap[keyCode] = keyNames;
|
|
};
|
|
|
|
Locale.prototype.bindMacro = function(keyComboStr, keyNames) {
|
|
if (typeof keyNames === 'string') {
|
|
keyNames = [ keyNames ];
|
|
}
|
|
|
|
var handler = null;
|
|
if (typeof keyNames === 'function') {
|
|
handler = keyNames;
|
|
keyNames = null;
|
|
}
|
|
|
|
var macro = {
|
|
keyCombo : new KeyCombo(keyComboStr),
|
|
keyNames : keyNames,
|
|
handler : handler
|
|
};
|
|
|
|
this._macros.push(macro);
|
|
};
|
|
|
|
Locale.prototype.getKeyCodes = function(keyName) {
|
|
var keyCodes = [];
|
|
for (var keyCode in this._keyMap) {
|
|
var index = this._keyMap[keyCode].indexOf(keyName);
|
|
if (index > -1) { keyCodes.push(keyCode|0); }
|
|
}
|
|
return keyCodes;
|
|
};
|
|
|
|
Locale.prototype.getKeyNames = function(keyCode) {
|
|
return this._keyMap[keyCode] || [];
|
|
};
|
|
|
|
Locale.prototype.setKillKey = function(keyCode) {
|
|
if (typeof keyCode === 'string') {
|
|
var keyCodes = this.getKeyCodes(keyCode);
|
|
for (var i = 0; i < keyCodes.length; i += 1) {
|
|
this.setKillKey(keyCodes[i]);
|
|
}
|
|
return;
|
|
}
|
|
|
|
this._killKeyCodes.push(keyCode);
|
|
};
|
|
|
|
Locale.prototype.pressKey = function(keyCode) {
|
|
if (typeof keyCode === 'string') {
|
|
var keyCodes = this.getKeyCodes(keyCode);
|
|
for (var i = 0; i < keyCodes.length; i += 1) {
|
|
this.pressKey(keyCodes[i]);
|
|
}
|
|
return;
|
|
}
|
|
|
|
var keyNames = this.getKeyNames(keyCode);
|
|
for (var i = 0; i < keyNames.length; i += 1) {
|
|
if (this.pressedKeys.indexOf(keyNames[i]) === -1) {
|
|
this.pressedKeys.push(keyNames[i]);
|
|
}
|
|
}
|
|
|
|
this._applyMacros();
|
|
};
|
|
|
|
Locale.prototype.releaseKey = function(keyCode) {
|
|
if (typeof keyCode === 'string') {
|
|
var keyCodes = this.getKeyCodes(keyCode);
|
|
for (var i = 0; i < keyCodes.length; i += 1) {
|
|
this.releaseKey(keyCodes[i]);
|
|
}
|
|
}
|
|
|
|
else {
|
|
var keyNames = this.getKeyNames(keyCode);
|
|
var killKeyCodeIndex = this._killKeyCodes.indexOf(keyCode);
|
|
|
|
if (killKeyCodeIndex > -1) {
|
|
this.pressedKeys.length = 0;
|
|
} else {
|
|
for (var i = 0; i < keyNames.length; i += 1) {
|
|
var index = this.pressedKeys.indexOf(keyNames[i]);
|
|
if (index > -1) {
|
|
this.pressedKeys.splice(index, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
this._clearMacros();
|
|
}
|
|
};
|
|
|
|
Locale.prototype._applyMacros = function() {
|
|
var macros = this._macros.slice(0);
|
|
for (var i = 0; i < macros.length; i += 1) {
|
|
var macro = macros[i];
|
|
if (macro.keyCombo.check(this.pressedKeys)) {
|
|
if (macro.handler) {
|
|
macro.keyNames = macro.handler(this.pressedKeys);
|
|
}
|
|
for (var j = 0; j < macro.keyNames.length; j += 1) {
|
|
if (this.pressedKeys.indexOf(macro.keyNames[j]) === -1) {
|
|
this.pressedKeys.push(macro.keyNames[j]);
|
|
}
|
|
}
|
|
this._appliedMacros.push(macro);
|
|
}
|
|
}
|
|
};
|
|
|
|
Locale.prototype._clearMacros = function() {
|
|
for (var i = 0; i < this._appliedMacros.length; i += 1) {
|
|
var macro = this._appliedMacros[i];
|
|
if (!macro.keyCombo.check(this.pressedKeys)) {
|
|
for (var j = 0; j < macro.keyNames.length; j += 1) {
|
|
var index = this.pressedKeys.indexOf(macro.keyNames[j]);
|
|
if (index > -1) {
|
|
this.pressedKeys.splice(index, 1);
|
|
}
|
|
}
|
|
if (macro.handler) {
|
|
macro.keyNames = null;
|
|
}
|
|
this._appliedMacros.splice(i, 1);
|
|
i -= 1;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
module.exports = Locale;
|