diff --git a/src/ol/feature.js b/src/ol/feature.js index 4adffbe482..be375d8d37 100644 --- a/src/ol/feature.js +++ b/src/ol/feature.js @@ -175,6 +175,20 @@ ol.Feature.prototype.setGeometry = function(geometry) { }; +/** + * Changes the renderIntent for this feature. + * @param {string} renderIntent Render intent. + */ +ol.Feature.prototype.setRenderIntent = function(renderIntent) { + this.renderIntent = renderIntent; + var geometry = this.getGeometry(); + if (!goog.isNull(geometry)) { + this.dispatchEvent(new ol.FeatureEvent( + ol.FeatureEventType.INTENTCHANGE, this, geometry.getBounds())); + } +}; + + /** * Set the symbolizers to be used for this feature. * @param {Array.} symbolizers Symbolizers for this @@ -196,7 +210,8 @@ ol.Feature.DEFAULT_GEOMETRY = 'geometry'; * @enum {string} */ ol.FeatureEventType = { - CHANGE: 'featurechange' + CHANGE: 'featurechange', + INTENTCHANGE: 'featureintentchange' }; diff --git a/src/ol/interaction/selectinteraction.js b/src/ol/interaction/selectinteraction.js index 705e872671..6bfb1c303c 100644 --- a/src/ol/interaction/selectinteraction.js +++ b/src/ol/interaction/selectinteraction.js @@ -119,10 +119,8 @@ ol.interaction.Select.prototype.select = } var selectedFeatures, unselectedFeatures; - if (goog.isFunction(layer.setRenderIntent)) { - selectedFeatures = []; - unselectedFeatures = []; - } + selectedFeatures = []; + unselectedFeatures = []; var features = featuresByLayer[i]; var numFeatures = features.length; var featuresToAdd = []; @@ -131,9 +129,7 @@ ol.interaction.Select.prototype.select = var oldFeatureMap = featureMap; if (clear) { for (var f in featureMap) { - if (goog.isDef(unselectedFeatures)) { - unselectedFeatures.push(layer.getFeatureWithUid(f)); - } + unselectedFeatures.push(layer.getFeatureWithUid(f)); featuresToRemove.push(featureMap[f]); } featureMap = {}; @@ -145,9 +141,7 @@ ol.interaction.Select.prototype.select = var clone = featureMap[featureId]; if (clone) { // TODO: make toggle configurable - if (goog.isDef(unselectedFeatures)) { - unselectedFeatures.push(feature); - } + unselectedFeatures.push(feature); delete featureMap[featureId]; featuresToRemove.push(clone); } else if (!(featureId in oldFeatureMap)) { @@ -157,17 +151,17 @@ ol.interaction.Select.prototype.select = clone.setSymbolizers(feature.getSymbolizers()); clone.renderIntent = ol.layer.VectorLayerRenderIntent.SELECTED; featureMap[featureId] = clone; - if (goog.isDef(selectedFeatures)) { - selectedFeatures.push(feature); - } + selectedFeatures.push(feature); featuresToAdd.push(clone); } } - if (goog.isFunction(layer.setRenderIntent)) { - layer.setRenderIntent(ol.layer.VectorLayerRenderIntent.HIDDEN, - selectedFeatures); - layer.setRenderIntent(ol.layer.VectorLayerRenderIntent.DEFAULT, - unselectedFeatures); + for (var j = selectedFeatures.length - 1; j >= 0; --j) { + selectedFeatures[j].setRenderIntent( + ol.layer.VectorLayerRenderIntent.HIDDEN); + } + for (var j = unselectedFeatures.length - 1; j >= 0; --j) { + unselectedFeatures[j].setRenderIntent( + ol.layer.VectorLayerRenderIntent.DEFAULT); } selectionLayer.removeFeatures(featuresToRemove); selectionLayer.addFeatures(featuresToAdd); diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index 235433a756..bbb4bb66d5 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -188,6 +188,8 @@ ol.layer.Vector.prototype.addFeatures = function(features) { } goog.events.listen(feature, ol.FeatureEventType.CHANGE, this.handleFeatureChange_, false, this); + goog.events.listen(feature, ol.FeatureEventType.INTENTCHANGE, + this.handleIntentChange_, false, this); } this.dispatchEvent(new ol.layer.VectorEvent(ol.layer.VectorEventType.ADD, features, [extent])); @@ -217,6 +219,20 @@ ol.layer.Vector.prototype.handleFeatureChange_ = function(evt) { }; +/** + * Listener for render intent change events of features. + * @param {ol.FeatureEvent} evt The feature intent change event. + * @private + */ +ol.layer.Vector.prototype.handleIntentChange_ = function(evt) { + goog.asserts.assertInstanceof(evt.target, ol.Feature); + var feature = /** @type {ol.Feature} */ (evt.target); + this.dispatchEvent(new ol.layer.VectorEvent( + ol.layer.VectorEventType.INTENTCHANGE, [feature], + [feature.getGeometry().getBounds()])); +}; + + /** * Remove all features from the layer. */ @@ -423,31 +439,6 @@ ol.layer.Vector.prototype.removeFeatures = function(features) { }; -/** - * Changes the renderIntent for an array of features. - * @param {string} renderIntent Render intent. - * @param {Array.=} opt_features Features to change the renderIntent - * for. If not provided, all features will be changed. - */ -ol.layer.Vector.prototype.setRenderIntent = - function(renderIntent, opt_features) { - var features = goog.isDef(opt_features) ? opt_features : - goog.object.getValues(this.featureCache_.getFeaturesObject()); - var extent = ol.extent.createEmpty(), - feature, geometry; - for (var i = features.length - 1; i >= 0; --i) { - feature = features[i]; - feature.renderIntent = renderIntent; - geometry = feature.getGeometry(); - if (!goog.isNull(geometry)) { - ol.extent.extend(extent, geometry.getBounds()); - } - } - this.dispatchEvent(new ol.layer.VectorEvent( - ol.layer.VectorEventType.INTENTCHANGE, features, [extent])); -}; - - /** * @param {boolean} temp Whether this layer is temporary. */ @@ -511,6 +502,6 @@ goog.inherits(ol.layer.VectorEvent, goog.events.Event); ol.layer.VectorEventType = { ADD: 'featureadd', CHANGE: 'featurechange', - REMOVE: 'featureremove', - INTENTCHANGE: 'intentchange' + INTENTCHANGE: 'featureintentchange', + REMOVE: 'featureremove' };