From 17ad7a26e7df3a45016995278d759984ff7cb60e Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Wed, 11 Jan 2012 13:13:37 -0800 Subject: [PATCH] Ensure focus returns to the editor when file finder closes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We just capture focusout events on root view… if anything other than the editors text area lost focus, we focus the editor again. This will likely need refinement when we add more widgets to the system, but its enough to make the fuzzy finder behave appropriately. --- spec/atom/root-view-spec.coffee | 83 +++++++++++++++++---------------- spec/spec-helper.coffee | 1 + src/atom/editor.coffee | 5 +- src/atom/root-view.coffee | 3 ++ 4 files changed, 52 insertions(+), 40 deletions(-) diff --git a/spec/atom/root-view-spec.coffee b/spec/atom/root-view-spec.coffee index 8d1042d3d..f4eca6f0a 100644 --- a/spec/atom/root-view-spec.coffee +++ b/spec/atom/root-view-spec.coffee @@ -38,49 +38,54 @@ describe "RootView", -> rootView.addPane $('
') expect(rootView.vertical.children().length).toBe 2 - describe ".toggleFileFinder()", -> - describe "when there is a project", -> - it "shows the FileFinder when it is not on screen and hides it when it is", -> - runs -> + describe "the file finder", -> + describe "when the toggle-file-finder event is triggered", -> + describe "when there is a project", -> + it "shows the FileFinder when it is not on screen and hides it when it is", -> + runs -> + $('#jasmine-content').append(rootView) + expect(rootView.find('.file-finder')).not.toExist() + + waitsForPromise -> + rootView.resultOfTrigger 'toggle-file-finder' + + runs -> + expect(rootView.find('.file-finder')).toExist() + expect(rootView.find('.file-finder input:focus')).toExist() + rootView.trigger 'toggle-file-finder' + + expect(rootView.find('.editor textarea:focus')).toExist() + expect(rootView.find('.file-finder')).not.toExist() + + it "shows all relative file paths for the current project", -> + waitsForPromise -> + rootView.resultOfTrigger 'toggle-file-finder' + + waitsForPromise -> + project.getFilePaths().done (paths) -> + expect(rootView.fileFinder.urlList.children('li').length).toBe paths.length + + for path in paths + relativePath = path.replace(project.url, '') + expect(rootView.fileFinder.urlList.find("li:contains(#{relativePath}):not(:contains(#{project.url}))")).toExist() + + describe "when there is no project", -> + beforeEach -> + rootView = RootView.build() + + it "does not open the FileFinder", -> + expect(rootView.editor.buffer.url).toBeUndefined() expect(rootView.find('.file-finder')).not.toExist() - - waitsForPromise -> - rootView.resultOfTrigger 'toggle-file-finder' - - runs -> - expect(rootView.find('.file-finder')).toExist() rootView.trigger 'toggle-file-finder' expect(rootView.find('.file-finder')).not.toExist() - it "shows all relative file paths for the current project", -> - waitsForPromise -> - rootView.resultOfTrigger 'toggle-file-finder' - - waitsForPromise -> - project.getFilePaths().done (paths) -> - expect(rootView.fileFinder.urlList.children('li').length).toBe paths.length - - for path in paths - relativePath = path.replace(project.url, '') - expect(rootView.fileFinder.urlList.find("li:contains(#{relativePath}):not(:contains(#{project.url}))")).toExist() - - describe "when there is no project", -> - beforeEach -> - rootView = RootView.build() - - it "does not open the FileFinder", -> - expect(rootView.editor.buffer.url).toBeUndefined() - expect(rootView.find('.file-finder')).not.toExist() - rootView.trigger 'toggle-file-finder' - expect(rootView.find('.file-finder')).not.toExist() - - describe "when a path is selected in the file finder", -> - it "opens the file associated with that path in the editor", -> - waitsForPromise -> rootView.resultOfTrigger 'toggle-file-finder' - runs -> - firstLi = rootView.fileFinder.find('li:first') - rootView.fileFinder.trigger 'select' - expect(rootView.editor.buffer.url).toBe(project.url + firstLi.text()) + describe "when a path is selected in the file finder", -> + it "opens the file associated with that path in the editor", -> + waitsForPromise -> rootView.resultOfTrigger 'toggle-file-finder' + runs -> + firstLi = rootView.fileFinder.find('li:first') + rootView.fileFinder.trigger 'select' + expect(rootView.editor.buffer.url).toBe(project.url + firstLi.text()) describe "global keymap wiring", -> commandHandler = null diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 554ce73c0..cdaf7a4a8 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -7,6 +7,7 @@ BindingSet = require 'binding-set' afterEach -> (new Native).resetMainMenu() atom.globalKeymap.reset() + $('#jasmine-content').empty() window.atom = new (require 'app') diff --git a/src/atom/editor.coffee b/src/atom/editor.coffee index 1cc8f8c4d..7bae90f3a 100644 --- a/src/atom/editor.coffee +++ b/src/atom/editor.coffee @@ -37,7 +37,7 @@ class Editor extends Template @aceEditor.setTheme(require "ace/theme/twilight") @aceEditor.setKeyboardHandler handleKeyboard: (data, hashId, keyString, keyCode, event) => - if event and @keyEventHandler?.handleKeyEvent(event) + if event and @keyEventHandler and @keyEventHandler.handleKeyEvent(event) == false { command: { exec: -> }} else null @@ -45,6 +45,9 @@ class Editor extends Template getAceSession: -> @aceEditor.getSession() + focus: -> + @aceEditor.focus() + save: -> if @buffer.url @buffer.save() diff --git a/src/atom/root-view.coffee b/src/atom/root-view.coffee index a79944846..c0704cc2f 100644 --- a/src/atom/root-view.coffee +++ b/src/atom/root-view.coffee @@ -32,6 +32,9 @@ class RootView extends Template @on 'toggle-file-finder', => @toggleFileFinder() + @on 'focusout', (e) => + @editor.focus() unless e.target is @editor.find('textarea')[0] + createProject: (url) -> if url @project = new Project(fs.directory(url))