/* Copyright (c) 2016 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_TouchCursor from './TouchCursor.js'
import ol_interaction_ModifyFeature from './ModifyFeature.js'
import ol_style_Style from 'ol/style/Style.js';
import ol_style_Stroke from 'ol/style/Stroke.js';
import ol_style_RegularShape from 'ol/style/RegularShape.js';
/** TouchCursor interaction + ModifyFeature
* @constructor
* @extends {ol_interaction_TouchCursor}
* @param {olx.interaction.InteractionOptions} options Options
* @param {string} options.className cursor class name
* @param {ol.coordinate} options.coordinate cursor position
* @param {ol.source.Vector} options.source a source to modify (configured with useSpatialIndex set to true)
* @param {ol.source.Vector|Array
} options.sources a list of source to modify (configured with useSpatialIndex set to true)
* @param {ol.Collection.} options.features collection of feature to modify
* @param {function|undefined} options.filter a filter that takes a feature and return true if it can be modified, default always true.
* @param {number} pixelTolerance Pixel tolerance for considering the pointer close enough to a segment or vertex for editing, default 10
* @param {ol.style.Style | Array | undefined} options.style Style for the sketch features.
* @param {boolean} options.wrapX Wrap the world horizontally on the sketch overlay, default false
*/
var ol_interaction_TouchCursorModify = class olinteractionTouchCursorModify extends ol_interaction_TouchCursor {
constructor(options) {
options = options || {};
var drag = false; // enable drag
var dragging = false; // dragging a point
var del = false; // deleting a point
super({
className: ('disable ' + options.className).trim(),
coordinate: options.coordinate,
buttons: [{
// Dragging button
className: 'ol-button-move',
on: {
pointerdown: function () { drag = true; },
pointerup: function () { drag = false; }
}
}, {
// Add a new point to a line
className: 'ol-button-add',
click: function () {
dragging = true;
mod.handleDownEvent(self._lastEvent);
mod.handleUpEvent(self._lastEvent);
dragging = false;
}
}, {
// Remove a point
className: 'ol-button-remove',
click: function () {
del = true;
mod.handleDownEvent(self._lastEvent);
del = false;
}
}]
});
var self = this;
// Modify interaction
var mod = this._modify = new ol_interaction_ModifyFeature({
source: options.source,
sources: options.sources,
features: options.features,
pixelTolerance: options.pixelTolerance,
filter: options.filter,
style: options.style || [
new ol_style_Style({
image: new ol_style_RegularShape({
points: 4,
radius: 10,
radius2: 0,
stroke: new ol_style_Stroke({
color: [255, 255, 255, .5],
width: 3
})
})
}),
new ol_style_Style({
image: new ol_style_RegularShape({
points: 4,
radius: 10,
radius2: 0,
stroke: new ol_style_Stroke({
color: [0, 153, 255, 1],
width: 1.25
})
})
})
],
wrapX: options.wrapX,
condition: function (e) {
return e.dragging || dragging;
},
deleteCondition: function () {
return del;
}
});
// Show when modification is active
mod.on('select', function (e) {
if (e.selected.length) {
this.getOverlayElement().classList.remove('disable');
} else {
this.getOverlayElement().classList.add('disable');
}
}.bind(this));
// Handle dragging, prevent drag outside the control
this.on('dragstart', function () {
if (drag) {
mod.handleDownEvent(this._lastEvent);
}
}.bind(this));
this.on('dragging', function (e) {
if (drag)
mod.handleDragEvent(e);
});
this.on('dragend', function (e) {
mod.handleUpEvent(e);
drag = false;
});
}
/**
* Remove the interaction from its current map, if any, and attach it to a new
* map, if any. Pass `null` to just remove the interaction from the current map.
* @param {_ol_Map_} map Map.
* @api stable
*/
setMap(map) {
if (this.getMap()) {
this.getMap().removeInteraction(this._modify);
}
if (map) {
map.addInteraction(this._modify);
}
super.setMap(map);
}
/**
* Activate or deactivate the interaction.
* @param {boolean} active Active.
* @param {ol.coordinate|null} position position of the cursor (when activating), default viewport center.
* @observable
* @api
*/
setActive(b, position) {
super.setActive(b, position);
if (this._modify) this._modify.setActive(b);
}
/**
* Get the modify interaction.
* @retunr {ol.interaction.ModifyFeature}
* @observable
* @api
*/
getInteraction() {
return this._modify;
}
}
export default ol_interaction_TouchCursorModify