From dd120663b7e0ef9018ecad2cecb8f0d9b355128b Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 25 Feb 2013 17:11:29 -0700 Subject: [PATCH] Pane emits 'pane:item-added' events --- spec/app/pane-spec.coffee | 12 ++- src/app/pane.coffee | 4 +- src/packages/tabs/lib/tab-bar-view.coffee | 100 ++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 src/packages/tabs/lib/tab-bar-view.coffee diff --git a/spec/app/pane-spec.coffee b/spec/app/pane-spec.coffee index 0d2abd87e..963ce359f 100644 --- a/spec/app/pane-spec.coffee +++ b/spec/app/pane-spec.coffee @@ -45,15 +45,25 @@ describe "Pane", -> itemChangedHandler.reset() describe "when the given item isn't yet in the items list on the pane", -> - it "adds it to the items list after the active item", -> + view3 = null + beforeEach -> view3 = $$ -> @div id: 'view-3', "View 3" pane.showItem(editSession1) expect(pane.getActiveItemIndex()).toBe 1 + + it "adds it to the items list after the active item", -> pane.showItem(view3) expect(pane.getItems()).toEqual [view1, editSession1, view3, view2, editSession2] expect(pane.activeItem).toBe view3 expect(pane.getActiveItemIndex()).toBe 2 + it "triggers the 'item-added' event with the item and its index before the 'active-item-changed' event", -> + events = [] + container.on 'pane:item-added', (e, item, index) -> events.push(['pane:item-added', item, index]) + container.on 'pane:active-item-changed', (e, item) -> events.push(['pane:active-item-changed', item]) + pane.showItem(view3) + expect(events).toEqual [['pane:item-added', view3, 2], ['pane:active-item-changed', view3]] + describe "when showing a model item", -> describe "when no view has yet been appended for that item", -> it "appends and shows a view to display the item based on its `.getViewClass` method", -> diff --git a/src/app/pane.coffee b/src/app/pane.coffee index 1fad3f6fa..547160157 100644 --- a/src/app/pane.coffee +++ b/src/app/pane.coffee @@ -84,7 +84,9 @@ class Pane extends View addItem: (item) -> return if _.include(@items, item) - @items.splice(@getActiveItemIndex() + 1, 0, item) + index = @getActiveItemIndex() + 1 + @items.splice(index, 0, item) + @trigger 'pane:item-added', [item, index] item removeActiveItem: => diff --git a/src/packages/tabs/lib/tab-bar-view.coffee b/src/packages/tabs/lib/tab-bar-view.coffee new file mode 100644 index 000000000..d98d12bc1 --- /dev/null +++ b/src/packages/tabs/lib/tab-bar-view.coffee @@ -0,0 +1,100 @@ +$ = require 'jquery' +SortableList = require 'sortable-list' +TabView = require './tab-view' + +module.exports = +class TabBarView extends SortableList + @content: -> + @ul class: "tabs #{@viewClass()}" + + initialize: (@pane) -> + super + + @addTabForItem(item) for item in @pane.getItems() + + +# @addTabForEditSession(editSession) for editSession in @editor.editSessions +# +# @setActiveTab(@editor.getActiveEditSessionIndex()) +# @editor.on 'editor:active-edit-session-changed', (e, editSession, index) => @setActiveTab(index) +# @editor.on 'editor:edit-session-added', (e, editSession) => @addTabForEditSession(editSession) +# @editor.on 'editor:edit-session-removed', (e, editSession, index) => @removeTabAtIndex(index) +# @editor.on 'editor:edit-session-order-changed', (e, editSession, fromIndex, toIndex) => +# fromTab = @find(".tab:eq(#{fromIndex})") +# toTab = @find(".tab:eq(#{toIndex})") +# fromTab.detach() +# if fromIndex < toIndex +# fromTab.insertAfter(toTab) +# else +# fromTab.insertBefore(toTab) + + @on 'click', '.tab', (e) => + @editor.setActiveEditSessionIndex($(e.target).closest('.tab').index()) + @editor.focus() + + @on 'click', '.tab .close-icon', (e) => + index = $(e.target).closest('.tab').index() + @editor.destroyEditSessionIndex(index) + false + + @pane.prepend(this) + + addTabForItem: (item) -> + tabView = new TabView(item, @pane) + @append(tabView) + @setActiveTabView(tabView) if item is @pane.currentItem + + setActiveTabView: (tabView) -> + unless tabView.hasClass('active') + @find(".tab.active").removeClass('active') + tabView.addClass('active') + + removeTabAtIndex: (index) -> + @find(".tab:eq(#{index})").remove() + + containsEditSession: (editor, editSession) -> + for session in editor.editSessions + return true if editSession.getPath() is session.getPath() + + shouldAllowDrag: (event) -> + panes = rootView.find('.pane') + !(panes.length == 1 && panes.find('.sortable').length == 1) + + onDragStart: (event) => + super + + pane = $(event.target).closest('.pane') + paneIndex = rootView.indexOfPane(pane) + event.originalEvent.dataTransfer.setData 'from-pane-index', paneIndex + + onDrop: (event) => + super + + droppedNearTab = @getSortableElement(event) + transfer = event.originalEvent.dataTransfer + previousDraggedTabIndex = transfer.getData 'sortable-index' + + fromPaneIndex = ~~transfer.getData 'from-pane-index' + toPaneIndex = rootView.indexOfPane($(event.target).closest('.pane')) + fromPane = $(rootView.find('.pane')[fromPaneIndex]) + fromEditor = fromPane.find('.editor').view() + draggedTab = fromPane.find(".#{TabBarView.viewClass()} .sortable:eq(#{previousDraggedTabIndex})") + + if draggedTab.is(droppedNearTab) + fromEditor.focus() + return + + if fromPaneIndex == toPaneIndex + droppedNearTab = @getSortableElement(event) + fromIndex = draggedTab.index() + toIndex = droppedNearTab.index() + toIndex++ if fromIndex > toIndex + fromEditor.moveEditSessionToIndex(fromIndex, toIndex) + fromEditor.focus() + else + toEditor = rootView.find(".pane:eq(#{toPaneIndex}) > .editor").view() + if @containsEditSession(toEditor, fromEditor.editSessions[draggedTab.index()]) + fromEditor.focus() + else + fromEditor.moveEditSessionToEditor(draggedTab.index(), toEditor, droppedNearTab.index() + 1) + toEditor.focus()