/* Copyright (c) 2018 Jean-Marc VIGLINO,
released under the CeCILL-B license (French BSD license)
(http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).
*/
import ol_interaction_Select from 'ol/interaction/Select.js'
import ol_source_Vector from 'ol/source/Vector.js'
/** A Select interaction to delete features on click.
* @constructor
* @extends {ol_interaction_Interaction}
* @fires deletestart
* @fires deleteend
* @param {Object} options ol.interaction.Select options
*/
var ol_interaction_Delete = class olinteractionDelete extends ol_interaction_Select {
constructor(options) {
super(options);
this.on('select', function (e) {
this.getFeatures().clear();
this.delete(e.selected);
}.bind(this));
}
/** Get vector source of the map
* @return {Array
}
*/
_getSources(layers) {
if (!this.getMap())
return [];
if (!layers)
layers = this.getMap().getLayers();
var sources = [];
layers.forEach(function (l) {
// LayerGroup
if (l.getLayers) {
sources = sources.concat(this._getSources(l.getLayers()));
} else {
if (l.getSource && l.getSource() instanceof ol_source_Vector) {
sources.push(l.getSource());
}
}
}.bind(this));
return sources;
}
/** Delete features: remove the features from the map (from all layers in the map)
* @param {ol.Collection|Array} features The features to delete
* @api
*/
delete(features) {
if (features && (features.length || features.getLength())) {
this.dispatchEvent({ type: 'deletestart', features: features });
var delFeatures = [];
// Get the sources concerned
this._getSources().forEach(function (source) {
try {
// Try to delete features in the source
features.forEach(function (f) {
source.removeFeature(f);
delFeatures.push(f);
});
} catch (e) { /* ok */ }
});
this.dispatchEvent({ type: 'deleteend', features: delFeatures });
}
}
}
export default ol_interaction_Delete