From 9dfbfab64888594997c96554613283fd60defdd7 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Fri, 30 Aug 2013 16:26:49 +0200 Subject: [PATCH 1/3] 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. --- src/ol/interaction/interaction.js | 4 -- src/ol/interaction/selectinteraction.js | 51 ++++++++++++------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/ol/interaction/interaction.js b/src/ol/interaction/interaction.js index 853b3c68f2..4fe73093b4 100644 --- a/src/ol/interaction/interaction.js +++ b/src/ol/interaction/interaction.js @@ -2,7 +2,6 @@ goog.provide('ol.interaction.Interaction'); -goog.require('goog.Disposable'); goog.require('ol.MapBrowserEvent'); goog.require('ol.animation.pan'); goog.require('ol.animation.rotate'); @@ -13,12 +12,9 @@ goog.require('ol.easing'); /** * @constructor - * @extends {goog.Disposable} */ ol.interaction.Interaction = function() { - goog.base(this); }; -goog.inherits(ol.interaction.Interaction, goog.Disposable); /** diff --git a/src/ol/interaction/selectinteraction.js b/src/ol/interaction/selectinteraction.js index 45fa13aef0..61c3053bbf 100644 --- a/src/ol/interaction/selectinteraction.js +++ b/src/ol/interaction/selectinteraction.js @@ -1,6 +1,7 @@ goog.provide('ol.interaction.Select'); goog.require('goog.array'); +goog.require('goog.object'); goog.require('ol.Feature'); goog.require('ol.interaction.ConditionType'); goog.require('ol.interaction.Interaction'); @@ -52,21 +53,6 @@ ol.interaction.Select = function(opt_options) { 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. */ @@ -105,12 +91,12 @@ ol.interaction.Select.prototype.handleMapBrowserEvent = function(evt) { ol.interaction.Select.prototype.select = function(map, featuresByLayer, layers, clear) { var mapId = goog.getUid(map); + if (!(mapId in this.selectionLayers)) { + 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); - if (!(mapId in this.selectionLayers)) { - this.selectionLayers[mapId] = {map: map, layers: {}}; - } var selectionLayer = this.selectionLayers[mapId].layers[layerId]; if (!goog.isDef(selectionLayer)) { selectionLayer = new ol.layer.Vector({ @@ -123,21 +109,25 @@ ol.interaction.Select.prototype.select = this.featureMap_[layerId] = {}; } + var selectedFeatures, unselectedFeatures; + if (goog.isFunction(layer.setRenderIntent)) { + selectedFeatures = []; + unselectedFeatures = []; + } var features = featuresByLayer[i]; var numFeatures = features.length; - var selectedFeatures = []; var featuresToAdd = []; - var unselectedFeatures = []; var featuresToRemove = []; var featureMap = this.featureMap_[layerId]; var oldFeatureMap = featureMap; if (clear) { for (var f in featureMap) { - unselectedFeatures.push(layer.getFeatureWithUid(f)); + if (goog.isDef(unselectedFeatures)) { + unselectedFeatures.push(layer.getFeatureWithUid(f)); + } featuresToRemove.push(featureMap[f]); + delete featureMap[f]; } - featureMap = {}; - this.featureMap_[layerId] = featureMap; } for (var j = 0; j < numFeatures; ++j) { var feature = features[j]; @@ -145,9 +135,11 @@ ol.interaction.Select.prototype.select = var clone = featureMap[featureId]; if (clone) { // TODO: make toggle configurable - unselectedFeatures.push(feature); - featuresToRemove.push(clone); + if (goog.isDef(unselectedFeatures)) { + unselectedFeatures.push(feature); + } delete featureMap[featureId]; + featuresToRemove.push(clone); } else if (!(featureId in oldFeatureMap)) { clone = new ol.Feature(feature.getAttributes()); clone.setGeometry(feature.getGeometry().clone()); @@ -155,7 +147,9 @@ ol.interaction.Select.prototype.select = clone.setSymbolizers(feature.getSymbolizers()); clone.renderIntent = ol.layer.VectorLayerRenderIntent.SELECTED; featureMap[featureId] = clone; - selectedFeatures.push(feature); + if (goog.isDef(selectedFeatures)) { + selectedFeatures.push(feature); + } featuresToAdd.push(clone); } } @@ -167,6 +161,11 @@ ol.interaction.Select.prototype.select = } selectionLayer.removeFeatures(featuresToRemove); 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 } }; From cbf7f91cfb435e9b4d39d87c4979ea1af732962f Mon Sep 17 00:00:00 2001 From: ahocevar Date: Fri, 30 Aug 2013 23:18:17 +0200 Subject: [PATCH 2/3] instanceof check to avoid ducktyping --- src/ol/interaction/selectinteraction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/interaction/selectinteraction.js b/src/ol/interaction/selectinteraction.js index 61c3053bbf..10e57b6f6f 100644 --- a/src/ol/interaction/selectinteraction.js +++ b/src/ol/interaction/selectinteraction.js @@ -101,7 +101,7 @@ ol.interaction.Select.prototype.select = if (!goog.isDef(selectionLayer)) { selectionLayer = new ol.layer.Vector({ source: new ol.source.Vector({parser: null}), - style: goog.isFunction(layer.getStyle) ? layer.getStyle() : null + style: layer instanceof ol.layer.Vector ? layer.getStyle() : null }); selectionLayer.setTemporary(true); map.addLayer(selectionLayer); From d8bc7697588e87e7038232bcc2dc2b8c1e951e56 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Fri, 30 Aug 2013 23:18:59 +0200 Subject: [PATCH 3/3] Do not delete from oldFeatureMap --- src/ol/interaction/selectinteraction.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/interaction/selectinteraction.js b/src/ol/interaction/selectinteraction.js index 10e57b6f6f..5e7090a22c 100644 --- a/src/ol/interaction/selectinteraction.js +++ b/src/ol/interaction/selectinteraction.js @@ -126,8 +126,9 @@ ol.interaction.Select.prototype.select = unselectedFeatures.push(layer.getFeatureWithUid(f)); } featuresToRemove.push(featureMap[f]); - delete featureMap[f]; } + featureMap = {}; + this.featureMap_[layerId] = featureMap; } for (var j = 0; j < numFeatures; ++j) { var feature = features[j];