Follow-up improvements for #897

* Interaction is no goog.Disposable any more.
* Permanent cleanup during selection instead of disposeInternal.
* Moved selectionLayers creation outside feature loop.
* Maintain selectedFeatures and unselectedFeatures only for
  layers that have a setRenderIntent method.
This commit is contained in:
ahocevar
2013-08-30 16:26:49 +02:00
parent 29317c3316
commit 9dfbfab648
2 changed files with 25 additions and 30 deletions

View File

@@ -2,7 +2,6 @@
goog.provide('ol.interaction.Interaction'); goog.provide('ol.interaction.Interaction');
goog.require('goog.Disposable');
goog.require('ol.MapBrowserEvent'); goog.require('ol.MapBrowserEvent');
goog.require('ol.animation.pan'); goog.require('ol.animation.pan');
goog.require('ol.animation.rotate'); goog.require('ol.animation.rotate');
@@ -13,12 +12,9 @@ goog.require('ol.easing');
/** /**
* @constructor * @constructor
* @extends {goog.Disposable}
*/ */
ol.interaction.Interaction = function() { ol.interaction.Interaction = function() {
goog.base(this);
}; };
goog.inherits(ol.interaction.Interaction, goog.Disposable);
/** /**

View File

@@ -1,6 +1,7 @@
goog.provide('ol.interaction.Select'); goog.provide('ol.interaction.Select');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.object');
goog.require('ol.Feature'); goog.require('ol.Feature');
goog.require('ol.interaction.ConditionType'); goog.require('ol.interaction.ConditionType');
goog.require('ol.interaction.Interaction'); goog.require('ol.interaction.Interaction');
@@ -52,21 +53,6 @@ ol.interaction.Select = function(opt_options) {
goog.inherits(ol.interaction.Select, ol.interaction.Interaction); goog.inherits(ol.interaction.Select, ol.interaction.Interaction);
/**
* @inheritDoc
*/
ol.interaction.Select.prototype.disposeInternal = function() {
for (var m in this.selectionLayers) {
var selectionLayers = this.selectionLayers[m].layers;
var map = this.selectionLayers[m].map;
for (var l in selectionLayers) {
map.removeLayer(selectionLayers[l]);
}
}
goog.base(this, 'disposeInternal');
};
/** /**
* @inheritDoc. * @inheritDoc.
*/ */
@@ -105,12 +91,12 @@ ol.interaction.Select.prototype.handleMapBrowserEvent = function(evt) {
ol.interaction.Select.prototype.select = ol.interaction.Select.prototype.select =
function(map, featuresByLayer, layers, clear) { function(map, featuresByLayer, layers, clear) {
var mapId = goog.getUid(map); var mapId = goog.getUid(map);
for (var i = 0, ii = featuresByLayer.length; i < ii; ++i) {
var layer = layers[i];
var layerId = goog.getUid(layer);
if (!(mapId in this.selectionLayers)) { if (!(mapId in this.selectionLayers)) {
this.selectionLayers[mapId] = {map: map, layers: {}}; this.selectionLayers[mapId] = {map: map, layers: {}};
} }
for (var i = 0, ii = featuresByLayer.length; i < ii; ++i) {
var layer = layers[i];
var layerId = goog.getUid(layer);
var selectionLayer = this.selectionLayers[mapId].layers[layerId]; var selectionLayer = this.selectionLayers[mapId].layers[layerId];
if (!goog.isDef(selectionLayer)) { if (!goog.isDef(selectionLayer)) {
selectionLayer = new ol.layer.Vector({ selectionLayer = new ol.layer.Vector({
@@ -123,21 +109,25 @@ ol.interaction.Select.prototype.select =
this.featureMap_[layerId] = {}; this.featureMap_[layerId] = {};
} }
var selectedFeatures, unselectedFeatures;
if (goog.isFunction(layer.setRenderIntent)) {
selectedFeatures = [];
unselectedFeatures = [];
}
var features = featuresByLayer[i]; var features = featuresByLayer[i];
var numFeatures = features.length; var numFeatures = features.length;
var selectedFeatures = [];
var featuresToAdd = []; var featuresToAdd = [];
var unselectedFeatures = [];
var featuresToRemove = []; var featuresToRemove = [];
var featureMap = this.featureMap_[layerId]; var featureMap = this.featureMap_[layerId];
var oldFeatureMap = featureMap; var oldFeatureMap = featureMap;
if (clear) { if (clear) {
for (var f in featureMap) { for (var f in featureMap) {
if (goog.isDef(unselectedFeatures)) {
unselectedFeatures.push(layer.getFeatureWithUid(f)); unselectedFeatures.push(layer.getFeatureWithUid(f));
featuresToRemove.push(featureMap[f]);
} }
featureMap = {}; featuresToRemove.push(featureMap[f]);
this.featureMap_[layerId] = featureMap; delete featureMap[f];
}
} }
for (var j = 0; j < numFeatures; ++j) { for (var j = 0; j < numFeatures; ++j) {
var feature = features[j]; var feature = features[j];
@@ -145,9 +135,11 @@ ol.interaction.Select.prototype.select =
var clone = featureMap[featureId]; var clone = featureMap[featureId];
if (clone) { if (clone) {
// TODO: make toggle configurable // TODO: make toggle configurable
if (goog.isDef(unselectedFeatures)) {
unselectedFeatures.push(feature); unselectedFeatures.push(feature);
featuresToRemove.push(clone); }
delete featureMap[featureId]; delete featureMap[featureId];
featuresToRemove.push(clone);
} else if (!(featureId in oldFeatureMap)) { } else if (!(featureId in oldFeatureMap)) {
clone = new ol.Feature(feature.getAttributes()); clone = new ol.Feature(feature.getAttributes());
clone.setGeometry(feature.getGeometry().clone()); clone.setGeometry(feature.getGeometry().clone());
@@ -155,7 +147,9 @@ ol.interaction.Select.prototype.select =
clone.setSymbolizers(feature.getSymbolizers()); clone.setSymbolizers(feature.getSymbolizers());
clone.renderIntent = ol.layer.VectorLayerRenderIntent.SELECTED; clone.renderIntent = ol.layer.VectorLayerRenderIntent.SELECTED;
featureMap[featureId] = clone; featureMap[featureId] = clone;
if (goog.isDef(selectedFeatures)) {
selectedFeatures.push(feature); selectedFeatures.push(feature);
}
featuresToAdd.push(clone); featuresToAdd.push(clone);
} }
} }
@@ -167,6 +161,11 @@ ol.interaction.Select.prototype.select =
} }
selectionLayer.removeFeatures(featuresToRemove); selectionLayer.removeFeatures(featuresToRemove);
selectionLayer.addFeatures(featuresToAdd); selectionLayer.addFeatures(featuresToAdd);
if (goog.object.getCount(featureMap) == 0) {
map.removeLayer(selectionLayer);
delete this.selectionLayers[mapId].layers[layerId];
delete this.featureMap_[layerId];
}
// TODO: Dispatch an event with selectedFeatures and unselectedFeatures // TODO: Dispatch an event with selectedFeatures and unselectedFeatures
} }
}; };