Add layergroup support

This commit is contained in:
Bruno Binet
2013-06-07 02:08:25 +02:00
parent f731d5632c
commit 097ce52060
5 changed files with 561 additions and 295 deletions

210
src/ol/layer/layergroup.js Normal file
View File

@@ -0,0 +1,210 @@
goog.provide('ol.layer.LayerGroup');
goog.require('goog.array');
goog.require('goog.asserts');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('goog.math');
goog.require('goog.object');
goog.require('ol.Collection');
goog.require('ol.CollectionEvent');
goog.require('ol.CollectionEventType');
goog.require('ol.Object');
goog.require('ol.layer.Layer');
goog.require('ol.layer.LayerBase');
/**
* @enum {string}
*/
ol.layer.LayerGroupProperty = {
LAYERS: 'layers'
};
/**
* @constructor
* @extends {ol.layer.LayerBase}
* @param {ol.layer.LayerGroupOptions=} opt_options Layer options.
*/
ol.layer.LayerGroup = function(opt_options) {
var options = goog.isDef(opt_options) ? opt_options : {};
var baseOptions = /** @type {ol.layer.LayerGroupOptions} */
(goog.object.clone(options));
delete baseOptions.layers;
var layers = options.layers;
goog.base(this, baseOptions);
/**
* @private
* @type {Object.<string, goog.events.Key>}
*/
this.listenerKeys_ = null;
goog.events.listen(this,
ol.Object.getChangeEventType(ol.layer.LayerGroupProperty.LAYERS),
this.handleLayersChanged_, false, this);
if (goog.isDef(layers)) {
if (goog.isArray(layers)) {
layers = new ol.Collection(goog.array.clone(layers));
} else {
goog.asserts.assertInstanceof(layers, ol.Collection);
layers = layers;
}
} else {
layers = new ol.Collection();
}
this.setLayers(layers);
};
goog.inherits(ol.layer.LayerGroup, ol.layer.LayerBase);
/**
* @param {goog.events.Event} event Event.
* @private
*/
ol.layer.LayerGroup.prototype.handleLayersChanged_ = function(event) {
if (!goog.isNull(this.listenerKeys_)) {
goog.array.forEach(
goog.object.getValues(this.listenerKeys_), goog.events.unlistenByKey);
this.listenerKeys_ = null;
}
var layers = this.getLayers();
if (goog.isDefAndNotNull(layers)) {
this.listenerKeys_ = {
'add': goog.events.listen(layers, ol.CollectionEventType.ADD,
this.handleLayersAdd_, false, this),
'remove': goog.events.listen(layers, ol.CollectionEventType.REMOVE,
this.handleLayersRemove_, false, this)
};
var layersArray = layers.getArray();
var i, ii, layer;
for (i = 0, ii = layersArray.length; i < ii; i++) {
layer = layersArray[i];
this.listenerKeys_[goog.getUid(layer).toString()] =
goog.events.listen(layer, goog.events.EventType.CHANGE,
this.handleLayerChange_, false, this);
}
}
this.dispatchChangeEvent_();
};
/**
* @param {ol.CollectionEvent} collectionEvent Collection event.
* @private
*/
ol.layer.LayerGroup.prototype.handleLayersAdd_ = function(collectionEvent) {
var layer = /** @type {ol.layer.LayerBase} */ (collectionEvent.elem);
this.listenerKeys_[goog.getUid(layer).toString()] = goog.events.listen(
layer, goog.events.EventType.CHANGE, this.handleLayerChange_, false,
this);
this.dispatchChangeEvent_();
};
/**
* @param {ol.CollectionEvent} collectionEvent Collection event.
* @private
*/
ol.layer.LayerGroup.prototype.handleLayersRemove_ = function(collectionEvent) {
var layer = /** @type {ol.layer.LayerBase} */ (collectionEvent.elem);
var key = goog.getUid(layer).toString();
goog.events.unlistenByKey(this.listenerKeys_[key]);
delete this.listenerKeys_[key];
this.dispatchChangeEvent_();
};
/**
* @private
*/
ol.layer.LayerGroup.prototype.handleLayerChange_ = function() {
this.dispatchChangeEvent_();
};
/**
* @private
*/
ol.layer.LayerGroup.prototype.dispatchChangeEvent_ = function() {
this.dispatchEvent(goog.events.EventType.CHANGE);
};
/**
* @return {ol.Collection} Collection of layers.
*/
ol.layer.LayerGroup.prototype.getLayers = function() {
return /** @type {ol.Collection} */ (this.get(
ol.layer.LayerGroupProperty.LAYERS));
};
goog.exportProperty(
ol.layer.LayerGroup.prototype,
'getLayers',
ol.layer.LayerGroup.prototype.getLayers);
/**
* @param {ol.Collection} layers Collection of layers.
*/
ol.layer.LayerGroup.prototype.setLayers = function(layers) {
this.set(ol.layer.LayerGroupProperty.LAYERS, layers);
};
goog.exportProperty(
ol.layer.LayerGroup.prototype,
'setLayers',
ol.layer.LayerGroup.prototype.setLayers);
/**
* @inheritDoc
*/
ol.layer.LayerGroup.prototype.getLayerStatesArray = function(opt_obj) {
var obj = (goog.isDef(opt_obj)) ? opt_obj : {
layers: [],
layerStates: []
};
goog.asserts.assert(obj.layers.length === obj.layerStates.length);
var pos = obj.layers.length;
this.getLayers().forEach(function(layer) {
layer.getLayerStatesArray(obj);
});
var ownLayerState = this.getLayerState();
var i, ii, layerState;
for (i = pos, ii = obj.layerStates.length; i < ii; i++) {
layerState = obj.layerStates[i];
layerState.brightness = goog.math.clamp(
layerState.brightness + ownLayerState.brightness, -1, 1);
layerState.contrast *= ownLayerState.contrast;
layerState.hue += ownLayerState.hue;
layerState.opacity *= ownLayerState.opacity;
layerState.saturation *= ownLayerState.saturation;
layerState.visible = layerState.visible && ownLayerState.visible;
}
return obj;
};
/**
* @inheritDoc
*/
ol.layer.LayerGroup.prototype.isReady = function() {
return null === goog.array.find(
this.getLayers().getArray(), function(elt, index, array) {
return !elt.isReady();
});
};