mirror of
https://github.com/atom/atom.git
synced 2026-01-26 23:38:48 -05:00
Add spec for dragging/dropping tabs across editors
This commit is contained in:
@@ -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])
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user