From 9a9347e3a50bd8e0a91fa873111890345ba00dbb Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 1 Dec 2014 17:53:03 -0800 Subject: [PATCH] Simplify ViewRegistry::addViewProvider API It now takes two arguments, a model constructor and a create view callback that is passed the model. Signed-off-by: Max Brunsfeld --- spec/panel-container-element-spec.coffee | 15 +++--- spec/panel-element-spec.coffee | 10 ++-- spec/view-registry-spec.coffee | 58 ++++++++---------------- spec/workspace-spec.coffee | 6 +-- src/pane-container.coffee | 23 ++++------ src/view-registry.coffee | 13 ++++-- src/workspace.coffee | 15 +++--- 7 files changed, 55 insertions(+), 85 deletions(-) diff --git a/spec/panel-container-element-spec.coffee b/spec/panel-container-element-spec.coffee index de8342a4c..bd4ed6bd9 100644 --- a/spec/panel-container-element-spec.coffee +++ b/spec/panel-container-element-spec.coffee @@ -20,15 +20,12 @@ describe "PanelContainerElement", -> beforeEach -> jasmineContent = document.body.querySelector('#jasmine-content') - atom.views.addViewProvider - modelConstructor: Panel - viewConstructor: PanelElement - atom.views.addViewProvider - modelConstructor: PanelContainer - viewConstructor: PanelContainerElement - atom.views.addViewProvider - modelConstructor: TestPanelContainerItem - viewConstructor: TestPanelContainerItemElement + atom.views.addViewProvider Panel, (model) -> + new PanelElement().initialize(model) + atom.views.addViewProvider PanelContainer, (model) -> + new PaneContainerElement().initialize(model) + atom.views.addViewProvider TestPanelContainerItem, (model) -> + new TestPanelContainerItemElement().initialize(model) container = new PanelContainer({location: 'left'}) element = atom.views.getView(container) diff --git a/spec/panel-element-spec.coffee b/spec/panel-element-spec.coffee index e6df05c07..4c166c617 100644 --- a/spec/panel-element-spec.coffee +++ b/spec/panel-element-spec.coffee @@ -18,12 +18,10 @@ describe "PanelElement", -> beforeEach -> jasmineContent = document.body.querySelector('#jasmine-content') - atom.views.addViewProvider - modelConstructor: Panel - viewConstructor: PanelElement - atom.views.addViewProvider - modelConstructor: TestPanelItem - viewConstructor: TestPanelItemElement + atom.views.addViewProvider Panel, (model) -> + new PanelElement().initialize(model) + atom.views.addViewProvider TestPanelItem, (model) -> + new TestPanelItemElement().initialize(model) it 'removes the element when the panel is destroyed', -> panel = new Panel({item: new TestPanelItem}) diff --git a/spec/view-registry-spec.coffee b/spec/view-registry-spec.coffee index b2cf25629..254649311 100644 --- a/spec/view-registry-spec.coffee +++ b/spec/view-registry-spec.coffee @@ -25,47 +25,27 @@ describe "ViewRegistry", -> describe "when passed a model object", -> describe "when a view provider is registered matching the object's constructor", -> - describe "when the provider has a viewConstructor property", -> - it "constructs a view element and assigns the model on it", -> - class TestModel + it "constructs a view element and assigns the model on it", -> + class TestModel - class TestModelSubclass extends TestModel + class TestModelSubclass extends TestModel - class TestView - setModel: (@model) -> + class TestView + initialize: (@model) -> this - model = new TestModel + model = new TestModel - registry.addViewProvider - modelConstructor: TestModel - viewConstructor: TestView + registry.addViewProvider TestModel, (model) -> + new TestView().initialize(model) - view = registry.getView(model) - expect(view instanceof TestView).toBe true - expect(view.model).toBe model + view = registry.getView(model) + expect(view instanceof TestView).toBe true + expect(view.model).toBe model - subclassModel = new TestModelSubclass - view2 = registry.getView(subclassModel) - expect(view2 instanceof TestView).toBe true - expect(view2.model).toBe subclassModel - - describe "when the provider has a createView method", -> - it "constructs a view element by calling the createView method with the model", -> - class TestModel - class TestView - setModel: (@model) -> - - registry.addViewProvider - modelConstructor: TestModel - createView: (model) -> - view = new TestView - view.setModel(model) - view - - model = new TestModel - view = registry.getView(model) - expect(view instanceof TestView).toBe true - expect(view.model).toBe model + subclassModel = new TestModelSubclass + view2 = registry.getView(subclassModel) + expect(view2 instanceof TestView).toBe true + expect(view2.model).toBe subclassModel describe "when no view provider is registered for the object's constructor", -> describe "when the object has a .getViewClass() method", -> @@ -97,10 +77,10 @@ describe "ViewRegistry", -> it "returns a disposable that can be used to remove the provider", -> class TestModel class TestView - setModel: (@model) -> - disposable = registry.addViewProvider - modelConstructor: TestModel - viewConstructor: TestView + initialize: (@model) -> this + + disposable = registry.addViewProvider TestModel, (model) -> + new TestView().initialize(model) expect(registry.getView(new TestModel) instanceof TestView).toBe true disposable.dispose() diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index 67fbcdad9..2003277b7 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -466,10 +466,8 @@ describe "Workspace", -> getModel: -> @model beforeEach -> - atom.views.addViewProvider( - modelConstructor: TestItem - viewConstructor: TestItemElement - ) + atom.views.addViewProvider TestItem, (model) -> + new TestItemElement().initialize(model) describe '::addLeftPanel(model)', -> it 'adds a panel to the correct panel container', -> diff --git a/src/pane-container.coffee b/src/pane-container.coffee index e940019b7..2729c84f5 100644 --- a/src/pane-container.coffee +++ b/src/pane-container.coffee @@ -56,21 +56,14 @@ class PaneContainer extends Model activePaneId: @activePane.id registerViewProviders: -> - atom.views.addViewProvider - modelConstructor: PaneContainer - viewConstructor: PaneContainerElement - - atom.views.addViewProvider - modelConstructor: PaneAxis - viewConstructor: PaneAxisElement - - atom.views.addViewProvider - modelConstructor: Pane - viewConstructor: PaneElement - - atom.views.addViewProvider - modelConstructor: TextEditor - viewConstructor: TextEditorElement + atom.views.addViewProvider PaneContainer, (model) -> + new PaneContainerElement().initialize(model) + atom.views.addViewProvider PaneAxis, (model) -> + new PaneAxisElement().initialize(model) + atom.views.addViewProvider Pane, (model) -> + new PaneElement().initialize(model) + atom.views.addViewProvider TextEditor, (model) -> + new TextEditorElement().initialize(model) onDidChangeRoot: (fn) -> @emitter.on 'did-change-root', fn diff --git a/src/view-registry.coffee b/src/view-registry.coffee index 17a8b3063..c53a281f9 100644 --- a/src/view-registry.coffee +++ b/src/view-registry.coffee @@ -1,3 +1,4 @@ +Grim = require 'grim' {Disposable} = require 'event-kit' # Essential: `ViewRegistry` handles the association between model and view @@ -76,10 +77,16 @@ class ViewRegistry # # Returns a {Disposable} on which `.dispose()` can be called to remove the # added provider. - addViewProvider: (providerSpec) -> - @providers.push(providerSpec) + addViewProvider: (modelConstructor, createView) -> + if arguments.length is 1 + Grim.deprecate("atom.views.addViewProvider now takes 2 arguments: a model constructor and a createView function. See docs for details.") + provider = modelConstructor + else + provider = {modelConstructor, createView} + + @providers.push(provider) new Disposable => - @providers = @providers.filter (provider) -> provider isnt providerSpec + @providers = @providers.filter (p) -> p isnt provider # Essential: Get the view associated with an object in the workspace. # diff --git a/src/workspace.coffee b/src/workspace.coffee index 0b9948ce7..da827ff82 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -66,17 +66,14 @@ class Workspace extends Model when 'atom://.atom/init-script' @open(atom.getUserInitScriptPath()) - atom.views.addViewProvider - modelConstructor: Workspace - viewConstructor: WorkspaceElement + atom.views.addViewProvider Workspace, (model) -> + new WorkspaceElement().initialize(model) - atom.views.addViewProvider - modelConstructor: PanelContainer - viewConstructor: PanelContainerElement + atom.views.addViewProvider PanelContainer, (model) -> + new PanelContainerElement().initialize(model) - atom.views.addViewProvider - modelConstructor: Panel - viewConstructor: PanelElement + atom.views.addViewProvider Panel, (model) -> + new PanelElement().initialize(model) # Called by the Serializable mixin during deserialization deserializeParams: (params) ->