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'
};