From 472b436b248a63f7eacfb10894c44d35ce8c23df Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Feb 2013 20:23:53 -0800 Subject: [PATCH] Add spec for dragging/dropping tabs across editors --- src/app/editor.coffee | 8 +++++++ src/packages/tabs/lib/tab-view.coffee | 30 +++++++------------------ src/packages/tabs/spec/tabs-spec.coffee | 25 +++++++++++++++++++++ 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 146063d7b..c6fbcc44d 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -550,11 +550,19 @@ class Editor extends View ) moveEditSessionAtIndex: (fromIndex, toIndex) -> + return if fromIndex is toIndex editSession = @editSessions.splice(fromIndex, 1) @editSessions.splice(toIndex, 0, editSession[0]) @trigger 'editor:edit-session-order-changed', [editSession, fromIndex, toIndex] @setActiveEditSessionIndex(toIndex) + moveEditSessionToEditor: (fromIndex, toEditor, toIndex) -> + fromEditSession = @editSessions[fromIndex] + toEditSession = fromEditSession.copy() + @destroyEditSessionIndex(fromIndex) + toEditor.edit(toEditSession) + toEditor.moveEditSessionAtIndex(toEditor.getActiveEditSessionIndex(), toIndex) + transferEditSessionAtIndex: (fromIndex, toIndex, toEditor) -> toEditor.editSessions.splice(toIndex, 0, @editSessions.splice(fromIndex, 1)[0]) diff --git a/src/packages/tabs/lib/tab-view.coffee b/src/packages/tabs/lib/tab-view.coffee index b86fa61fb..6cc84b63a 100644 --- a/src/packages/tabs/lib/tab-view.coffee +++ b/src/packages/tabs/lib/tab-view.coffee @@ -70,6 +70,7 @@ class TabView extends SortableList onDrop: (event) => super + droppedNearTab = @getSortableElement(event) transfer = event.originalEvent.dataTransfer previousDraggedTabIndex = transfer.getData 'sortable-index' @@ -77,36 +78,21 @@ class TabView extends SortableList toPaneIndex = rootView.indexOfPane($(event.target).closest('.pane')) fromPane = $(rootView.find('.pane')[fromPaneIndex]) fromEditor = fromPane.find('.editor').view() + draggedTab = fromPane.find(".#{TabView.viewClass()} .sortable:eq(#{previousDraggedTabIndex})") + return if draggedTab.is(droppedNearTab) if fromPaneIndex == toPaneIndex droppedNearTab = @getSortableElement(event) - draggedTab = fromPane.find(".#{TabView.viewClass()} .sortable:eq(#{previousDraggedTabIndex})") - unless draggedTab.is(droppedNearTab) - fromIndex = draggedTab.index() - toIndex = droppedNearTab.index() - toIndex++ if fromIndex > toIndex - fromEditor.moveEditSessionAtIndex(fromIndex, toIndex) + fromIndex = draggedTab.index() + toIndex = droppedNearTab.index() + toIndex++ if fromIndex > toIndex + fromEditor.moveEditSessionAtIndex(fromIndex, toIndex) else toPane = $(rootView.find('.pane')[toPaneIndex]) toEditor = toPane.find('.editor').view() - droppedNearTab = @getSortableElement(event) - draggedTab = fromPane.find(".#{TabView.viewClass()} .sortable:eq(#{previousDraggedTabIndex})") - - return if draggedTab.is(droppedNearTab) if fromPaneIndex != toPaneIndex return if @containsEditSession(toEditor, fromEditor.editSessions[draggedTab.index()]) - draggedTab.remove() - draggedTab.insertAfter(droppedNearTab) - currentDraggedTabIndex = draggedTab.index() - fromEditor.transferEditSessionAtIndex(previousDraggedTabIndex, currentDraggedTabIndex, toEditor) - - if !fromPane.find('.tab').length - fromPane.view().remove() - else if fromPaneIndex != toPaneIndex && draggedTab.hasClass('active') - fromEditor.setActiveEditSessionIndex(0) - - @setActiveTab(currentDraggedTabIndex) - toEditor.setActiveEditSessionIndex(currentDraggedTabIndex) + fromEditor.moveEditSessionToEditor(draggedTab.index(), toEditor, droppedNearTab.index() + 1) toEditor.focus() diff --git a/src/packages/tabs/spec/tabs-spec.coffee b/src/packages/tabs/spec/tabs-spec.coffee index 2fbb3cef7..1db15106e 100644 --- a/src/packages/tabs/spec/tabs-spec.coffee +++ b/src/packages/tabs/spec/tabs-spec.coffee @@ -180,3 +180,28 @@ describe "TabView", -> expect(tabs.find('.tab:eq(0) .file-name').text()).toBe "sample.txt" expect(tabs.find('.tab:eq(1) .file-name').text()).toBe "sample.js" + + describe "when a tab is dragged from one editor and dropped onto another editor", -> + it "moves the edit session and updates the order of the tabs", -> + leftTabs = tabs + editor.splitRight() + rightTabs = rootView.find('.tabs:last').view() + + sortableElement = [leftTabs.find('.tab:eq(0)')] + spyOn(tabs, 'getSortableElement').andCallFake -> sortableElement[0] + event = $.Event() + event.target = leftTabs + event.originalEvent = + dataTransfer: + data: {} + setData: (key, value) -> @data[key] = value + getData: (key) -> @data[key] + + tabs.onDragStart(event) + + event.target = rightTabs + sortableElement = [rightTabs.find('.tab:eq(0)')] + tabs.onDrop(event) + + expect(rightTabs.find('.tab:eq(0) .file-name').text()).toBe "sample.txt" + expect(rightTabs.find('.tab:eq(1) .file-name').text()).toBe "sample.js"