From ebc18b4f682e1dd1b53f2e5989dbbedd39123dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Peru=C4=8Di=C4=87?= Date: Thu, 26 Mar 2015 23:49:29 +0100 Subject: [PATCH] fix: updateing geometry index More than one features can be be changed while handlingDownUpSequence exampe: ol.interaction.Modify supports simultaneous editing of multiple features When a geometry changes old indexed segments are searched by the feature extend and removed. New ones are added. Old feature extent sholud be used when removing the old indexed segments. --- src/ol/interaction/snapinteraction.js | 44 ++++++++++++++++++--------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/ol/interaction/snapinteraction.js b/src/ol/interaction/snapinteraction.js index a55963eca0..e43a8249d1 100644 --- a/src/ol/interaction/snapinteraction.js +++ b/src/ol/interaction/snapinteraction.js @@ -1,12 +1,15 @@ goog.provide('ol.interaction.Snap'); goog.provide('ol.interaction.SnapProperty'); +goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.events.EventType'); +goog.require('goog.object'); goog.require('ol.Collection'); goog.require('ol.CollectionEvent'); goog.require('ol.CollectionEventType'); +goog.require('ol.Extent'); goog.require('ol.Feature'); goog.require('ol.Observable'); goog.require('ol.coordinate'); @@ -80,6 +83,14 @@ ol.interaction.Snap = function(opt_options) { */ this.geometryListenerKeys_ = {}; + /** + * Extents are preserved so indexed segment can be quickly removed + * when its feature geometry changes + * @type {Object.} + * @private + */ + this.indexedFeaturesExtents_ = {}; + /** * @type {number} * @private @@ -126,12 +137,14 @@ ol.interaction.Snap.prototype.addFeature = function(feature, opt_listen) { var geometry = feature.getGeometry(); var segmentWriter = this.SEGMENT_WRITERS_[geometry.getType()]; if (goog.isDef(segmentWriter)) { + var feature_uid = goog.getUid(feature); + this.indexedFeaturesExtents_[feature_uid] = geometry.getExtent(); segmentWriter.call(this, feature, geometry); } if (listen) { - var uid = goog.getUid(geometry); - this.geometryListenerKeys_[uid] = geometry.on( + var geom_uid = goog.getUid(geometry); + this.geometryListenerKeys_[geom_uid] = geometry.on( goog.events.EventType.CHANGE, goog.bind(this.handleGeometryChanged_, this, feature), this); @@ -147,10 +160,10 @@ goog.exportProperty( * If a feature geometry changes while a pointer drag|move event occurs, the * feature doesn't get updated right away. It will be at the next 'pointerup' * event fired. - * @type {?ol.Feature} + * @type {Object.} * @private */ -ol.interaction.Snap.prototype.featurePending_ = null; +ol.interaction.Snap.prototype.pendingFeatures_ = null; /** @@ -242,8 +255,9 @@ ol.interaction.Snap.prototype.handleFeatureRemove_ = function(evt) { */ ol.interaction.Snap.prototype.handleGeometryChanged_ = function(feature, evt) { if (this.handlingDownUpSequence) { - if (goog.isNull(this.featurePending_)) { - this.featurePending_ = feature; + var uid = goog.getUid(feature); + if (!(uid in this.pendingFeatures_)) { + this.pendingFeatures_[uid] = feature; } } else { this.updateFeature_(feature); @@ -259,7 +273,9 @@ ol.interaction.Snap.prototype.handleGeometryChanged_ = function(feature, evt) { */ ol.interaction.Snap.prototype.removeFeature = function(feature, opt_unlisten) { var unlisten = goog.isDef(opt_unlisten) ? opt_unlisten : true; - var extent = feature.getGeometry().getExtent(); + var feature_uid = goog.getUid(feature); + var extent = this.indexedFeaturesExtents_[feature_uid]; + goog.asserts.assertArray(extent); var rBush = this.rBush_; var i, nodesToRemove = []; rBush.forEachInExtent(extent, function(node) { @@ -274,9 +290,9 @@ ol.interaction.Snap.prototype.removeFeature = function(feature, opt_unlisten) { if (unlisten) { var geometry = feature.getGeometry(); goog.asserts.assertInstanceof(geometry, ol.geom.Geometry); - var uid = goog.getUid(geometry); - ol.Observable.unByKey(this.geometryListenerKeys_[uid]); - delete this.geometryListenerKeys_[uid]; + var geom_uid = goog.getUid(geometry); + ol.Observable.unByKey(this.geometryListenerKeys_[geom_uid]); + delete this.geometryListenerKeys_[geom_uid]; } }; goog.exportProperty( @@ -380,6 +396,7 @@ ol.interaction.Snap.prototype.snapTo = function(pixel, pixelCoordinate, map) { * @private */ ol.interaction.Snap.prototype.updateFeature_ = function(feature) { + console.log(3); this.removeFeature(feature, false); this.addFeature(feature, false); }; @@ -554,10 +571,9 @@ ol.interaction.Snap.SegmentDataType; * @api */ ol.interaction.Snap.handleUpEvent = function(evt) { - if (!goog.isNull(this.featurePending_)) { - this.updateFeature_(this.featurePending_); - this.featurePending_ = null; - } + goog.array.forEach(goog.object.getValues(this.pendingFeatures_), + this.updateFeature_, this); + this.pendingFeatures_ = {}; return false; };