UNPKG

terriajs

Version:

Geospatial data visualization platform.

86 lines (72 loc) 2.71 kB
"use strict"; /*global require*/ var knockout = require('terriajs-cesium/Source/ThirdParty/knockout'); var defined = require('terriajs-cesium/Source/Core/defined'); /** * Manages a stack of all the time series layers currently being shown and makes sure the clock provided is always tracking * the highest one. When the top-most layer is disabled, the clock will track the next highest in the stack. Provides access * to the current top layer so that can be displayed to the user. * * @param clock The clock that should track the highest layer. * @constructor */ var TimeSeriesStack = function(clock) { this.clock = clock; this._layerStack = []; knockout.track(this, ['_layerStack']); /** * The highest time-series layer, or undefined if there are no time series layers. */ knockout.defineProperty(this, 'topLayer', { get: function() { if (this._layerStack.length) { return this._layerStack[this._layerStack.length - 1]; } } }); knockout.getObservable(this, 'topLayer').subscribe(function(topLayer) { if (defined(topLayer)) { // If there's a top layer, make the clock track it. this.clock.setCatalogItem(this.topLayer); } else { // If there's no layers, stop the clock from running. this.clock.shouldAnimate = false; } }, this); }; /** * Adds the supplied {@link CatalogItem} to the top of the stack. If the item is already in the stack, it will be moved * rather than added twice. * * @param {CatalogItem} item */ TimeSeriesStack.prototype.addLayerToTop = function(item) { var currentIndex = this._layerStack.indexOf(item); this._layerStack.push(item); if (currentIndex > -1) { this._layerStack.splice(currentIndex, 1); } }; /** * Removes a layer from the stack, no matter what it's location. If the layer is currently at the top, the value of * {@link TimeSeriesStack#topLayer} will change. * * @param {CatalogItem} item; */ TimeSeriesStack.prototype.removeLayer = function(item) { var index = this._layerStack.indexOf(item); this._layerStack.splice(index, 1); }; /** * Promotes the supplied {@link CatalogItem} to the top of the stack if it is already in the stack. If the item is not * already in the stack it wont be added. * * @param {CatalogItem} item */ TimeSeriesStack.prototype.promoteLayerToTop = function(item) { var currentIndex = this._layerStack.indexOf(item); if (currentIndex > -1) { this.addLayerToTop(item); } }; module.exports = TimeSeriesStack;