keeweb/app/scripts/comp/key-handler.js

88 lines
2.8 KiB
JavaScript
Raw Normal View History

2015-10-17 23:49:24 +02:00
'use strict';
var Backbone = require('backbone'),
2015-11-17 22:49:12 +01:00
Keys = require('../const/keys'),
IdleTracker = require('../comp/idle-tracker');
2015-10-17 23:49:24 +02:00
var shortcutKeyProp = navigator.platform.indexOf('Mac') >= 0 ? 'metaKey' : 'ctrlKey';
var KeyHandler = {
SHORTCUT_ACTION: 1,
SHORTCUT_OPT: 2,
shortcuts: {},
modal: false,
2015-11-17 22:49:12 +01:00
2015-10-17 23:49:24 +02:00
init: function() {
$(document).bind('keypress', this.keypress.bind(this));
$(document).bind('keydown', this.keydown.bind(this));
},
onKey: function(key, handler, thisArg, shortcut, modal, noPrevent) {
var keyShortcuts = this.shortcuts[key];
if (!keyShortcuts) {
this.shortcuts[key] = keyShortcuts = [];
}
keyShortcuts.push({ handler: handler, thisArg: thisArg, shortcut: shortcut, modal: modal, noPrevent: noPrevent });
},
offKey: function(key, handler, thisArg) {
if (this.shortcuts[key]) {
2016-07-17 13:30:38 +02:00
this.shortcuts[key] = _.reject(this.shortcuts[key], sh => {
2015-10-17 23:49:24 +02:00
return sh.handler === handler && sh.thisArg === thisArg;
});
}
},
setModal: function(modal) {
this.modal = modal;
},
isActionKey: function(e) {
return e[shortcutKeyProp];
},
keydown: function(e) {
2015-11-17 22:49:12 +01:00
IdleTracker.regUserAction();
2015-10-17 23:49:24 +02:00
var code = e.keyCode || e.which;
var keyShortcuts = this.shortcuts[code];
if (keyShortcuts && keyShortcuts.length) {
keyShortcuts.forEach(function(sh) {
if (this.modal && !sh.modal) {
e.stopPropagation();
return;
}
var isActionKey = this.isActionKey(e);
switch (sh.shortcut) {
case this.SHORTCUT_ACTION:
if (!isActionKey) { return; }
break;
case this.SHORTCUT_OPT:
if (!e.altKey) { return; }
break;
default:
if (e.metaKey || e.ctrlKey || e.altKey) { return; }
break;
}
sh.handler.call(sh.thisArg, e, code);
if (isActionKey && !sh.noPrevent) {
e.preventDefault();
}
}, this);
}
},
keypress: function(e) {
if (!this.modal &&
e.charCode !== Keys.DOM_VK_RETURN &&
e.charCode !== Keys.DOM_VK_ESCAPE &&
e.charCode !== Keys.DOM_VK_TAB &&
!e.altKey && !e.ctrlKey && !e.metaKey) {
this.trigger('keypress', e);
2016-07-24 22:57:12 +02:00
} else if (this.modal) {
this.trigger('keypress:' + this.modal, e);
2015-10-17 23:49:24 +02:00
}
2015-11-17 22:49:12 +01:00
},
reg: function() {
IdleTracker.regUserAction();
2015-10-17 23:49:24 +02:00
}
};
_.extend(KeyHandler, Backbone.Events);
module.exports = KeyHandler;