From 41f18ee6a2754009057c12372ea775cdc5d3b801 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 18 Feb 2013 15:23:23 -0700 Subject: [PATCH] Add `Pane.removeItem` --- spec/app/pane-spec.coffee | 25 +++++++++++++++++++++++++ src/app/pane.coffee | 23 +++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/spec/app/pane-spec.coffee b/spec/app/pane-spec.coffee index 9edd5216a..6d090371b 100644 --- a/spec/app/pane-spec.coffee +++ b/spec/app/pane-spec.coffee @@ -45,6 +45,31 @@ describe "Pane", -> pane.showItem(view2) expect(pane.itemViews.find('#view-2')).toExist() + describe ".removeItem(item)", -> + it "removes the item from the items list and shows the next item if it was showing", -> + pane.removeItem(view1) + expect(pane.getItems()).toEqual [editSession1, view2, editSession2] + expect(pane.currentItem).toBe editSession1 + + pane.showItem(editSession2) + pane.removeItem(editSession2) + expect(pane.getItems()).toEqual [editSession1, view2] + expect(pane.currentItem).toBe editSession1 + + describe "when the item is a view", -> + it "removes the item from the 'item-views' div", -> + expect(view1.parent()).toMatchSelector pane.itemViews + pane.removeItem(view1) + expect(view1.parent()).not.toMatchSelector pane.itemViews + + describe "when the item is a model", -> + it "removes the associated view only when all items that require it have been removed", -> + pane.showItem(editSession2) + pane.removeItem(editSession2) + expect(pane.itemViews.find('.editor')).toExist() + pane.removeItem(editSession1) + expect(pane.itemViews.find('.editor')).not.toExist() + describe "pane:show-next-item and pane:show-preview-item", -> it "advances forward/backward through the pane's items, looping around at either end", -> expect(pane.currentItem).toBe view1 diff --git a/src/app/pane.coffee b/src/app/pane.coffee index b5b6cccaa..f94779bd5 100644 --- a/src/app/pane.coffee +++ b/src/app/pane.coffee @@ -1,5 +1,6 @@ {View} = require 'space-pen' $ = require 'jquery' +_ = require 'underscore' PaneRow = require 'pane-row' PaneColumn = require 'pane-column' @@ -22,6 +23,9 @@ class Pane extends View @command 'pane:show-next-item', @showNextItem @command 'pane:show-previous-item', @showPreviousItem + getItems: -> + new Array(@items...) + showNextItem: => index = @getCurrentItemIndex() if index < @items.length - 1 @@ -50,6 +54,21 @@ class Pane extends View @currentItem = item view.show() + removeItem: (item) -> + @showNextItem() if item is @currentItem and @items.length > 1 + _.remove(@items, item) + @cleanupItemView(item) + + cleanupItemView: (item) -> + if item instanceof $ + item.remove() + else + viewClass = item.getViewClass() + otherItemsForView = @items.filter (i) -> i.getViewClass?() is viewClass + unless otherItemsForView.length + @viewsByClassName[viewClass.name].remove() + delete @viewsByClassName[viewClass.name] + viewForItem: (item) -> if item instanceof $ item @@ -57,9 +76,9 @@ class Pane extends View viewClass = item.getViewClass() if view = @viewsByClassName[viewClass.name] view.setModel(item) - view else - @viewsByClassName[viewClass.name] = new viewClass(item) + view = @viewsByClassName[viewClass.name] = new viewClass(item) + view serialize: -> deserializer: "Pane"