From fd48c67bfad30e6645b442e2dd0da784492dc6f4 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Fri, 13 Jan 2012 12:06:52 -0800 Subject: [PATCH] Add App.bindKey --- spec/atom/global-keymap-spec.coffee | 89 +++++++++++++++++------------ src/atom/app.coffee | 3 + src/atom/global-keymap.coffee | 5 ++ src/atom/vim-mode.coffee | 4 +- 4 files changed, 60 insertions(+), 41 deletions(-) diff --git a/spec/atom/global-keymap-spec.coffee b/spec/atom/global-keymap-spec.coffee index 286a5d503..371119b8a 100644 --- a/spec/atom/global-keymap-spec.coffee +++ b/spec/atom/global-keymap-spec.coffee @@ -119,53 +119,66 @@ describe "GlobalKeymap", -> keymap.handleKeyEvent(keypressEvent('y', target: target)) expect(bazHandler).toHaveBeenCalled() - describe ".bindAllKeys(fn)", -> - it "calls given fn when selector matches", -> - handler = jasmine.createSpy 'handler' - keymap.bindKeys '.child-node', handler + describe ".bindKeys(selector, fnOrMap)", -> + describe "when called with a function", -> + it "calls the given function when selector matches", -> + handler = jasmine.createSpy 'handler' + keymap.bindKeys '.child-node', handler - target = fragment.find('.grandchild-node')[0] - event = keypressEvent('y', target: target) - keymap.handleKeyEvent event + target = fragment.find('.grandchild-node')[0] + event = keypressEvent('y', target: target) + keymap.handleKeyEvent event - expect(handler).toHaveBeenCalledWith(event) + expect(handler).toHaveBeenCalledWith(event) - describe "when the handler function returns a command string", -> - it "triggers the command event on the target and stops propagating the event", -> - keymap.bindKeys '*', 'x': 'foo' - keymap.bindKeys '*', -> 'bar' - fooHandler = jasmine.createSpy('fooHandler') - barHandler = jasmine.createSpy('barHandler') - fragment.on 'foo', fooHandler - fragment.on 'bar', barHandler + describe "when the function returns a command string", -> + it "triggers the command event on the target and stops propagating the event", -> + keymap.bindKeys '*', 'x': 'foo' + keymap.bindKeys '*', -> 'bar' + fooHandler = jasmine.createSpy('fooHandler') + barHandler = jasmine.createSpy('barHandler') + fragment.on 'foo', fooHandler + fragment.on 'bar', barHandler - target = fragment.find('.child-node')[0] - keymap.handleKeyEvent(keydownEvent('x', target: target)) + target = fragment.find('.child-node')[0] + keymap.handleKeyEvent(keydownEvent('x', target: target)) - expect(fooHandler).not.toHaveBeenCalled() - expect(barHandler).toHaveBeenCalled() + expect(fooHandler).not.toHaveBeenCalled() + expect(barHandler).toHaveBeenCalled() - describe "when the handler function returns false", -> - it "stops propagating the event", -> - keymap.bindKeys '*', 'x': 'foo' - keymap.bindKeys '*', -> false - fooHandler = jasmine.createSpy('fooHandler') - fragment.on 'foo', fooHandler + describe "when the function returns false", -> + it "stops propagating the event", -> + keymap.bindKeys '*', 'x': 'foo' + keymap.bindKeys '*', -> false + fooHandler = jasmine.createSpy('fooHandler') + fragment.on 'foo', fooHandler - target = fragment.find('.child-node')[0] - keymap.handleKeyEvent(keydownEvent('x', target: target)) + target = fragment.find('.child-node')[0] + keymap.handleKeyEvent(keydownEvent('x', target: target)) - expect(fooHandler).not.toHaveBeenCalled() + expect(fooHandler).not.toHaveBeenCalled() - describe "when the handler function returns anything other than a string or false", -> - it "continues to propagate the event", -> - keymap.bindKeys '*', 'x': 'foo' - keymap.bindKeys '*', -> undefined - fooHandler = jasmine.createSpy('fooHandler') - fragment.on 'foo', fooHandler + describe "when the function returns anything other than a string or false", -> + it "continues to propagate the event", -> + keymap.bindKeys '*', 'x': 'foo' + keymap.bindKeys '*', -> undefined + fooHandler = jasmine.createSpy('fooHandler') + fragment.on 'foo', fooHandler - target = fragment.find('.child-node')[0] - keymap.handleKeyEvent(keydownEvent('x', target: target)) + target = fragment.find('.child-node')[0] + keymap.handleKeyEvent(keydownEvent('x', target: target)) - expect(fooHandler).toHaveBeenCalled() + expect(fooHandler).toHaveBeenCalled() + describe ".bindKey(selector, pattern, eventName)", -> + it "binds a single key", -> + keymap.bindKey '.child-node', 'z', 'foo' + + fooHandler = jasmine.createSpy('fooHandler') + fragment.on 'foo', fooHandler + + target = fragment.find('.child-node')[0] + keymap.handleKeyEvent(keydownEvent('z', target: target)) + + expect(fooHandler).toHaveBeenCalled() + diff --git a/src/atom/app.coffee b/src/atom/app.coffee index 03a88b447..0e4ff35f4 100644 --- a/src/atom/app.coffee +++ b/src/atom/app.coffee @@ -15,6 +15,9 @@ class App bindKeys: (selector, bindings) -> @globalKeymap.bindKeys(selector, bindings) + bindKey: (selector, pattern, eventName) -> + @globalKeymap.bindKey(selector, pattern, eventName) + open: (url) -> OSX.NSApp.open url diff --git a/src/atom/global-keymap.coffee b/src/atom/global-keymap.coffee index 4dfa5d68b..b5f00891f 100644 --- a/src/atom/global-keymap.coffee +++ b/src/atom/global-keymap.coffee @@ -12,6 +12,11 @@ class GlobalKeymap bindKeys: (selector, bindings) -> @bindingSets.unshift(new BindingSet(selector, bindings)) + bindKey: (selector, pattern, eventName) -> + bindings = {} + bindings[pattern] = eventName + @bindKeys(selector, bindings) + handleKeyEvent: (event) -> currentNode = $(event.target) while currentNode.length diff --git a/src/atom/vim-mode.coffee b/src/atom/vim-mode.coffee index c1045ec3e..53677b556 100644 --- a/src/atom/vim-mode.coffee +++ b/src/atom/vim-mode.coffee @@ -29,10 +29,8 @@ class VimMode @registerCommand i, "numeric-prefix-#{i}", => new op.NumericPrefix(i) registerCommand: (binding, commandName, fn)-> - bindings = {} eventName = "command-mode:#{commandName}" - bindings[binding] = eventName - atom.bindKeys '.command-mode', bindings + atom.bindKey '.command-mode', binding, eventName @editor.on eventName, => possibleOperator = fn() @pushOperator(possibleOperator) if possibleOperator.execute?