From a33706ddbcffa7ad53137973fbabcf8419625af0 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 28 Aug 2014 17:42:12 -0600 Subject: [PATCH] Add PaneContainer::onDidAddPaneItem and ::observePaneItems --- spec/pane-container-spec.coffee | 13 +++++++++++++ src/pane-axis.coffee | 3 +++ src/pane-container.coffee | 21 ++++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/spec/pane-container-spec.coffee b/spec/pane-container-spec.coffee index e9f220e0e..1701e3f03 100644 --- a/spec/pane-container-spec.coffee +++ b/spec/pane-container-spec.coffee @@ -102,3 +102,16 @@ describe "PaneContainer", -> pane4 = pane2.splitRight() expect(observed).toEqual [pane1, pane2, pane3, pane4] + + describe "::observePaneItems()", -> + it "invokes observers with all current and future pane items", -> + container = new PaneContainer(root: new Pane(items: [new Object, new Object])) + container.getRoot().splitRight(items: [new Object]) + [pane1, pane2] = container.getPanes() + observed = [] + container.observePaneItems (pane) -> observed.push(pane) + + pane3 = pane2.splitDown(items: [new Object]) + pane3.addItems([new Object, new Object]) + + expect(observed).toEqual container.getPaneItems() diff --git a/src/pane-axis.coffee b/src/pane-axis.coffee index e9bc4993b..9ef95bc8c 100644 --- a/src/pane-axis.coffee +++ b/src/pane-axis.coffee @@ -51,6 +51,9 @@ class PaneAxis extends Model getPanes: -> flatten(@children.map (child) -> child.getPanes()) + getItems: -> + flatten(@children.map (child) -> child.getItems()) + onDidAddChild: (fn) -> @emitter.on 'did-add-child', fn diff --git a/src/pane-container.coffee b/src/pane-container.coffee index 73bcabc6a..14eeae077 100644 --- a/src/pane-container.coffee +++ b/src/pane-container.coffee @@ -1,4 +1,4 @@ -{find} = require 'underscore-plus' +{find, flatten} = require 'underscore-plus' {Model} = require 'theorist' {Emitter, CompositeDisposable} = require 'event-kit' Serializable = require 'serializable' @@ -31,6 +31,7 @@ class PaneContainer extends Model @destroyEmptyPanes() if params?.destroyEmptyPanes @monitorActivePaneItem() + @monitorPaneItems() deserializeParams: (params) -> params.root = atom.deserializers.deserialize(params.root, container: this) @@ -63,6 +64,13 @@ class PaneContainer extends Model fn(@getActivePane()) @onDidChangeActivePane(fn) + onDidAddPaneItem: (fn) -> + @emitter.on 'did-add-pane-item', fn + + observePaneItems: (fn) -> + fn(item) for item in @getPaneItems() + @onDidAddPaneItem ({item}) -> fn(item) + onDidChangeActivePaneItem: (fn) -> @emitter.on 'did-change-active-pane-item', fn @@ -89,6 +97,9 @@ class PaneContainer extends Model getPanes: -> @getRoot().getPanes() + getPaneItems: -> + @getRoot().getItems() + getActivePane: -> @activePane @@ -154,3 +165,11 @@ class PaneContainer extends Model @emitter.emit 'did-change-active-pane-item', activeItem @subscriptions.add(childSubscription) + + monitorPaneItems: -> + @subscriptions.add @observePanes (pane) => + for item, index in pane.getItems() + @emitter.emit 'did-add-pane-item', {item, pane, index} + + pane.onDidAddItem ({item, index}) => + @emitter.emit 'did-add-pane-item', {item, pane, index}