From 22fe04fb276a8a1c63aa53d879b448b6fca4bbc5 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 14:49:50 -0700 Subject: [PATCH 01/21] Drop out a basic workspace model --- src/workspace-view.coffee | 28 ++++++++++++++++------------ src/workspace.coffee | 20 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 src/workspace.coffee diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 643263c6c..ffefaadf9 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -1,10 +1,12 @@ ipc = require 'ipc' path = require 'path' Q = require 'q' -{$, $$, View} = require './space-pen-extensions' _ = require 'underscore-plus' +Delegator = require 'delegato' +{$, $$, View} = require './space-pen-extensions' fs = require 'fs-plus' Serializable = require 'serializable' +Workspace = require './workspace' EditorView = require './editor-view' PaneView = require './pane-view' PaneColumnView = require './pane-column-view' @@ -38,10 +40,16 @@ Editor = require './editor' # module.exports = class WorkspaceView extends View - Serializable.includeInto(this) atom.deserializers.add(this, PaneView, PaneRowView, PaneColumnView, EditorView) + Serializable.includeInto(this) + Delegator.includeInto(this) - @version: 3 + @delegatesProperty 'fullScreen', toProperty: 'model' + + @version: 4 + + @deserialize: (state) -> + new this(Workspace.deserialize(state.model)) @configDefaults: ignoredNames: [".git", ".svn", ".DS_Store"] @@ -59,8 +67,10 @@ class WorkspaceView extends View @div class: 'panes', outlet: 'panes' # Private: - initialize: ({panes, @fullScreen}={}) -> - panes ?= new PaneContainerView + initialize: (@model) -> + @model ?= new Workspace + + panes = new PaneContainerView(@model.paneContainer) @panes.replaceWith(panes) @panes = panes @@ -116,15 +126,9 @@ class WorkspaceView extends View @command 'core:save', => @saveActivePaneItem() @command 'core:save-as', => @saveActivePaneItemAs() - # Private: - deserializeParams: (params) -> - params.panes = atom.deserializers.deserialize(params.panes) - params - # Private: serializeParams: -> - panes: @panes.serialize() - fullScreen: atom.isFullScreen() + model: @model.serialize() # Private: handleFocus: (e) -> diff --git a/src/workspace.coffee b/src/workspace.coffee new file mode 100644 index 000000000..255015c58 --- /dev/null +++ b/src/workspace.coffee @@ -0,0 +1,20 @@ +{Model} = require 'theorist' +Serializable = require 'serializable' +PaneContainer = require './pane-container' + +module.exports = +class Workspace extends Model + atom.deserializers.add(this) + Serializable.includeInto(this) + + @properties + paneContainer: -> new PaneContainer + fullScreen: false + + deserializeParams: (params) -> + params.paneContainer = PaneContainer.deserialize(params.paneContainer) + params + + serializeParams: -> + paneContainer: @paneContainer.serialize() + fullScreen: atom.isFullScreen() From 54dd5ea28e77ec68d279c09ec73613dcbf3ce87a Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 15:45:50 -0700 Subject: [PATCH 02/21] Destroy the model when PaneContainerView is removed --- src/workspace-view.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index ffefaadf9..ae35dc085 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -354,6 +354,7 @@ class WorkspaceView extends View # Private: Destroys everything. remove: -> + @model.destroy() editorView.remove() for editorView in @getEditorViews() super From 7317d52896e3248752806e28a7bff7df1ce85bc2 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 15:47:31 -0700 Subject: [PATCH 03/21] Move paneForUri to PaneContainer model --- src/pane-container-view.coffee | 5 +---- src/pane-container.coffee | 4 ++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pane-container-view.coffee b/src/pane-container-view.coffee index a55a1d65b..215ebfffb 100644 --- a/src/pane-container-view.coffee +++ b/src/pane-container-view.coffee @@ -105,10 +105,7 @@ class PaneContainerView extends View @getActivePane()?.activeView paneForUri: (uri) -> - for pane in @getPanes() - view = pane.itemForUri(uri) - return pane if view? - null + @viewForModel(@model.paneForUri(uri)) focusNextPane: -> panes = @getPanes() diff --git a/src/pane-container.coffee b/src/pane-container.coffee index 14803afc8..28ff0d29e 100644 --- a/src/pane-container.coffee +++ b/src/pane-container.coffee @@ -1,3 +1,4 @@ +{find} = require 'underscore-plus' {Model} = require 'theorist' Serializable = require 'serializable' Pane = require './pane' @@ -36,6 +37,9 @@ class PaneContainer extends Model getPanes: -> @root?.getPanes() ? [] + paneForUri: (uri) -> + find @getPanes(), (pane) -> pane.itemForUri(uri)? + activateNextPane: -> panes = @getPanes() if panes.length > 1 From 8e785835212abf763ac2eb1b4bdc0c93972797b0 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 17:55:18 -0700 Subject: [PATCH 04/21] Emit 'item-destroyed' in ::removeItem when destroying flag is true --- src/pane.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pane.coffee b/src/pane.coffee index 746cfb989..dc8fd86fd 100644 --- a/src/pane.coffee +++ b/src/pane.coffee @@ -36,7 +36,7 @@ class Pane extends Model @subscribe @items.onEach (item) => if typeof item.on is 'function' - @subscribe item, 'destroyed', => @removeItem(item) + @subscribe item, 'destroyed', => @removeItem(item, true) @subscribe @items.onRemoval (item, index) => @unsubscribe item if typeof item.on is 'function' @@ -142,6 +142,7 @@ class Pane extends Model @activateNextItem() if item is @activeItem and @items.length > 1 @items.splice(index, 1) @emit 'item-removed', item, index, destroying + @emit 'item-destroyed', item if destroying @destroy() if @items.length is 0 # Public: Moves the given item to the specified index. @@ -166,7 +167,6 @@ class Pane extends Model destroyItem: (item) -> @emit 'before-item-destroyed', item if @promptToSaveItem(item) - @emit 'item-destroyed', item @removeItem(item, true) item.destroy?() true From a8ddc530a2bdc41a3ee158d67bb9a36064b9c0ed Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 18:20:55 -0700 Subject: [PATCH 05/21] Emit a pane-item-destroyed event from the workspace model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …Instead of calling itemDestroyed on the workspace view via a DOM query --- src/pane-container-view.coffee | 3 --- src/pane-container.coffee | 3 +++ src/pane-view.coffee | 4 ---- src/pane.coffee | 2 +- src/workspace-view.coffee | 4 ++-- src/workspace.coffee | 7 +++++++ 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/pane-container-view.coffee b/src/pane-container-view.coffee index 215ebfffb..e3d5431b3 100644 --- a/src/pane-container-view.coffee +++ b/src/pane-container-view.coffee @@ -34,9 +34,6 @@ class PaneContainerView extends View ### Public ### - itemDestroyed: (item) -> - @trigger 'item-destroyed', [item] - getRoot: -> @children().first().view() diff --git a/src/pane-container.coffee b/src/pane-container.coffee index 28ff0d29e..6b8fd1d80 100644 --- a/src/pane-container.coffee +++ b/src/pane-container.coffee @@ -68,3 +68,6 @@ class PaneContainer extends Model destroyEmptyPanes: -> pane.destroy() for pane in @getPanes() when pane.items.length is 0 + + itemDestroyed: (item) -> + @emit 'item-destroyed', item diff --git a/src/pane-view.coffee b/src/pane-view.coffee index fe9da3f31..54000d703 100644 --- a/src/pane-view.coffee +++ b/src/pane-view.coffee @@ -54,7 +54,6 @@ class PaneView extends View @subscribe @model, 'item-removed', @onItemRemoved @subscribe @model, 'item-moved', @onItemMoved @subscribe @model, 'before-item-destroyed', @onBeforeItemDestroyed - @subscribe @model, 'item-destroyed', @onItemDestroyed @subscribe @model, 'activated', @onActivated @subscribe @model.$active, @onActiveStatusChanged @@ -181,9 +180,6 @@ class PaneView extends View @unsubscribe(item) if typeof item.off is 'function' @trigger 'pane:before-item-destroyed', [item] - onItemDestroyed: (item) => - @getContainer()?.itemDestroyed(item) - # Private: activeItemTitleChanged: => @trigger 'pane:active-item-title-changed' diff --git a/src/pane.coffee b/src/pane.coffee index dc8fd86fd..346f46bce 100644 --- a/src/pane.coffee +++ b/src/pane.coffee @@ -142,7 +142,7 @@ class Pane extends Model @activateNextItem() if item is @activeItem and @items.length > 1 @items.splice(index, 1) @emit 'item-removed', item, index, destroying - @emit 'item-destroyed', item if destroying + @container?.itemDestroyed(item) if destroying @destroy() if @items.length is 0 # Public: Moves the given item to the specified index. diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index ae35dc085..5ab19c9bc 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -75,7 +75,7 @@ class WorkspaceView extends View @panes = panes @destroyedItemUris = [] - @subscribe @panes, 'item-destroyed', @onPaneItemDestroyed + @subscribe @model, 'pane-item-destroyed', @onPaneItemDestroyed @updateTitle() @@ -359,7 +359,7 @@ class WorkspaceView extends View super # Private: Adds the destroyed item's uri to the list of items to reopen. - onPaneItemDestroyed: (e, item) => + onPaneItemDestroyed: (item) => if uri = item.getUri?() @destroyedItemUris.push(uri) diff --git a/src/workspace.coffee b/src/workspace.coffee index 255015c58..7b283b7d1 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -11,6 +11,10 @@ class Workspace extends Model paneContainer: -> new PaneContainer fullScreen: false + constructor: -> + super + @subscribe @paneContainer, 'item-destroyed', @onPaneItemDestroyed + deserializeParams: (params) -> params.paneContainer = PaneContainer.deserialize(params.paneContainer) params @@ -18,3 +22,6 @@ class Workspace extends Model serializeParams: -> paneContainer: @paneContainer.serialize() fullScreen: atom.isFullScreen() + + onPaneItemDestroyed: (item) => + @emit 'pane-item-destroyed', item From 27c03ae3f37d37a294b4ec54dec3ddb8586f8cb5 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 18:26:00 -0700 Subject: [PATCH 06/21] Move management of destroyedItemUris to Workspace model --- src/workspace-view.coffee | 16 ++-------------- src/workspace.coffee | 11 ++++++++++- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 5ab19c9bc..c89266d88 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -44,7 +44,8 @@ class WorkspaceView extends View Serializable.includeInto(this) Delegator.includeInto(this) - @delegatesProperty 'fullScreen', toProperty: 'model' + @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' + @delegatesMethods 'itemOpened', toProperty: 'model' @version: 4 @@ -74,9 +75,6 @@ class WorkspaceView extends View @panes.replaceWith(panes) @panes = panes - @destroyedItemUris = [] - @subscribe @model, 'pane-item-destroyed', @onPaneItemDestroyed - @updateTitle() @on 'focus', (e) => @handleFocus(e) @@ -358,17 +356,7 @@ class WorkspaceView extends View editorView.remove() for editorView in @getEditorViews() super - # Private: Adds the destroyed item's uri to the list of items to reopen. - onPaneItemDestroyed: (item) => - if uri = item.getUri?() - @destroyedItemUris.push(uri) - # Public: Reopens the last-closed item uri if it hasn't already been reopened. reopenItemSync: -> if uri = @destroyedItemUris.pop() @openSync(uri) - - # Private: Removes the item's uri from the list of potential items to reopen. - itemOpened: (item) -> - if uri = item.getUri?() - _.remove(@destroyedItemUris, uri) diff --git a/src/workspace.coffee b/src/workspace.coffee index 7b283b7d1..657f35d0e 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -1,3 +1,4 @@ +{remove} = require 'underscore-plus' {Model} = require 'theorist' Serializable = require 'serializable' PaneContainer = require './pane-container' @@ -10,6 +11,7 @@ class Workspace extends Model @properties paneContainer: -> new PaneContainer fullScreen: false + destroyedItemUris: -> [] constructor: -> super @@ -23,5 +25,12 @@ class Workspace extends Model paneContainer: @paneContainer.serialize() fullScreen: atom.isFullScreen() + # Private: Removes the item's uri from the list of potential items to reopen. + itemOpened: (item) -> + if uri = item.getUri?() + remove(@destroyedItemUris, uri) + + # Private: Adds the destroyed item's uri to the list of items to reopen. onPaneItemDestroyed: (item) => - @emit 'pane-item-destroyed', item + if uri = item.getUri?() + @destroyedItemUris.push(uri) From 1eb9c3d0d52bb640d4fb8b1315330300ed3d9708 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 18:50:46 -0700 Subject: [PATCH 07/21] Move WorkspaceView::open to Workspace model --- src/workspace-view.coffee | 34 +++------------------------------- src/workspace.coffee | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index c89266d88..048e3ba28 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -45,7 +45,7 @@ class WorkspaceView extends View Delegator.includeInto(this) @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' - @delegatesMethods 'itemOpened', toProperty: 'model' + @delegatesMethods 'open', 'itemOpened', toProperty: 'model' @version: 4 @@ -75,6 +75,8 @@ class WorkspaceView extends View @panes.replaceWith(panes) @panes = panes + @subscribe @model, 'uri-opened', => @trigger 'uri-opened' + @updateTitle() @on 'focus', (e) => @handleFocus(e) @@ -151,36 +153,6 @@ class WorkspaceView extends View confirmClose: -> @panes.confirmClose() - # Public: Asynchronously opens a given a filepath in Atom. - # - # * filePath: A file path - # * options - # + initialLine: The buffer line number to open to. - # - # Returns a promise that resolves to the {Editor} for the file URI. - open: (filePath, options={}) -> - changeFocus = options.changeFocus ? true - filePath = atom.project.resolve(filePath) - initialLine = options.initialLine - activePane = @getActivePane() - - editor = activePane.itemForUri(atom.project.relativize(filePath)) if activePane and filePath - promise = atom.project.open(filePath, {initialLine}) if not editor - - Q(editor ? promise) - .then (editor) => - if not activePane - activePane = new PaneView(editor) - @panes.setRoot(activePane) - - @itemOpened(editor) - activePane.activateItem(editor) - activePane.activate() if changeFocus - @trigger "uri-opened" - editor - .catch (error) -> - console.error(error.stack ? error) - # Private: Only used in specs openSync: (uri, {changeFocus, initialLine, pane, split}={}) -> changeFocus ?= true diff --git a/src/workspace.coffee b/src/workspace.coffee index 657f35d0e..2709008f7 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -1,13 +1,18 @@ {remove} = require 'underscore-plus' {Model} = require 'theorist' +Q = require 'q' Serializable = require 'serializable' +Delegator = require 'delegato' PaneContainer = require './pane-container' +Pane = require './pane' module.exports = class Workspace extends Model atom.deserializers.add(this) Serializable.includeInto(this) + @delegatesProperty 'activePane', toProperty: 'paneContainer' + @properties paneContainer: -> new PaneContainer fullScreen: false @@ -25,6 +30,36 @@ class Workspace extends Model paneContainer: @paneContainer.serialize() fullScreen: atom.isFullScreen() + # Public: Asynchronously opens a given a filepath in Atom. + # + # * filePath: A file path + # * options + # + initialLine: The buffer line number to open to. + # + # Returns a promise that resolves to the {Editor} for the file URI. + open: (filePath, options={}) -> + changeFocus = options.changeFocus ? true + filePath = atom.project.resolve(filePath) + initialLine = options.initialLine + activePane = @activePane + + editor = activePane.itemForUri(atom.project.relativize(filePath)) if activePane and filePath + promise = atom.project.open(filePath, {initialLine}) if not editor + + Q(editor ? promise) + .then (editor) => + if not activePane + activePane = new Pane(items: [editor]) + @paneContainer.root = activePane + + @itemOpened(editor) + activePane.activateItem(editor) + activePane.activate() if changeFocus + @emit "uri-opened" + editor + .catch (error) -> + console.error(error.stack ? error) + # Private: Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> if uri = item.getUri?() From 7199cda5494fa7f0effee6121278a85682d17680 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 21:27:56 -0700 Subject: [PATCH 08/21] Derive PaneView::activeView from the model's activeItem We're getting into some strange order-sensitive cases where we respond to a change of the active item before the pane has a chance to reassign the active view. Therefore it makes more sense to always just derive the active view from the active item. --- package.json | 3 ++- src/pane-view.coffee | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index dea39fba3..d40961c18 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,8 @@ "underscore-plus": "0.6.1", "theorist": "~0.13.0", "delegato": "~0.4.0", - "mixto": "~0.4.0" + "mixto": "~0.4.0", + "property-accessors": "~0.1.0" }, "packageDependencies": { "atom-dark-syntax": "0.10.0", diff --git a/src/pane-view.coffee b/src/pane-view.coffee index 54000d703..6e3a11830 100644 --- a/src/pane-view.coffee +++ b/src/pane-view.coffee @@ -1,6 +1,7 @@ {$, View} = require './space-pen-extensions' Serializable = require 'serializable' Delegator = require 'delegato' +PropertyAccessors = require 'property-accessors' Pane = require './pane' @@ -14,6 +15,7 @@ module.exports = class PaneView extends View Serializable.includeInto(this) Delegator.includeInto(this) + PropertyAccessors.includeInto(this) @version: 1 @@ -152,7 +154,6 @@ class PaneView extends View view.show() if @attached view.focus() if hasFocus - @activeView = view @trigger 'pane:active-item-changed', [item] onItemAdded: (item, index) => @@ -186,6 +187,7 @@ class PaneView extends View # Private: viewForItem: (item) -> + return unless item? if item instanceof $ item else if view = @viewsByItem.get(item) @@ -197,8 +199,7 @@ class PaneView extends View view # Private: - viewForActiveItem: -> - @viewForItem(@activeItem) + @::accessor 'activeView', -> @viewForItem(@activeItem) splitLeft: (items...) -> @model.splitLeft({items})._view From c8e4535e8b7228a38d4a0f9bbfc1522605010d1d Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 21:30:42 -0700 Subject: [PATCH 09/21] Move WorkspaceView::openSync to the Workspace model --- src/workspace-view.coffee | 34 +--------------------------------- src/workspace.coffee | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 048e3ba28..a2816dc46 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -45,7 +45,7 @@ class WorkspaceView extends View Delegator.includeInto(this) @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' - @delegatesMethods 'open', 'itemOpened', toProperty: 'model' + @delegatesMethods 'open', 'openSync', 'itemOpened', toProperty: 'model' @version: 4 @@ -153,38 +153,6 @@ class WorkspaceView extends View confirmClose: -> @panes.confirmClose() - # Private: Only used in specs - openSync: (uri, {changeFocus, initialLine, pane, split}={}) -> - changeFocus ?= true - pane ?= @getActivePane() - uri = atom.project.relativize(uri) - - if pane - if uri - paneItem = pane.itemForUri(uri) ? atom.project.openSync(uri, {initialLine}) - else - paneItem = atom.project.openSync() - - if split == 'right' - panes = @getPanes() - if panes.length == 1 - pane = panes[0].splitRight() - else - pane = _.last(panes) - else if split == 'left' - pane = @getPanes()[0] - - pane.activateItem(paneItem) - else - paneItem = atom.project.openSync(uri, {initialLine}) - pane = new PaneView(paneItem) - @panes.setRoot(pane) - - @itemOpened(paneItem) - - pane.activate() if changeFocus - paneItem - openSingletonSync: (uri, {changeFocus, initialLine, split}={}) -> changeFocus ?= true uri = atom.project.relativize(uri) diff --git a/src/workspace.coffee b/src/workspace.coffee index 2709008f7..dd8669cab 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -1,4 +1,4 @@ -{remove} = require 'underscore-plus' +{remove, last} = require 'underscore-plus' {Model} = require 'theorist' Q = require 'q' Serializable = require 'serializable' @@ -12,6 +12,7 @@ class Workspace extends Model Serializable.includeInto(this) @delegatesProperty 'activePane', toProperty: 'paneContainer' + @delegatesMethod 'getPanes', toProperty: 'paneContainer' @properties paneContainer: -> new PaneContainer @@ -60,6 +61,38 @@ class Workspace extends Model .catch (error) -> console.error(error.stack ? error) + # Private: Only used in specs + openSync: (uri, {changeFocus, initialLine, pane, split}={}) -> + changeFocus ?= true + pane ?= @activePane + uri = atom.project.relativize(uri) + + if pane + if uri + paneItem = pane.itemForUri(uri) ? atom.project.openSync(uri, {initialLine}) + else + paneItem = atom.project.openSync() + + if split == 'right' + panes = @getPanes() + if panes.length == 1 + pane = panes[0].splitRight() + else + pane = last(panes) + else if split == 'left' + pane = @getPanes()[0] + + pane.activateItem(paneItem) + else + paneItem = atom.project.openSync(uri, {initialLine}) + pane = new Pane(items: [paneItem]) + @paneContainer.root = pane + + @itemOpened(paneItem) + + pane.activate() if changeFocus + paneItem + # Private: Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> if uri = item.getUri?() From 66bb9dab93cec9adbff5543b6379e470628865d0 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 21:32:39 -0700 Subject: [PATCH 10/21] Move WorkspaceView::openSingletonSync to the Workspace model --- src/workspace-view.coffee | 15 +-------------- src/workspace.coffee | 13 +++++++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index a2816dc46..0b40e9b88 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -45,7 +45,7 @@ class WorkspaceView extends View Delegator.includeInto(this) @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' - @delegatesMethods 'open', 'openSync', 'itemOpened', toProperty: 'model' + @delegatesMethods 'open', 'openSync', 'openSingletonSync', toProperty: 'model' @version: 4 @@ -153,19 +153,6 @@ class WorkspaceView extends View confirmClose: -> @panes.confirmClose() - openSingletonSync: (uri, {changeFocus, initialLine, split}={}) -> - changeFocus ?= true - uri = atom.project.relativize(uri) - pane = @panes.paneForUri(uri) - - if pane - paneItem = pane.itemForUri(uri) - pane.activateItem(paneItem) - pane.activate() if changeFocus - paneItem - else - @openSync(uri, {changeFocus, initialLine, split}) - # Public: Updates the application's title, based on whichever file is open. updateTitle: -> if projectPath = atom.project.getPath() diff --git a/src/workspace.coffee b/src/workspace.coffee index dd8669cab..b1d890383 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -93,6 +93,19 @@ class Workspace extends Model pane.activate() if changeFocus paneItem + openSingletonSync: (uri, {changeFocus, initialLine, split}={}) -> + changeFocus ?= true + uri = atom.project.relativize(uri) + pane = @paneContainer.paneForUri(uri) + + if pane + paneItem = pane.itemForUri(uri) + pane.activateItem(paneItem) + pane.activate() if changeFocus + paneItem + else + @openSync(uri, {changeFocus, initialLine, split}) + # Private: Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> if uri = item.getUri?() From adf5cfc78cfff47e0bcc6d96ab696bd5b5309362 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 13 Jan 2014 21:35:59 -0700 Subject: [PATCH 11/21] Move WorkspaceView::reopenItemSync to the Workspace model --- src/workspace-view.coffee | 8 ++------ src/workspace.coffee | 5 +++++ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 0b40e9b88..42bc3328a 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -45,7 +45,8 @@ class WorkspaceView extends View Delegator.includeInto(this) @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' - @delegatesMethods 'open', 'openSync', 'openSingletonSync', toProperty: 'model' + @delegatesMethods 'open', 'openSync', 'openSingletonSync', 'reopenItemSync', + toProperty: 'model' @version: 4 @@ -282,8 +283,3 @@ class WorkspaceView extends View @model.destroy() editorView.remove() for editorView in @getEditorViews() super - - # Public: Reopens the last-closed item uri if it hasn't already been reopened. - reopenItemSync: -> - if uri = @destroyedItemUris.pop() - @openSync(uri) diff --git a/src/workspace.coffee b/src/workspace.coffee index b1d890383..93fac7815 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -106,6 +106,11 @@ class Workspace extends Model else @openSync(uri, {changeFocus, initialLine, split}) + # Public: Reopens the last-closed item uri if it hasn't already been reopened. + reopenItemSync: -> + if uri = @destroyedItemUris.pop() + @openSync(uri) + # Private: Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> if uri = item.getUri?() From aab4f3b76110b10439bd6b2469dc0bf96019e21e Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 10:42:13 -0700 Subject: [PATCH 12/21] Remove methods that I'm pretty sure are unused --- src/workspace-view.coffee | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 42bc3328a..5f925282b 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -172,22 +172,6 @@ class WorkspaceView extends View getEditorViews: -> @panes.find('.pane > .item-views > .editor').map(-> $(this).view()).toArray() - # Private: Retrieves all of the modified buffers that are open and unsaved. - # - # Returns an {Array} of {TextBuffer}s. - getModifiedBuffers: -> - modifiedBuffers = [] - for pane in @getPanes() - for item in pane.getItems() when item instanceof Editor - modifiedBuffers.push item.buffer if item.buffer.isModified() - modifiedBuffers - - # Private: Retrieves all of the paths to open files. - # - # Returns an {Array} of {String}s. - getOpenBufferPaths: -> - _.uniq(_.flatten(@getEditorViews().map (editorView) -> editorView.getOpenBufferPaths())) - # Public: Prepends the element to the top of the window. prependToTop: (element) -> @vertical.prepend(element) From fe01ded75ba8b2e2c8b31f0183a37ca8420c2462 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 10:49:21 -0700 Subject: [PATCH 13/21] Move WorkspaceView::saveActivePaneItem* to Workspace model --- src/workspace-view.coffee | 14 +++----------- src/workspace.coffee | 10 +++++++++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 5f925282b..f0c6f2426 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -46,7 +46,7 @@ class WorkspaceView extends View @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' @delegatesMethods 'open', 'openSync', 'openSingletonSync', 'reopenItemSync', - toProperty: 'model' + 'saveActivePaneItem', 'saveActivePaneItemAs', toProperty: 'model' @version: 4 @@ -206,11 +206,11 @@ class WorkspaceView extends View # Public: Returns the currently focused {PaneView}. getActivePane: -> - @panes.getActivePane() + @model.activePane # Public: Returns the currently focused item from within the focused {PaneView} getActivePaneItem: -> - @panes.getActivePaneItem() + @model.activePaneItem # Public: Returns the view of the currently focused item. getActiveView: -> @@ -220,14 +220,6 @@ class WorkspaceView extends View destroyActivePaneItem: -> @getActivePane()?.destroyActiveItem() - # Public: save the active item. - saveActivePaneItem: -> - @getActivePane()?.saveActiveItem() - - # Public: save the active item as. - saveActivePaneItemAs: -> - @getActivePane()?.saveActiveItemAs() - # Public: Focuses the previous pane by id. focusPreviousPane: -> @panes.focusPreviousPane() diff --git a/src/workspace.coffee b/src/workspace.coffee index 93fac7815..48e563293 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -11,7 +11,7 @@ class Workspace extends Model atom.deserializers.add(this) Serializable.includeInto(this) - @delegatesProperty 'activePane', toProperty: 'paneContainer' + @delegatesProperty 'activePane', 'activePaneItem', toProperty: 'paneContainer' @delegatesMethod 'getPanes', toProperty: 'paneContainer' @properties @@ -111,6 +111,14 @@ class Workspace extends Model if uri = @destroyedItemUris.pop() @openSync(uri) + # Public: save the active item. + saveActivePaneItem: -> + @activePane?.saveActiveItem() + + # Public: save the active item as. + saveActivePaneItemAs: -> + @activePane?.saveActiveItemAs() + # Private: Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> if uri = item.getUri?() From 89cbd6b834c92ef65e7682894e4f0f83455a452f Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 10:53:16 -0700 Subject: [PATCH 14/21] Move PaneContainerView::saveAll to the model --- src/pane-container-view.coffee | 5 ++--- src/pane-container.coffee | 3 +++ src/workspace-view.coffee | 6 +----- src/workspace.coffee | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/pane-container-view.coffee b/src/pane-container-view.coffee index e3d5431b3..c38f73818 100644 --- a/src/pane-container-view.coffee +++ b/src/pane-container-view.coffee @@ -1,4 +1,5 @@ Serializable = require 'serializable' +Delegator = require 'delegato' {$, View} = require './space-pen-extensions' PaneView = require './pane-view' PaneContainer = require './pane-container' @@ -8,6 +9,7 @@ module.exports = class PaneContainerView extends View atom.deserializers.add(this) Serializable.includeInto(this) + Delegator.includeInto(this) @deserialize: (state) -> new this(PaneContainer.deserialize(state.model)) @@ -62,9 +64,6 @@ class PaneContainerView extends View @setRoot(null) @trigger 'pane:removed', [child] if child instanceof PaneView - saveAll: -> - pane.saveItems() for pane in @getPanes() - confirmClose: -> saved = true for pane in @getPanes() diff --git a/src/pane-container.coffee b/src/pane-container.coffee index 6b8fd1d80..d4273db88 100644 --- a/src/pane-container.coffee +++ b/src/pane-container.coffee @@ -40,6 +40,9 @@ class PaneContainer extends Model paneForUri: (uri) -> find @getPanes(), (pane) -> pane.itemForUri(uri)? + saveAll: -> + pane.saveItems() for pane in @getPanes() + activateNextPane: -> panes = @getPanes() if panes.length > 1 diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index f0c6f2426..8cddf468b 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -46,7 +46,7 @@ class WorkspaceView extends View @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' @delegatesMethods 'open', 'openSync', 'openSingletonSync', 'reopenItemSync', - 'saveActivePaneItem', 'saveActivePaneItemAs', toProperty: 'model' + 'saveActivePaneItem', 'saveActivePaneItemAs', 'saveAll', toProperty: 'model' @version: 4 @@ -231,10 +231,6 @@ class WorkspaceView extends View # FIXME: Difference between active and focused pane? getFocusedPane: -> @panes.getFocusedPane() - # Public: Saves all of the open items within panes. - saveAll: -> - @panes.saveAll() - # Public: Fires a callback on each open {PaneView}. eachPane: (callback) -> @panes.eachPane(callback) diff --git a/src/workspace.coffee b/src/workspace.coffee index 48e563293..ed68d9ce4 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -12,7 +12,7 @@ class Workspace extends Model Serializable.includeInto(this) @delegatesProperty 'activePane', 'activePaneItem', toProperty: 'paneContainer' - @delegatesMethod 'getPanes', toProperty: 'paneContainer' + @delegatesMethod 'getPanes', 'saveAll', toProperty: 'paneContainer' @properties paneContainer: -> new PaneContainer From af4034ba394ed64f72783494907fb00ac7809325 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 10:56:42 -0700 Subject: [PATCH 15/21] Move WorkspaceView::destroyActivePaneItem to the model --- src/workspace-view.coffee | 7 ++----- src/workspace.coffee | 4 ++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 8cddf468b..8789e54bd 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -46,7 +46,8 @@ class WorkspaceView extends View @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' @delegatesMethods 'open', 'openSync', 'openSingletonSync', 'reopenItemSync', - 'saveActivePaneItem', 'saveActivePaneItemAs', 'saveAll', toProperty: 'model' + 'saveActivePaneItem', 'saveActivePaneItemAs', 'saveAll', 'destroyActivePaneItem', + toProperty: 'model' @version: 4 @@ -216,10 +217,6 @@ class WorkspaceView extends View getActiveView: -> @panes.getActiveView() - # Public: destroy/close the active item. - destroyActivePaneItem: -> - @getActivePane()?.destroyActiveItem() - # Public: Focuses the previous pane by id. focusPreviousPane: -> @panes.focusPreviousPane() diff --git a/src/workspace.coffee b/src/workspace.coffee index ed68d9ce4..4444a55dc 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -119,6 +119,10 @@ class Workspace extends Model saveActivePaneItemAs: -> @activePane?.saveActiveItemAs() + # Public: destroy/close the active item. + destroyActivePaneItem: -> + @activePane?.destroyActiveItem() + # Private: Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> if uri = item.getUri?() From a1d540d288bee66bc67a083e6a0df5a6991b09c2 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 11:02:36 -0700 Subject: [PATCH 16/21] Revert WorkspaceView::getActivePane. It needs to return a PaneView. --- src/workspace-view.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 8789e54bd..7eb9d37d8 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -207,7 +207,7 @@ class WorkspaceView extends View # Public: Returns the currently focused {PaneView}. getActivePane: -> - @model.activePane + @panes.getActivePane() # Public: Returns the currently focused item from within the focused {PaneView} getActivePaneItem: -> From 0d66c68fe8bbb32e05b01d71c7f1377120c81dc4 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 11:12:08 -0700 Subject: [PATCH 17/21] Add delegator to model for PaneContainerView::saveAll --- src/pane-container-view.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pane-container-view.coffee b/src/pane-container-view.coffee index c38f73818..5ea822a8f 100644 --- a/src/pane-container-view.coffee +++ b/src/pane-container-view.coffee @@ -11,6 +11,8 @@ class PaneContainerView extends View Serializable.includeInto(this) Delegator.includeInto(this) + @delegatesMethod 'saveAll', toProperty: 'model' + @deserialize: (state) -> new this(PaneContainer.deserialize(state.model)) From 4a7b43f609611134a270d01bc1b474a7441fbb09 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 11:15:14 -0700 Subject: [PATCH 18/21] Write focusNext/PreviousPane in terms of activateNext/PreviousPane "Activate" is the model level equivalent of focus. --- spec/pane-container-view-spec.coffee | 2 +- src/pane-container-view.coffee | 19 ++----------------- src/pane-container.coffee | 14 +++++++++++++- src/workspace-view.coffee | 4 ++-- src/workspace.coffee | 3 ++- 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/spec/pane-container-view-spec.coffee b/spec/pane-container-view-spec.coffee index fa0bcb83d..4f9d8ea2c 100644 --- a/spec/pane-container-view-spec.coffee +++ b/spec/pane-container-view-spec.coffee @@ -42,7 +42,7 @@ describe "PaneContainerView", -> describe ".focusPreviousPane()", -> it "focuses the pane preceding the focused pane or the last pane if no pane has focus", -> container.attachToDom() - $(document.body).focus() # clear focus + container.getPanes()[0].focus() # activate first pane container.focusPreviousPane() expect(pane3.activeItem).toMatchSelector ':focus' diff --git a/src/pane-container-view.coffee b/src/pane-container-view.coffee index 5ea822a8f..81ffffe10 100644 --- a/src/pane-container-view.coffee +++ b/src/pane-container-view.coffee @@ -106,22 +106,7 @@ class PaneContainerView extends View @viewForModel(@model.paneForUri(uri)) focusNextPane: -> - panes = @getPanes() - if panes.length > 1 - currentIndex = panes.indexOf(@getFocusedPane()) - nextIndex = (currentIndex + 1) % panes.length - panes[nextIndex].focus() - true - else - false + @model.activateNextPane() focusPreviousPane: -> - panes = @getPanes() - if panes.length > 1 - currentIndex = panes.indexOf(@getFocusedPane()) - previousIndex = currentIndex - 1 - previousIndex = panes.length - 1 if previousIndex < 0 - panes[previousIndex].focus() - true - else - false + @model.activatePreviousPane() diff --git a/src/pane-container.coffee b/src/pane-container.coffee index d4273db88..9f0dfc7ea 100644 --- a/src/pane-container.coffee +++ b/src/pane-container.coffee @@ -49,8 +49,20 @@ class PaneContainer extends Model currentIndex = panes.indexOf(@activePane) nextIndex = (currentIndex + 1) % panes.length panes[nextIndex].activate() + true else - @activePane = null + false + + activatePreviousPane: -> + panes = @getPanes() + if panes.length > 1 + currentIndex = panes.indexOf(@activePane) + previousIndex = currentIndex - 1 + previousIndex = panes.length - 1 if previousIndex < 0 + panes[previousIndex].activate() + true + else + false onRootChanged: (root) => @unsubscribe(@previousRoot) if @previousRoot? diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 7eb9d37d8..c60c831f8 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -218,10 +218,10 @@ class WorkspaceView extends View @panes.getActiveView() # Public: Focuses the previous pane by id. - focusPreviousPane: -> @panes.focusPreviousPane() + focusPreviousPane: -> @model.activatePreviousPane() # Public: Focuses the next pane by id. - focusNextPane: -> @panes.focusNextPane() + focusNextPane: -> @model.activateNextPane() # Public: # diff --git a/src/workspace.coffee b/src/workspace.coffee index 4444a55dc..38b993c98 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -12,7 +12,8 @@ class Workspace extends Model Serializable.includeInto(this) @delegatesProperty 'activePane', 'activePaneItem', toProperty: 'paneContainer' - @delegatesMethod 'getPanes', 'saveAll', toProperty: 'paneContainer' + @delegatesMethod 'getPanes', 'saveAll', 'activateNextPane', 'activatePreviousPane', + toProperty: 'paneContainer' @properties paneContainer: -> new PaneContainer From c350285044277b2b6228bea9c2348e891a488dd9 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 11:36:51 -0700 Subject: [PATCH 19/21] Move Workspace and PaneContainer serialization to the model layer The views are now stateless. You just construct them with a model to deserialize. --- spec/pane-container-view-spec.coffee | 4 ++-- spec/pane-view-spec.coffee | 10 +++++----- spec/window-spec.coffee | 4 ++-- spec/workspace-view-spec.coffee | 11 +++++++---- src/atom.coffee | 6 ++++-- src/pane-container-view.coffee | 9 --------- src/pane-view.coffee | 12 ------------ src/workspace-view.coffee | 10 ---------- 8 files changed, 20 insertions(+), 46 deletions(-) diff --git a/spec/pane-container-view-spec.coffee b/spec/pane-container-view-spec.coffee index 4f9d8ea2c..c68180c1d 100644 --- a/spec/pane-container-view-spec.coffee +++ b/spec/pane-container-view-spec.coffee @@ -121,7 +121,7 @@ describe "PaneContainerView", -> describe "serialization", -> it "can be serialized and deserialized, and correctly adjusts dimensions of deserialized panes after attach", -> - newContainer = atom.deserializers.deserialize(container.serialize()) + newContainer = new PaneContainerView(container.model.testSerialization()) expect(newContainer.find('.pane-row > :contains(1)')).toExist() expect(newContainer.find('.pane-row > .pane-column > :contains(2)')).toExist() expect(newContainer.find('.pane-row > .pane-column > :contains(3)')).toExist() @@ -133,7 +133,7 @@ describe "PaneContainerView", -> it "removes empty panes on deserialization", -> # only deserialize pane 1's view successfully TestView.deserialize = ({name}) -> new TestView(name) if name is '1' - newContainer = atom.deserializers.deserialize(container.serialize()) + newContainer = new PaneContainerView(container.model.testSerialization()) expect(newContainer.find('.pane-row, .pane-column')).not.toExist() expect(newContainer.find('> :contains(1)')).toExist() diff --git a/spec/pane-view-spec.coffee b/spec/pane-view-spec.coffee index 7440f7e73..acbc7323a 100644 --- a/spec/pane-view-spec.coffee +++ b/spec/pane-view-spec.coffee @@ -602,12 +602,12 @@ describe "PaneView", -> describe "serialization", -> it "can serialize and deserialize the pane and all its items", -> - newPane = pane.testSerialization() + newPane = new PaneView(pane.model.testSerialization()) expect(newPane.getItems()).toEqual [view1, editor1, view2, editor2] it "restores the active item on deserialization", -> pane.activateItem(editor2) - newPane = pane.testSerialization() + newPane = new PaneView(pane.model.testSerialization()) expect(newPane.activeItem).toEqual editor2 it "does not show items that cannot be deserialized", -> @@ -618,7 +618,7 @@ describe "PaneView", -> pane.activateItem(new Unserializable) - newPane = pane.testSerialization() + newPane = new PaneView(pane.model.testSerialization()) expect(newPane.activeItem).toEqual pane.items[0] expect(newPane.items.length).toBe pane.items.length - 1 @@ -626,13 +626,13 @@ describe "PaneView", -> container.attachToDom() pane.focus() - container2 = container.testSerialization() + container2 = new PaneContainerView(container.model.testSerialization()) pane2 = container2.getRoot() container2.attachToDom() expect(pane2).toMatchSelector(':has(:focus)') $(document.activeElement).blur() - container3 = container.testSerialization() + container3 = new PaneContainerView(container.model.testSerialization()) pane3 = container3.getRoot() container3.attachToDom() expect(pane3).not.toMatchSelector(':has(:focus)') diff --git a/spec/window-spec.coffee b/spec/window-spec.coffee index 53f992555..78f90d3b7 100644 --- a/spec/window-spec.coffee +++ b/spec/window-spec.coffee @@ -88,12 +88,12 @@ describe "Window", -> describe ".unloadEditorWindow()", -> it "saves the serialized state of the window so it can be deserialized after reload", -> - workspaceViewState = atom.workspaceView.serialize() + workspaceState = atom.workspace.serialize() syntaxState = atom.syntax.serialize() atom.unloadEditorWindow() - expect(atom.state.workspaceView).toEqual workspaceViewState + expect(atom.state.workspace).toEqual workspaceState expect(atom.state.syntax).toEqual syntaxState expect(atom.saveSync).toHaveBeenCalled() diff --git a/spec/workspace-view-spec.coffee b/spec/workspace-view-spec.coffee index f91fb8845..ab1a63ebb 100644 --- a/spec/workspace-view-spec.coffee +++ b/spec/workspace-view-spec.coffee @@ -3,6 +3,7 @@ Q = require 'q' path = require 'path' temp = require 'temp' PaneView = require '../src/pane-view' +Workspace = require '../src/workspace' describe "WorkspaceView", -> pathToOpen = null @@ -10,7 +11,8 @@ describe "WorkspaceView", -> beforeEach -> atom.project.setPath(atom.project.resolve('dir')) pathToOpen = atom.project.resolve('a') - atom.workspaceView = new WorkspaceView + atom.workspace = new Workspace + atom.workspaceView = new WorkspaceView(atom.workspace) atom.workspaceView.enableKeymap() atom.workspaceView.openSync(pathToOpen) atom.workspaceView.focus() @@ -19,11 +21,12 @@ describe "WorkspaceView", -> viewState = null simulateReload = -> - workspaceState = atom.workspaceView.serialize() + workspaceState = atom.workspace.serialize() projectState = atom.project.serialize() atom.workspaceView.remove() atom.project = atom.deserializers.deserialize(projectState) - atom.workspaceView = WorkspaceView.deserialize(workspaceState) + atom.workspace = Workspace.deserialize(workspaceState) + atom.workspaceView = new WorkspaceView(atom.workspace) atom.workspaceView.attachToDom() describe "when the serialized WorkspaceView has an unsaved buffer", -> @@ -187,7 +190,7 @@ describe "WorkspaceView", -> describe "when the root view is deserialized", -> it "updates the title to contain the project's path", -> - workspaceView2 = atom.deserializers.deserialize(atom.workspaceView.serialize()) + workspaceView2 = new WorkspaceView(atom.workspace.testSerialization()) item = atom.workspaceView.getActivePaneItem() expect(workspaceView2.title).toBe "#{item.getTitle()} - #{atom.project.getPath()}" workspaceView2.remove() diff --git a/src/atom.coffee b/src/atom.coffee index bab3cd0e6..26c19dd30 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -230,8 +230,10 @@ class Atom extends Model # Private: deserializeWorkspaceView: -> + Workspace = require './workspace' WorkspaceView = require './workspace-view' - @workspaceView = @deserializers.deserialize(@state.workspaceView) ? new WorkspaceView + @workspace = Workspace.deserialize(@state.workspace) ? new Workspace + @workspaceView = new WorkspaceView(@workspace) $(@workspaceViewParentSelector).append(@workspaceView) # Private: @@ -277,7 +279,7 @@ class Atom extends Model return if not @project and not @workspaceView @state.syntax = @syntax.serialize() - @state.workspaceView = @workspaceView.serialize() + @state.workspace = @workspace.serialize() @packages.deactivatePackages() @state.packageStates = @packages.packageStates @saveSync() diff --git a/src/pane-container-view.coffee b/src/pane-container-view.coffee index 81ffffe10..7c1ee5533 100644 --- a/src/pane-container-view.coffee +++ b/src/pane-container-view.coffee @@ -1,4 +1,3 @@ -Serializable = require 'serializable' Delegator = require 'delegato' {$, View} = require './space-pen-extensions' PaneView = require './pane-view' @@ -7,15 +6,10 @@ PaneContainer = require './pane-container' # Private: Manages the list of panes within a {WorkspaceView} module.exports = class PaneContainerView extends View - atom.deserializers.add(this) - Serializable.includeInto(this) Delegator.includeInto(this) @delegatesMethod 'saveAll', toProperty: 'model' - @deserialize: (state) -> - new this(PaneContainer.deserialize(state.model)) - @content: -> @div class: 'panes' @@ -33,9 +27,6 @@ class PaneContainerView extends View viewClass = model.getViewClass() model._view ?= new viewClass(model) - serializeParams: -> - model: @model.serialize() - ### Public ### getRoot: -> diff --git a/src/pane-view.coffee b/src/pane-view.coffee index 6e3a11830..78e255aa1 100644 --- a/src/pane-view.coffee +++ b/src/pane-view.coffee @@ -1,5 +1,4 @@ {$, View} = require './space-pen-extensions' -Serializable = require 'serializable' Delegator = require 'delegato' PropertyAccessors = require 'property-accessors' @@ -13,15 +12,11 @@ Pane = require './pane' # building a package that deals with switching between panes or tiems. module.exports = class PaneView extends View - Serializable.includeInto(this) Delegator.includeInto(this) PropertyAccessors.includeInto(this) @version: 1 - @deserialize: (state) -> - new this(Pane.deserialize(state.model)) - @content: (wrappedView) -> @div class: 'pane', tabindex: -1, => @div class: 'item-views', outlet: 'itemViews' @@ -86,13 +81,6 @@ class PaneView extends View @command 'pane:close', => @destroyItems() @command 'pane:close-other-items', => @destroyInactiveItems() - deserializeParams: (params) -> - params.model = Pane.deserialize(params.model) - params - - serializeParams: -> - model: @model.serialize() - # Deprecated: Use ::destroyItem removeItem: (item) -> @destroyItem(item) diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index c60c831f8..8c7f8b4ac 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -5,7 +5,6 @@ _ = require 'underscore-plus' Delegator = require 'delegato' {$, $$, View} = require './space-pen-extensions' fs = require 'fs-plus' -Serializable = require 'serializable' Workspace = require './workspace' EditorView = require './editor-view' PaneView = require './pane-view' @@ -40,8 +39,6 @@ Editor = require './editor' # module.exports = class WorkspaceView extends View - atom.deserializers.add(this, PaneView, PaneRowView, PaneColumnView, EditorView) - Serializable.includeInto(this) Delegator.includeInto(this) @delegatesProperty 'fullScreen', 'destroyedItemUris', toProperty: 'model' @@ -51,9 +48,6 @@ class WorkspaceView extends View @version: 4 - @deserialize: (state) -> - new this(Workspace.deserialize(state.model)) - @configDefaults: ignoredNames: [".git", ".svn", ".DS_Store"] excludeVcsIgnoredPaths: true @@ -128,10 +122,6 @@ class WorkspaceView extends View @command 'core:save', => @saveActivePaneItem() @command 'core:save-as', => @saveActivePaneItemAs() - # Private: - serializeParams: -> - model: @model.serialize() - # Private: handleFocus: (e) -> if @getActivePane() From e4b934d3fa5422b4f3858c997449b375dd5b32b5 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 13:06:42 -0700 Subject: [PATCH 20/21] Remove 'workspace' from serialized state in spec helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …Instead of 'workspaceView'. --- spec/spec-helper.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 9c672e7a9..8e939d03d 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -107,7 +107,7 @@ afterEach -> atom.workspaceView?.remove?() atom.workspaceView = null - delete atom.state.workspaceView + delete atom.state.workspace atom.project?.destroy?() atom.project = null From c0c2d797b183e24143a0ecedbbd798acc5a03bfc Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 14:36:54 -0700 Subject: [PATCH 21/21] Add some API documentation --- src/workspace.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/workspace.coffee b/src/workspace.coffee index 38b993c98..39f730e0a 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -6,6 +6,9 @@ Delegator = require 'delegato' PaneContainer = require './pane-container' Pane = require './pane' +# Public: Represents the view state of the entire window, including the panes at +# the center and panels around the periphery. You can access the singleton +# instance via `atom.workspace`. module.exports = class Workspace extends Model atom.deserializers.add(this) @@ -20,14 +23,17 @@ class Workspace extends Model fullScreen: false destroyedItemUris: -> [] + # Private: constructor: -> super @subscribe @paneContainer, 'item-destroyed', @onPaneItemDestroyed + # Private: Called by the Serializable mixin during deserialization deserializeParams: (params) -> params.paneContainer = PaneContainer.deserialize(params.paneContainer) params + # Private: Called by the Serializable mixin during serialization. serializeParams: -> paneContainer: @paneContainer.serialize() fullScreen: atom.isFullScreen() @@ -94,6 +100,8 @@ class Workspace extends Model pane.activate() if changeFocus paneItem + # Public: Synchronously open an editor for the given URI or activate an existing + # editor in any pane if one already exists. openSingletonSync: (uri, {changeFocus, initialLine, split}={}) -> changeFocus ?= true uri = atom.project.relativize(uri)