summaryrefslogtreecommitdiffstats
path: root/application/basilisk/components/syncedtabs/SyncedTabsDeckStore.js
diff options
context:
space:
mode:
authorMatt A. Tobin <email@mattatobin.com>2018-02-02 03:32:58 -0500
committerMatt A. Tobin <email@mattatobin.com>2018-02-02 03:32:58 -0500
commite72ef92b5bdc43cd2584198e2e54e951b70299e8 (patch)
tree01ceb4a897c33eca9e7ccf2bc3aefbe530169fe5 /application/basilisk/components/syncedtabs/SyncedTabsDeckStore.js
parent0d19b77d3eaa5b8d837bf52c19759e68e42a1c4c (diff)
downloadUXP-e72ef92b5bdc43cd2584198e2e54e951b70299e8.tar
UXP-e72ef92b5bdc43cd2584198e2e54e951b70299e8.tar.gz
UXP-e72ef92b5bdc43cd2584198e2e54e951b70299e8.tar.lz
UXP-e72ef92b5bdc43cd2584198e2e54e951b70299e8.tar.xz
UXP-e72ef92b5bdc43cd2584198e2e54e951b70299e8.zip
Add Basilisk
Diffstat (limited to 'application/basilisk/components/syncedtabs/SyncedTabsDeckStore.js')
-rw-r--r--application/basilisk/components/syncedtabs/SyncedTabsDeckStore.js60
1 files changed, 60 insertions, 0 deletions
diff --git a/application/basilisk/components/syncedtabs/SyncedTabsDeckStore.js b/application/basilisk/components/syncedtabs/SyncedTabsDeckStore.js
new file mode 100644
index 000000000..eef594a51
--- /dev/null
+++ b/application/basilisk/components/syncedtabs/SyncedTabsDeckStore.js
@@ -0,0 +1,60 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+let { EventEmitter } = Cu.import("resource:///modules/syncedtabs/EventEmitter.jsm", {});
+
+this.EXPORTED_SYMBOLS = [
+ "SyncedTabsDeckStore"
+];
+
+/**
+ * SyncedTabsDeckStore
+ *
+ * This store keeps track of the deck view state, including the panels and which
+ * one is selected. The view listens for change events on the store, which are
+ * triggered whenever the state changes. If it's a small change, the state
+ * will have `isUpdatable` set to true so the view can skip rerendering the whole
+ * DOM.
+ */
+function SyncedTabsDeckStore() {
+ EventEmitter.call(this);
+ this._panels = [];
+}
+
+Object.assign(SyncedTabsDeckStore.prototype, EventEmitter.prototype, {
+ _change(isUpdatable = false) {
+ let panels = this._panels.map(panel => {
+ return {id: panel, selected: panel === this._selectedPanel};
+ });
+ this.emit("change", {panels, isUpdatable});
+ },
+
+ /**
+ * Sets the selected panelId and triggers a change event.
+ * @param {String} panelId - ID of the panel to select.
+ */
+ selectPanel(panelId) {
+ if (this._panels.indexOf(panelId) === -1 || this._selectedPanel === panelId) {
+ return;
+ }
+ this._selectedPanel = panelId;
+ this._change(true);
+ },
+
+ /**
+ * Update the set of panels in the deck and trigger a change event.
+ * @param {Array} panels - an array of IDs for each panel in the deck.
+ */
+ setPanels(panels) {
+ if (panels === this._panels) {
+ return;
+ }
+ this._panels = panels || [];
+ this._change();
+ }
+});