Add serialize and deserialize functionality to the itemStack.

This commit is contained in:
natalieogle
2016-02-03 22:21:46 -08:00
parent 7a6c8f53a4
commit 6466cb489e
2 changed files with 43 additions and 3 deletions

View File

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

View File

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