From ecb2a42900984e6051ffd2a7ab3f14f8c50500ad Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 27 Jan 2016 14:07:26 +0100 Subject: [PATCH] Properly detect feature on unmanaged layer for toggle selection --- src/ol/interaction/selectinteraction.js | 5 +-- src/ol/source/vectorsource.js | 10 ++++++ .../ol/interaction/selectinteraction.test.js | 32 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/ol/interaction/selectinteraction.js b/src/ol/interaction/selectinteraction.js index 1abe851f69..81fa25838f 100644 --- a/src/ol/interaction/selectinteraction.js +++ b/src/ol/interaction/selectinteraction.js @@ -323,7 +323,8 @@ ol.interaction.Select.handleEvent = function(mapBrowserEvent) { * @param {ol.layer.Layer} layer Layer. */ function(feature, layer) { - if (layer !== this.featureOverlay_) { + goog.asserts.assertInstanceof(feature, ol.Feature); + if (layer !== null) { if (add || toggle) { if (this.filter_(feature, layer) && !ol.array.includes(features.getArray(), feature) && @@ -332,7 +333,7 @@ ol.interaction.Select.handleEvent = function(mapBrowserEvent) { this.addFeatureLayerAssociation_(feature, layer); } } - } else { + } else if (this.featureOverlay_.getSource().hasFeature(feature)) { if (remove || toggle) { deselected.push(feature); this.removeFeatureLayerAssociation_(feature); diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index 21e2112775..8a40546170 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -739,6 +739,16 @@ ol.source.Vector.prototype.handleFeatureChange_ = function(event) { }; +/** + * @param {ol.Feature} feature Feature. + * @return {boolean} Feature is in source. + */ +ol.source.Vector.prototype.hasFeature = function(feature) { + var id = feature.getId(); + return id ? id in this.idIndex_ : goog.getUid(feature) in this.undefIdIndex_; +}; + + /** * @return {boolean} Is empty. */ diff --git a/test/spec/ol/interaction/selectinteraction.test.js b/test/spec/ol/interaction/selectinteraction.test.js index 4feac188ac..e032b3f28c 100644 --- a/test/spec/ol/interaction/selectinteraction.test.js +++ b/test/spec/ol/interaction/selectinteraction.test.js @@ -158,6 +158,38 @@ describe('ol.interaction.Select', function() { }); }); + describe('toggle selecting polygons', function() { + var select; + + beforeEach(function() { + select = new ol.interaction.Select({ + multi: true + }); + map.addInteraction(select); + }); + + it('with SHIFT + single-click', function() { + var listenerSpy = sinon.spy(); + select.on('select', listenerSpy); + + simulateEvent(ol.MapBrowserEvent.EventType.SINGLECLICK, 10, -20, true); + + expect(listenerSpy.callCount).to.be(1); + + var features = select.getFeatures(); + expect(features.getLength()).to.equal(4); + + map.renderSync(); + + simulateEvent(ol.MapBrowserEvent.EventType.SINGLECLICK, 10, -20, true); + + expect(listenerSpy.callCount).to.be(2); + + features = select.getFeatures(); + expect(features.getLength()).to.equal(0); + }); + }); + describe('filter features using the filter option', function() { describe('with multi set to true', function() {