Add App.bindKey

This commit is contained in:
Corey Johnson & Nathan Sobo 2012-01-13 12:06:52 -08:00
parent 9ea7663256
commit fd48c67bfa
4 changed files with 60 additions and 41 deletions

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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?