From 968c8aa34e29eb87c117961c996a018560ffdf40 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 1 Aug 2015 21:53:25 +0200 Subject: [PATCH] interaction/modify: Replace lastNewVertexPixel with ignoreNextSingleClick The previous approach did not work on mobile devices where no `pointermove` event is sent except from dragging. Logic now is: Upon vertex creation due to `pointerdown` we will ignore the next `singleclick` event unless there is a `pointerdrag` event, which will not lead to a `singleclick` event following the vertex creation. Resolves #3935 --- src/ol/interaction/modifyinteraction.js | 21 +++++++++----- .../ol/interaction/modifyinteraction.test.js | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/ol/interaction/modifyinteraction.js b/src/ol/interaction/modifyinteraction.js index cc1797db20..75818f52f5 100644 --- a/src/ol/interaction/modifyinteraction.js +++ b/src/ol/interaction/modifyinteraction.js @@ -142,12 +142,12 @@ ol.interaction.Modify = function(options) { this.lastPixel_ = [0, 0]; /** - * Keep track of the last inserted pixel location to avoid - * unintentional deletion. - * @type {ol.Pixel} + * Tracks if the next `singleclick` event should be ignored to prevent + * accidental deletion right after vertex creation. + * @type {boolean} * @private */ - this.lastNewVertexPixel_ = [NaN, NaN]; + this.ignoreNextSingleClick_ = false; /** * Segment RTree for each layer @@ -543,6 +543,8 @@ ol.interaction.Modify.handleDownEvent_ = function(evt) { * @private */ ol.interaction.Modify.handleDragEvent_ = function(evt) { + this.ignoreNextSingleClick_ = false; + var vertex = evt.coordinate; for (var i = 0, ii = this.dragSegments_.length; i < ii; ++i) { var dragSegment = this.dragSegments_[i]; @@ -626,8 +628,8 @@ ol.interaction.Modify.handleEvent = function(mapBrowserEvent) { } if (!goog.isNull(this.vertexFeature_) && this.deleteCondition_(mapBrowserEvent)) { - if (this.lastNewVertexPixel_[0] !== this.lastPixel_[0] || - this.lastNewVertexPixel_[1] !== this.lastPixel_[1]) { + if (mapBrowserEvent.type != ol.MapBrowserEvent.EventType.SINGLECLICK || + !this.ignoreNextSingleClick_) { var geometry = this.vertexFeature_.getGeometry(); goog.asserts.assertInstanceof(geometry, ol.geom.Point, 'geometry should be an ol.geom.Point'); @@ -636,6 +638,11 @@ ol.interaction.Modify.handleEvent = function(mapBrowserEvent) { handled = true; } } + + if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.SINGLECLICK) { + this.ignoreNextSingleClick_ = false; + } + return ol.interaction.Pointer.handleEvent.call(this, mapBrowserEvent) && !handled; }; @@ -789,7 +796,7 @@ ol.interaction.Modify.prototype.insertVertex_ = function(segmentData, vertex) { rTree.insert(ol.extent.boundingExtent(newSegmentData2.segment), newSegmentData2); this.dragSegments_.push([newSegmentData2, 0]); - this.lastNewVertexPixel_ = this.lastPixel_; + this.ignoreNextSingleClick_ = true; }; diff --git a/test/spec/ol/interaction/modifyinteraction.test.js b/test/spec/ol/interaction/modifyinteraction.test.js index b85c2d15f7..7931ee336c 100644 --- a/test/spec/ol/interaction/modifyinteraction.test.js +++ b/test/spec/ol/interaction/modifyinteraction.test.js @@ -135,6 +135,34 @@ describe('ol.interaction.Modify', function() { expect(feature.getGeometry().getCoordinates()[0]).to.have.length(6); }); + it('single clicking on created vertex should delete it again', function() { + var modify = new ol.interaction.Modify({ + features: new ol.Collection(features) + }); + map.addInteraction(modify); + + var feature = features[0]; + + expect(feature.getGeometry().getRevision()).to.equal(1); + expect(feature.getGeometry().getCoordinates()[0]).to.have.length(5); + + simulateEvent('pointerdown', 40, -20, false, 0); + simulateEvent('pointerup', 40, -20, false, 0); + simulateEvent('click', 40, -20, false, 0); + simulateEvent('singleclick', 40, -20, false, 0); + + expect(feature.getGeometry().getRevision()).to.equal(2); + expect(feature.getGeometry().getCoordinates()[0]).to.have.length(6); + + simulateEvent('pointerdown', 40, -20, false, 0); + simulateEvent('pointerup', 40, -20, false, 0); + simulateEvent('click', 40, -20, false, 0); + simulateEvent('singleclick', 40, -20, false, 0); + + expect(feature.getGeometry().getRevision()).to.equal(3); + expect(feature.getGeometry().getCoordinates()[0]).to.have.length(5); + }); + it('clicking with drag should add vertex and +r3', function() { var modify = new ol.interaction.Modify({ features: new ol.Collection(features)