Add spec for dragging/dropping tabs across editors

This commit is contained in:
Kevin Sawicki
2013-02-11 20:23:53 -08:00
parent 867e8d5678
commit 472b436b24
3 changed files with 41 additions and 22 deletions

View File

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

View File

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

View File

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