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:
@@ -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);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user