From fd7fbbfea524b56b785e693b7804a9262ecd7158 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 2 Oct 2015 13:42:36 -0600 Subject: [PATCH] Move PaneContainer.deserialize to an instance method Signed-off-by: Max Brunsfeld --- spec/pane-container-element-spec.coffee | 14 ++++---- spec/pane-container-spec.coffee | 44 +++++++++++++++---------- spec/pane-element-spec.coffee | 4 +-- spec/pane-spec.coffee | 21 +++++++----- src/pane-container.coffee | 31 +++++++---------- src/workspace.coffee | 6 ++-- 6 files changed, 63 insertions(+), 57 deletions(-) diff --git a/spec/pane-container-element-spec.coffee b/spec/pane-container-element-spec.coffee index 890baec38..46a8fbdbb 100644 --- a/spec/pane-container-element-spec.coffee +++ b/spec/pane-container-element-spec.coffee @@ -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')]) diff --git a/spec/pane-container-spec.coffee b/spec/pane-container-spec.coffee index 58e159279..f577c3ba2 100644 --- a/spec/pane-container-spec.coffee +++ b/spec/pane-container-spec.coffee @@ -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() diff --git a/spec/pane-element-spec.coffee b/spec/pane-element-spec.coffee index 40712ce90..e20068bfc 100644 --- a/spec/pane-element-spec.coffee +++ b/spec/pane-element-spec.coffee @@ -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", -> diff --git a/spec/pane-spec.coffee b/spec/pane-spec.coffee index d293a6d2c..8f18b6199 100644 --- a/spec/pane-spec.coffee +++ b/spec/pane-spec.coffee @@ -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() diff --git a/src/pane-container.coffee b/src/pane-container.coffee index 18f6166c0..60537424d 100644 --- a/src/pane-container.coffee +++ b/src/pane-container.coffee @@ -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 diff --git a/src/workspace.coffee b/src/workspace.coffee index c8bbdc0c8..ef684f54e 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -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 = []