diff --git a/externs/olx.js b/externs/olx.js index a6b0c889f5..64615ed687 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -2837,7 +2837,8 @@ olx.interaction.KeyboardZoomOptions.prototype.delta; /** - * @typedef {{deleteCondition: (ol.events.ConditionType|undefined), + * @typedef {{condition: (ol.events.ConditionType|undefined), + * deleteCondition: (ol.events.ConditionType|undefined), * pixelTolerance: (number|undefined), * style: (ol.style.Style|Array.|ol.style.StyleFunction|undefined), * features: ol.Collection., @@ -2847,6 +2848,17 @@ olx.interaction.KeyboardZoomOptions.prototype.delta; olx.interaction.ModifyOptions; +/** + * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean + * to indicate whether that event will be considered to add or move a vertex + * to the sketch. + * Default is {@link ol.events.condition.primaryAction}. + * @type {ol.events.ConditionType|undefined} + * @api + */ +olx.interaction.ModifyOptions.prototype.condition; + + /** * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean * to indicate whether that event should be handled. diff --git a/src/ol/events/condition.js b/src/ol/events/condition.js index 1d0662b40c..9ef1f0075a 100644 --- a/src/ol/events/condition.js +++ b/src/ol/events/condition.js @@ -220,3 +220,18 @@ ol.events.condition.mouseOnly = function(mapBrowserEvent) { // see http://www.w3.org/TR/pointerevents/#widl-PointerEvent-pointerType return mapBrowserEvent.pointerEvent.pointerType == 'mouse'; }; + + +/** + * Return `true` if the event originates from a primary pointer in + * contact with the surface or if the left mouse button is pressed. + * @see http://www.w3.org/TR/pointerevents/#button-states + * + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True if the event originates from a primary pointer. + * @api + */ +ol.events.condition.primaryAction = function(mapBrowserEvent) { + var pointerEvent = mapBrowserEvent.pointerEvent; + return pointerEvent.isPrimary && pointerEvent.button === 0; +}; diff --git a/src/ol/interaction/modifyinteraction.js b/src/ol/interaction/modifyinteraction.js index 1d931f9849..e88fbc0d2f 100644 --- a/src/ol/interaction/modifyinteraction.js +++ b/src/ol/interaction/modifyinteraction.js @@ -112,6 +112,14 @@ ol.interaction.Modify = function(options) { handleUpEvent: ol.interaction.Modify.handleUpEvent_ }); + /** + * @private + * @type {ol.events.ConditionType} + */ + this.condition_ = options.condition ? + options.condition : ol.events.condition.primaryAction; + + /** * @private * @param {ol.MapBrowserEvent} mapBrowserEvent Browser event. @@ -553,6 +561,9 @@ ol.interaction.Modify.compareIndexes_ = function(a, b) { * @private */ ol.interaction.Modify.handleDownEvent_ = function(evt) { + if (!this.condition_(evt)) { + return false; + } this.handlePointerAtPixel_(evt.pixel, evt.map); this.dragSegments_.length = 0; this.modified_ = false; diff --git a/test/spec/ol/interaction/modifyinteraction.test.js b/test/spec/ol/interaction/modifyinteraction.test.js index 970e9358af..eb3a7c46a1 100644 --- a/test/spec/ol/interaction/modifyinteraction.test.js +++ b/test/spec/ol/interaction/modifyinteraction.test.js @@ -68,10 +68,12 @@ describe('ol.interaction.Modify', function() { var shiftKey = opt_shiftKey !== undefined ? opt_shiftKey : false; var pointerEvent = new ol.pointer.PointerEvent(type, { type: type, - button: button, clientX: position.left + x + width / 2, clientY: position.top + y + height / 2, shiftKey: shiftKey + }, { + button: button, + isPrimary: true }); var event = new ol.MapBrowserPointerEvent(type, map, pointerEvent); event.pointerEvent.pointerId = 1; @@ -376,6 +378,23 @@ describe('ol.interaction.Modify', function() { validateEvents(events, [feature]); }); + + it('clicking with right button should not add a vertex', function() { + expect(feature.getGeometry().getRevision()).to.equal(1); + expect(feature.getGeometry().getCoordinates()[0]).to.have.length(5); + + simulateEvent('pointermove', 40, -20, false, 0); + // right click + simulateEvent('pointerdown', 40, -20, false, 1); + simulateEvent('pointermove', 30, -20, false, 1); + simulateEvent('pointerdrag', 30, -20, false, 1); + simulateEvent('pointerup', 30, -20, false, 1); + + expect(feature.getGeometry().getRevision()).to.equal(1); + expect(feature.getGeometry().getCoordinates()[0]).to.have.length(5); + expect(events).to.have.length(0); + }); + }); describe('double click deleteCondition', function() {