From 6466cb489e349422c0845dbac5b20edf8ef5b14c Mon Sep 17 00:00:00 2001 From: natalieogle Date: Wed, 3 Feb 2016 22:21:46 -0800 Subject: [PATCH] Add serialize and deserialize functionality to the itemStack. --- spec/pane-spec.coffee | 30 +++++++++++++++++++++++++++++- src/pane.coffee | 16 ++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/spec/pane-spec.coffee b/spec/pane-spec.coffee index 9bf2306a9..b4057fb4c 100644 --- a/spec/pane-spec.coffee +++ b/spec/pane-spec.coffee @@ -183,7 +183,8 @@ describe "Pane", -> pane.activateItem(itemD, true) expect(pane.getItems().map (item) -> item.name).toEqual ['A', 'B', 'D'] - fdescribe "::activateMostRecentlyUsedItem()", -> + + describe "::activateMostRecentlyUsedItem()", -> it "sets the active item to the most recently used item", -> pane = new Pane(paneParams(items: [new Item("A"), new Item("B"), new Item("C")])) [item1, item2, item3] = pane.getItems() @@ -915,3 +916,30 @@ describe "Pane", -> pane.focus() newPane = Pane.deserialize(pane.serialize(), atom) expect(newPane.focused).toBe true + + it "can serialize and deserialize the order of the items in the itemStack", -> + [item1, item2, item3] = pane.getItems() + pane.itemStack = [item3, item1, item2] + newPane = Pane.deserialize(pane.serialize(), atom) + expect(newPane.itemStack).toEqual pane.itemStack + expect(newPane.itemStack[2]).toEqual item2 + + it "builds the itemStack if the itemStack is not serialized", -> + [item1, item2, item3] = pane.getItems() + newPane = Pane.deserialize(pane.serialize(), atom) + expect(newPane.getItems()).toEqual newPane.itemStack + + it "rebuilds the itemStack if items.length does not match itemStack.length", -> + [item1, item2, item3] = pane.getItems() + pane.itemStack = [item2, item3] + newPane = Pane.deserialize(pane.serialize(), atom) + expect(newPane.getItems()).toEqual newPane.itemStack + + it "does not serialize items in the itemStack if they will not be serialized", -> + [item1, item2, item3] = pane.getItems() + pane.itemStack = [item2, item1, item3] + unserializable = {} + pane.activateItem(unserializable) + + newPane = Pane.deserialize(pane.serialize(), atom) + expect(newPane.itemStack).toEqual [item2, item1, item3] diff --git a/src/pane.coffee b/src/pane.coffee index a6a47be54..0aa1ed8fd 100644 --- a/src/pane.coffee +++ b/src/pane.coffee @@ -20,7 +20,7 @@ class Pane extends Model focused: false @deserialize: (state, {deserializers, applicationDelegate, config, notifications}) -> - {items, activeItemURI, activeItemUri} = state + {items, itemStack, activeItemURI, activeItemUri} = state activeItemURI ?= activeItemUri state.items = compact(items.map (itemState) -> deserializers.deserialize(itemState)) state.activeItem = find state.items, (item) -> @@ -48,15 +48,20 @@ class Pane extends Model @addItems(compact(params?.items ? [])) @setActiveItem(@items[0]) unless @getActiveItem()? + @addItemsToStack(params?.itemStack ? []) @setFlexScale(params?.flexScale ? 1) serialize: -> if typeof @activeItem?.getURI is 'function' activeItemURI = @activeItem.getURI() + itemStack = [] + for item in @items + itemStack.push(@itemStack.indexOf(item)) if typeof item.serialize is 'function' deserializer: 'Pane' id: @id items: compact(@items.map((item) -> item.serialize?())) + itemStack: itemStack activeItemURI: activeItemURI focused: @focused flexScale: @flexScale @@ -291,6 +296,14 @@ class Pane extends Model @emitter.emit 'did-change-active-item', @activeItem @activeItem + # Build the itemStack after deserializing + addItemsToStack: (itemStack) -> + if itemStack.length is 0 or itemStack.length isnt @items.length or itemStack.indexOf(-1) >= 0 + itemStack = @items.map((item) => @items.indexOf(item)) + for item, i in itemStack + index = itemStack.indexOf(i) + @addItemToStack(@items[index]) unless index is -1 + # Add item (or move item) to the end of the itemStack addItemToStack: (newItem) -> index = @itemStack.indexOf(newItem) @@ -311,7 +324,6 @@ class Pane extends Model # Makes the most recently used item active. activateMostRecentlyUsedItem: -> - console.log(@items[0].serialize) if @items.length > 1 index = @itemStack.length - 2 mostRecentlyUsedItem = @itemStack[index]