From c43a1e5ce57e618339fc37c776231534156af10b Mon Sep 17 00:00:00 2001 From: Jon Rohan Date: Fri, 25 Jan 2013 20:37:31 -0800 Subject: [PATCH 1/5] Undo last closed tab --- spec/app/editor-spec.coffee | 19 +++++++++++++++++++ src/app/editor.coffee | 10 +++++++++- src/app/keymaps/editor.cson | 3 +++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index eed7563b5..f70abe357 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -151,6 +151,13 @@ describe "Editor", -> expect(otherEditSession.buffer.subscriptionCount()).toBe 0 describe "when 'close' is triggered", -> + it "adds a closed session path to the array", -> + editor.edit(rootView.project.buildEditSessionForPath()) + editSession = editor.activeEditSession + expect(editor.closedEditSessions.length).toBe 0 + editor.trigger "core:close" + expect(editor.closedEditSessions.length).toBe 1 + it "closes the active edit session and loads next edit session", -> editor.edit(rootView.project.buildEditSessionForPath()) editSession = editor.activeEditSession @@ -2664,3 +2671,15 @@ describe "Editor", -> editor.moveEditSessionToEditor(0, rightEditor, 0) expect(rightEditor.editSessions[0].getPath()).toBe jsPath expect(rightEditor.editSessions[1].getPath()).toBe txtPath + + describe "when editor:undo-close-session is triggered", -> + it "opens the closed session back up", -> + rootView.open('sample.txt') + expect(editor.getPath()).toBe require.resolve('fixtures/sample.txt') + expect(editor.closedEditSessions.length).toBe 0 + editor.trigger "core:close" + expect(editor.getPath()).toBe require.resolve('fixtures/sample.js') + expect(editor.closedEditSessions.length).toBe 1 + editor.trigger 'editor:undo-close-session' + expect(editor.getPath()).toBe require.resolve('fixtures/sample.txt') + expect(editor.closedEditSessions.length).toBe 0 diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 80ed42943..7e7c253a1 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -48,6 +48,7 @@ class Editor extends View lineCache: null isFocused: false activeEditSession: null + closedEditSessions: null editSessions: null attached: false lineOverdraw: 10 @@ -74,6 +75,7 @@ class Editor extends View @cursorViews = [] @selectionViews = [] @editSessions = [] + @closedEditSessions = [] @pendingChanges = [] @newCursors = [] @newSelections = [] @@ -187,6 +189,7 @@ class Editor extends View 'editor:move-line-up': @moveLineUp 'editor:move-line-down': @moveLineDown 'editor:duplicate-line': @duplicateLine + 'editor:undo-close-session': @undoDestroySession documentation = {} for name, method of editorBindings @@ -470,6 +473,9 @@ class Editor extends View getBuffer: -> @activeEditSession.buffer + undoDestroySession: -> + @rootView().open(@closedEditSessions.pop(), true) unless @closedEditSessions.length == 0 + destroyActiveEditSession: -> @destroyEditSessionIndex(@getActiveEditSessionIndex()) @@ -477,7 +483,9 @@ class Editor extends View return if @mini editSession = @editSessions[index] - destroySession = -> + destroySession = => + path = editSession.getPath() + @closedEditSessions.push(path) unless @closedEditSessions.indexOf(path) > -1 editSession.destroy() callback?(index) diff --git a/src/app/keymaps/editor.cson b/src/app/keymaps/editor.cson index fdccfd939..273cb34aa 100644 --- a/src/app/keymaps/editor.cson +++ b/src/app/keymaps/editor.cson @@ -1,3 +1,6 @@ +'#root-view': + 'meta-T': 'editor:undo-close-session' + '.editor': 'meta-s': 'editor:save' 'meta-S': 'editor:save-as' From fb9451556d68e2b61771fc758422019d82c2adc4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Feb 2013 09:00:07 -0800 Subject: [PATCH 2/5] Bind to body instead of #root-view --- src/app/keymaps/editor.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/keymaps/editor.cson b/src/app/keymaps/editor.cson index 273cb34aa..b29d0ddd7 100644 --- a/src/app/keymaps/editor.cson +++ b/src/app/keymaps/editor.cson @@ -1,4 +1,4 @@ -'#root-view': +'body': 'meta-T': 'editor:undo-close-session' '.editor': From 5ecbda0aacf21c9dea682e425ba508768cdc8bc5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Feb 2013 09:41:32 -0800 Subject: [PATCH 3/5] Restore closed tab at previous index --- spec/app/editor-spec.coffee | 24 +++++++++++++++++------- src/app/editor.coffee | 11 +++++++++-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index f70abe357..ecfe4934f 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -2673,13 +2673,23 @@ describe "Editor", -> expect(rightEditor.editSessions[1].getPath()).toBe txtPath describe "when editor:undo-close-session is triggered", -> - it "opens the closed session back up", -> + describe "when an edit session is opened back up after it is closed", -> + it "is removed from the undo stack and not reopened when the event is triggered", -> + rootView.open('sample.txt') + expect(editor.getPath()).toBe fixturesProject.resolve('sample.txt') + editor.trigger "core:close" + expect(editor.closedEditSessions.length).toBe 1 + rootView.open('sample.txt') + expect(editor.closedEditSessions.length).toBe 0 + editor.trigger 'editor:undo-close-session' + expect(editor.getPath()).toBe fixturesProject.resolve('sample.txt') + + it "opens the closed session back up at the previous index", -> rootView.open('sample.txt') - expect(editor.getPath()).toBe require.resolve('fixtures/sample.txt') - expect(editor.closedEditSessions.length).toBe 0 + editor.loadPreviousEditSession() + expect(editor.getPath()).toBe fixturesProject.resolve('sample.js') editor.trigger "core:close" - expect(editor.getPath()).toBe require.resolve('fixtures/sample.js') - expect(editor.closedEditSessions.length).toBe 1 + expect(editor.getPath()).toBe fixturesProject.resolve('sample.txt') editor.trigger 'editor:undo-close-session' - expect(editor.getPath()).toBe require.resolve('fixtures/sample.txt') - expect(editor.closedEditSessions.length).toBe 0 + expect(editor.getPath()).toBe fixturesProject.resolve('sample.js') + expect(editor.getActiveEditSessionIndex()).toBe 0 diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 7e7c253a1..d5de08a88 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -467,6 +467,8 @@ class Editor extends View pushEditSession: (editSession) -> index = @editSessions.length @editSessions.push(editSession) + @closedEditSessions = @closedEditSessions.filter ({path})-> + path isnt editSession.getPath() editSession.on 'destroyed', => @editSessionDestroyed(editSession) @trigger 'editor:edit-session-added', [editSession, index] index @@ -474,7 +476,12 @@ class Editor extends View getBuffer: -> @activeEditSession.buffer undoDestroySession: -> - @rootView().open(@closedEditSessions.pop(), true) unless @closedEditSessions.length == 0 + return unless @closedEditSessions.length > 0 + + {path, index} = @closedEditSessions.pop() + @rootView().open(path) + activeIndex = @getActiveEditSessionIndex() + @moveEditSessionToIndex(activeIndex, index) if index < activeIndex destroyActiveEditSession: -> @destroyEditSessionIndex(@getActiveEditSessionIndex()) @@ -485,7 +492,7 @@ class Editor extends View editSession = @editSessions[index] destroySession = => path = editSession.getPath() - @closedEditSessions.push(path) unless @closedEditSessions.indexOf(path) > -1 + @closedEditSessions.push({path, index}) editSession.destroy() callback?(index) From eceabf0e31f55c70d30a5936cf4906f7ea919f91 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Feb 2013 11:17:43 -0800 Subject: [PATCH 4/5] Add spec for clearing opened session from undo stack --- spec/app/editor-spec.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index ecfe4934f..66587f2fb 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -254,6 +254,14 @@ describe "Editor", -> editor.insertText("def\n") expect(editor.lineElementForScreenRow(0).text()).toBe 'def' + it "removes the opened session from the closed sessions array", -> + editor.edit(rootView.project.buildEditSessionForPath('sample.txt')) + expect(editor.closedEditSessions.length).toBe 0 + editor.trigger "core:close" + expect(editor.closedEditSessions.length).toBe 1 + editor.edit(rootView.project.buildEditSessionForPath('sample.txt')) + expect(editor.closedEditSessions.length).toBe 0 + describe "switching edit sessions", -> [session0, session1, session2] = [] From d234c8fdce0049875b406171020749706e506594 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Feb 2013 11:20:21 -0800 Subject: [PATCH 5/5] Don't track closed sessions with no path --- spec/app/editor-spec.coffee | 3 +++ src/app/editor.coffee | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 66587f2fb..30c8a0ee2 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -156,6 +156,9 @@ describe "Editor", -> editSession = editor.activeEditSession expect(editor.closedEditSessions.length).toBe 0 editor.trigger "core:close" + expect(editor.closedEditSessions.length).toBe 0 + editor.edit(rootView.project.buildEditSessionForPath(rootView.project.resolve('sample.txt'))) + editor.trigger "core:close" expect(editor.closedEditSessions.length).toBe 1 it "closes the active edit session and loads next edit session", -> diff --git a/src/app/editor.coffee b/src/app/editor.coffee index d5de08a88..1a69ef280 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -492,7 +492,7 @@ class Editor extends View editSession = @editSessions[index] destroySession = => path = editSession.getPath() - @closedEditSessions.push({path, index}) + @closedEditSessions.push({path, index}) if path editSession.destroy() callback?(index)