Move PaneContainer.deserialize to an instance method

Signed-off-by: Max Brunsfeld <maxbrunsfeld@github.com>
This commit is contained in:
Nathan Sobo 2015-10-02 13:42:36 -06:00
parent 4a00d6ba35
commit fd7fbbfea5
6 changed files with 63 additions and 57 deletions

View File

@ -42,7 +42,7 @@ describe "PaneContainerElement", ->
]
it "transfers focus to the next pane if a focused pane is removed", ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
containerElement = atom.views.getView(container)
leftPane = container.getActivePane()
leftPaneElement = atom.views.getView(leftPane)
@ -58,10 +58,10 @@ describe "PaneContainerElement", ->
describe "when a pane is split", ->
it "builds appropriately-oriented atom-pane-axis elements", ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
containerElement = atom.views.getView(container)
pane1 = container.getRoot()
pane1 = container.getActivePane()
pane2 = pane1.splitRight()
pane3 = pane2.splitDown()
@ -84,7 +84,7 @@ describe "PaneContainerElement", ->
[container, containerElement] = []
beforeEach ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
containerElement = atom.views.getView(container)
document.querySelector('#jasmine-content').appendChild(containerElement)
@ -201,7 +201,7 @@ describe "PaneContainerElement", ->
[leftPane, rightPane] = []
beforeEach ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
leftPane = container.getActivePane()
rightPane = leftPane.splitRight()
@ -252,8 +252,8 @@ describe "PaneContainerElement", ->
element.tabIndex = -1
element
container = new PaneContainer
pane1 = container.getRoot()
container = new PaneContainer(config: atom.config)
pane1 = container.getActivePane()
pane1.activateItem(buildElement('1'))
pane4 = pane1.splitDown(items: [buildElement('4')])
pane7 = pane4.splitDown(items: [buildElement('7')])

View File

@ -12,8 +12,9 @@ describe "PaneContainer", ->
@deserialize: -> new this
serialize: -> deserializer: 'Item'
pane1A = new Pane(items: [new Item])
containerA = new PaneContainer(root: pane1A)
containerA = new PaneContainer(config: atom.config)
pane1A = containerA.getActivePane()
pane1A.addItem(new Item)
pane2A = pane1A.splitRight(items: [new Item])
pane3A = pane2A.splitDown(items: [new Item])
pane3A.focus()
@ -21,7 +22,8 @@ describe "PaneContainer", ->
it "preserves the focused pane across serialization", ->
expect(pane3A.focused).toBe true
containerB = PaneContainer.deserialize(containerA.serialize())
containerB = new PaneContainer(config: atom.config)
containerB.deserialize(containerA.serialize(), atom.deserializers)
[pane1B, pane2B, pane3B] = containerB.getPanes()
expect(pane3B.focused).toBe true
@ -29,7 +31,8 @@ describe "PaneContainer", ->
pane3A.activate()
expect(containerA.getActivePane()).toBe pane3A
containerB = PaneContainer.deserialize(containerA.serialize())
containerB = new PaneContainer(config: atom.config)
containerB.deserialize(containerA.serialize(), atom.deserializers)
[pane1B, pane2B, pane3B] = containerB.getPanes()
expect(containerB.getActivePane()).toBe pane3B
@ -37,7 +40,8 @@ describe "PaneContainer", ->
pane3A.activate()
state = containerA.serialize()
state.activePaneId = -22
containerB = atom.deserializers.deserialize(state)
containerB = new PaneContainer(config: atom.config)
containerB.deserialize(state, atom.deserializers)
expect(containerB.getActivePane()).toBe containerB.getPanes()[0]
describe "if there are empty panes after deserialization", ->
@ -47,7 +51,8 @@ describe "PaneContainer", ->
describe "if the 'core.destroyEmptyPanes' config option is false (the default)", ->
it "leaves the empty panes intact", ->
state = containerA.serialize()
containerB = atom.deserializers.deserialize(state)
containerB = new PaneContainer(config: atom.config)
containerB.deserialize(state, atom.deserializers)
[leftPane, column] = containerB.getRoot().getChildren()
[topPane, bottomPane] = column.getChildren()
@ -60,14 +65,15 @@ describe "PaneContainer", ->
atom.config.set('core.destroyEmptyPanes', true)
state = containerA.serialize()
containerB = atom.deserializers.deserialize(state)
containerB = new PaneContainer(config: atom.config)
containerB.deserialize(state, atom.deserializers)
[leftPane, rightPane] = containerB.getRoot().getChildren()
expect(leftPane.getItems().length).toBe 1
expect(rightPane.getItems().length).toBe 1
it "does not allow the root pane to be destroyed", ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
container.getRoot().destroy()
expect(container.getRoot()).toBeDefined()
expect(container.getRoot().isDestroyed()).toBe false
@ -76,7 +82,7 @@ describe "PaneContainer", ->
[container, pane1, pane2] = []
beforeEach ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
pane1 = container.getRoot()
it "returns the first pane if no pane has been made active", ->
@ -105,7 +111,8 @@ describe "PaneContainer", ->
[container, pane1, pane2, observed] = []
beforeEach ->
container = new PaneContainer(root: new Pane(items: [new Object, new Object]))
container = new PaneContainer(config: atom.config)
container.getRoot().addItems([new Object, new Object])
container.getRoot().splitRight(items: [new Object, new Object])
[pane1, pane2] = container.getPanes()
@ -124,7 +131,7 @@ describe "PaneContainer", ->
describe "::observePanes()", ->
it "invokes observers with all current and future panes", ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
container.getRoot().splitRight()
[pane1, pane2] = container.getPanes()
@ -138,7 +145,8 @@ describe "PaneContainer", ->
describe "::observePaneItems()", ->
it "invokes observers with all current and future pane items", ->
container = new PaneContainer(root: new Pane(items: [new Object, new Object]))
container = new PaneContainer(config: atom.config)
container.getRoot().addItems([new Object, new Object])
container.getRoot().splitRight(items: [new Object])
[pane1, pane2] = container.getPanes()
observed = []
@ -157,7 +165,7 @@ describe "PaneContainer", ->
shouldPromptToSave: -> true
getURI: -> 'test'
container = new PaneContainer
container = new PaneContainer(config: atom.config)
container.getRoot().splitRight()
[pane1, pane2] = container.getPanes()
pane1.addItem(new TestItem)
@ -177,7 +185,7 @@ describe "PaneContainer", ->
describe "::onDidAddPane(callback)", ->
it "invokes the given callback when panes are added", ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
events = []
container.onDidAddPane (event) -> events.push(event)
@ -194,7 +202,7 @@ describe "PaneContainer", ->
destroy: -> @_isDestroyed = true
isDestroyed: -> @_isDestroyed
container = new PaneContainer
container = new PaneContainer(config: atom.config)
events = []
container.onWillDestroyPane (event) ->
itemsDestroyed = (item.isDestroyed() for item in event.pane.getItems())
@ -210,7 +218,7 @@ describe "PaneContainer", ->
describe "::onDidDestroyPane(callback)", ->
it "invokes the given callback when panes are destroyed", ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
events = []
container.onDidDestroyPane (event) -> events.push(event)
@ -225,7 +233,7 @@ describe "PaneContainer", ->
describe "::onWillDestroyPaneItem() and ::onDidDestroyPaneItem", ->
it "invokes the given callbacks when an item will be destroyed on any pane", ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
pane1 = container.getRoot()
item1 = new Object
item2 = new Object
@ -252,7 +260,7 @@ describe "PaneContainer", ->
describe "::saveAll()", ->
it "saves all open pane items", ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
pane1 = container.getRoot()
pane2 = pane1.splitRight()

View File

@ -4,8 +4,8 @@ describe "PaneElement", ->
[paneElement, container, pane] = []
beforeEach ->
container = new PaneContainer
pane = container.getRoot()
container = new PaneContainer(config: atom.config)
pane = container.getActivePane()
paneElement = atom.views.getView(pane)
describe "when the pane's active status changes", ->

View File

@ -38,8 +38,8 @@ describe "Pane", ->
[container, pane1, pane2] = []
beforeEach ->
container = new PaneContainer(root: new Pane)
container.getRoot().splitRight()
container = new PaneContainer(config: atom.config)
container.getActivePane().splitRight()
[pane1, pane2] = container.getPanes()
it "changes the active pane on the container", ->
@ -107,8 +107,9 @@ describe "Pane", ->
it "throws an exception if the item is already present on a pane", ->
item = new Item("A")
pane1 = new Pane(items: [item])
container = new PaneContainer(root: pane1)
container = new PaneContainer(config: atom.config)
pane1 = container.getActivePane()
pane1.addItem(item)
pane2 = pane1.splitRight()
expect(-> pane2.addItem(item)).toThrow()
@ -501,8 +502,9 @@ describe "Pane", ->
[item1, item2, item3, item4, item5] = []
beforeEach ->
pane1 = new Pane(items: [new Item("A"), new Item("B"), new Item("C")])
container = new PaneContainer(root: pane1)
container = new PaneContainer(config: atom.config)
pane1 = container.getActivePane()
pane1.addItems([new Item("A"), new Item("B"), new Item("C")])
pane2 = pane1.splitRight(items: [new Item("D"), new Item("E")])
[item1, item2, item3] = pane1.getItems()
[item4, item5] = pane2.getItems()
@ -553,8 +555,9 @@ describe "Pane", ->
[pane1, container] = []
beforeEach ->
pane1 = new Pane(items: [new Item("A")])
container = new PaneContainer(root: pane1)
container = new PaneContainer(config: atom.config)
pane1 = container.getActivePane()
pane1.addItem(new Item("A"))
describe "::splitLeft(params)", ->
describe "when the parent is the container root", ->
@ -685,7 +688,7 @@ describe "Pane", ->
[container, pane1, pane2] = []
beforeEach ->
container = new PaneContainer
container = new PaneContainer(config: atom.config)
pane1 = container.root
pane1.addItems([new Item("A"), new Item("B")])
pane2 = pane1.splitRight()

View File

@ -7,42 +7,35 @@ ItemRegistry = require './item-registry'
module.exports =
class PaneContainer extends Model
@version: 1
serializationVersion: 1
root: null
@deserialize: (state) ->
container = Object.create(@prototype) # allows us to pass a self reference to our child before invoking constructor
state.root = atom.deserializers.deserialize(state.root, {container})
state.destroyEmptyPanes = atom.config.get('core.destroyEmptyPanes')
state.activePane = find state.root.getPanes(), (pane) -> pane.id is state.activePaneId
@call(container, state) # run constructor
container
constructor: (params) ->
super
@activePane = params?.activePane
@config = params.config
@emitter = new Emitter
@subscriptions = new CompositeDisposable
@itemRegistry = new ItemRegistry
@setRoot(params?.root ? new Pane)
@setActivePane(@getPanes()[0]) unless @getActivePane()
@destroyEmptyPanes() if params?.destroyEmptyPanes
@setRoot(new Pane(container: this))
@setActivePane(@getRoot())
@monitorActivePaneItem()
@monitorPaneItems()
serialize: (params) ->
deserializer: 'PaneContainer'
version: @constructor.version
version: @serializationVersion
root: @root?.serialize()
activePaneId: @activePane.id
deserialize: (state, deserializerManager) ->
return unless state.version is @serializationVersion
@setRoot(deserializerManager.deserialize(state.root, {container: this}))
activePane = find @getRoot().getPanes(), (pane) -> pane.id is state.activePaneId
@setActivePane(activePane ? @getPanes()[0])
@destroyEmptyPanes() if @config.get('core.destroyEmptyPanes')
onDidChangeRoot: (fn) ->
@emitter.on 'did-change-root', fn

View File

@ -32,7 +32,9 @@ class Workspace extends Model
for packageName in state.packagesWithActiveGrammars ? []
atom.packages.getLoadedPackage(packageName)?.loadGrammarsSync()
state.paneContainer = PaneContainer.deserialize(state.paneContainer)
paneContainer = new PaneContainer(config: atom.config)
paneContainer.deserialize(state.paneContainer, atom.deserializers)
state.paneContainer = paneContainer
new this(state)
constructor: (params) ->
@ -45,7 +47,7 @@ class Workspace extends Model
@emitter = new Emitter
@openers = []
@paneContainer ?= new PaneContainer()
@paneContainer ?= new PaneContainer(config: atom.config)
@paneContainer.onDidDestroyPaneItem(@didDestroyPaneItem)
@directorySearchers = []