From 0f2009fa8eb9d3b7006030b7e66cb89d358b39d7 Mon Sep 17 00:00:00 2001 From: Zachary Vance Date: Tue, 19 May 2015 18:56:46 -0700 Subject: [PATCH] Allow registering the same shortcut multiple times --- src/library/shortcut.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/library/shortcut.js b/src/library/shortcut.js index 75f46ee..29f9d9f 100644 --- a/src/library/shortcut.js +++ b/src/library/shortcut.js @@ -8,13 +8,22 @@ // o.remove() // Once we lose textbox focus, stop keeping track of it, for example var Shortcut = (function(document, _) { + _.mixin({ + guid : function(){ + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); + } + }); + var globalMousetrap = new Mousetrap(); var globalObject = {element: document, type: "global", isGlobal: true, mousetrap: globalMousetrap}; var Shortcut = { _globalObject: globalObject, // The object passed to callbacks when a global keybinding is invoked. globalMousetrap: globalMousetrap, boundObjects: [globalObject], - shortcuts: [], + shortcuts: {}, registerShortcut: function(shortcut) { if (arguments.length > 1) { shortcut = { @@ -36,18 +45,21 @@ var Shortcut = (function(document, _) { _keybinding: shortcut.keybinding || "", action: function() {}, boundObjects: [], - ownedByUs: true + ownedByUs: true, + id: _.guid(), }); Object.defineProperty(shortcut, "keybinding", { set: function (newKeybinding) { manager.rebindShortcut(shortcut, newKeybinding); }, get: function () { return shortcut._keybinding; }, }); - this.shortcuts.push(shortcut); + if (this.shortcuts[shortcut.id]) return this.shortcuts[shortcut.id]; + this.shortcuts[shortcut.id] = shortcut; _.chain(this.boundObjects).where({'type':shortcut.object}).each(_.partial(this.bindShortcut, shortcut, _), this).value(); return shortcut; }, unregisterShortcut: function(shortcut) { _.each(_.clone(shortcut.boundObjects), _.partial(this.unbindShortcut, shortcut, _), this); + delete this.shortcuts[shortcut.id]; }, bindShortcut: function(shortcut, object) { // Do not call directly if (!_.contains(shortcut.boundObjects, object)) { @@ -107,7 +119,7 @@ var Shortcut = (function(document, _) { object = { element:element, type:type, - mousetrap: new Mousetrap(element), + mousetrap: Mousetrap(element), remove: function() { manager.removeObject(this); }, add: function() { manager.addObject(this.element, this.type); }, }; -- 2.47.3