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

View File

@@ -32,8 +32,6 @@ goog.require('goog.style');
goog.require('goog.vec.Mat4');
goog.require('ol.BrowserFeature');
goog.require('ol.Collection');
goog.require('ol.CollectionEvent');
goog.require('ol.CollectionEventType');
goog.require('ol.FrameState');
goog.require('ol.IView');
goog.require('ol.MapBrowserEvent');
@@ -56,6 +54,8 @@ goog.require('ol.control.defaults');
goog.require('ol.extent');
goog.require('ol.interaction.defaults');
goog.require('ol.layer.Layer');
goog.require('ol.layer.LayerBase');
goog.require('ol.layer.LayerGroup');
goog.require('ol.proj');
goog.require('ol.proj.addCommonProjections');
goog.require('ol.renderer.Map');
@@ -309,9 +309,12 @@ ol.Map = function(options) {
/**
* @private
* @type {Array.<?number>}
* @type {ol.layer.LayerGroup}
*/
this.layersListenerKeys_ = null;
this.layerGroup_ = new ol.layer.LayerGroup();
goog.events.listen(this.layerGroup_, ol.ObjectEventType.CHANGE,
this.handleLayerGroupChanged_, false, this);
goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.LAYERS),
this.handleLayersChanged_, false, this);
@@ -352,7 +355,7 @@ ol.Map.prototype.addControl = function(control) {
/**
* Adds the given layer to the top of this map.
* @param {ol.layer.Layer} layer Layer.
* @param {ol.layer.LayerBase} layer Layer.
*/
ol.Map.prototype.addLayer = function(layer) {
var layers = this.getLayers();
@@ -615,46 +618,6 @@ ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) {
};
/**
* @param {ol.CollectionEvent} collectionEvent Collection event.
* @private
*/
ol.Map.prototype.handleLayersAdd_ = function(collectionEvent) {
this.render();
};
/**
* @param {goog.events.Event} event Event.
* @private
*/
ol.Map.prototype.handleLayersChanged_ = function(event) {
if (!goog.isNull(this.layersListenerKeys_)) {
goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey);
this.layersListenerKeys_ = null;
}
var layers = this.getLayers();
if (goog.isDefAndNotNull(layers)) {
this.layersListenerKeys_ = [
goog.events.listen(layers, ol.CollectionEventType.ADD,
this.handleLayersAdd_, false, this),
goog.events.listen(layers, ol.CollectionEventType.REMOVE,
this.handleLayersRemove_, false, this)
];
}
this.render();
};
/**
* @param {ol.CollectionEvent} collectionEvent Collection event.
* @private
*/
ol.Map.prototype.handleLayersRemove_ = function(collectionEvent) {
this.render();
};
/**
* @param {ol.MapBrowserEvent} mapBrowserEvent The event to handle.
*/
@@ -788,6 +751,23 @@ ol.Map.prototype.handleViewChanged_ = function() {
};
/**
* @param {goog.events.Event} event Event.
* @private
*/
ol.Map.prototype.handleLayersChanged_ = function(event) {
this.layerGroup_.setLayers(this.getLayers());
};
/**
* @private
*/
ol.Map.prototype.handleLayerGroupChanged_ = function() {
this.render();
};
/**
* @return {boolean} Is defined.
*/
@@ -845,14 +825,14 @@ ol.Map.prototype.removeControl = function(control) {
/**
* Removes the given layer from the map.
* @param {ol.layer.Layer} layer Layer.
* @return {ol.layer.Layer|undefined} The removed layer or undefined if the
* @param {ol.layer.LayerBase} layer Layer.
* @return {ol.layer.LayerBase|undefined} The removed layer or undefined if the
* layer was not found.
*/
ol.Map.prototype.removeLayer = function(layer) {
var layers = this.getLayers();
goog.asserts.assert(goog.isDef(layers));
return /** @type {ol.layer.Layer|undefined} */ (layers.remove(layer));
return /** @type {ol.layer.LayerBase|undefined} */ (layers.remove(layer));
};
@@ -869,21 +849,20 @@ ol.Map.prototype.renderFrame_ = function(time) {
}
var size = this.getSize();
var layers = this.getLayers();
var layersArray = goog.isDef(layers) ?
/** @type {Array.<ol.layer.Layer>} */ (layers.getArray()) : undefined;
var view = this.getView();
var view2D = goog.isDef(view) ? this.getView().getView2D() : undefined;
/** @type {?ol.FrameState} */
var frameState = null;
if (goog.isDef(layersArray) && goog.isDef(size) && goog.isDef(view2D) &&
view2D.isDef()) {
if (goog.isDef(size) && goog.isDef(view2D) && view2D.isDef()) {
var viewHints = view.getHints();
var obj = this.layerGroup_.getLayerStatesArray();
var layersArray = obj.layers;
var layerStatesArray = obj.layerStates;
var layerStates = {};
var layer;
for (i = 0, ii = layersArray.length; i < ii; ++i) {
layer = layersArray[i];
layerStates[goog.getUid(layer)] = layer.getLayerState();
layerStates[goog.getUid(layer)] = layerStatesArray[i];
}
view2DState = view2D.getView2DState();
frameState = {