Merge pull request #10013 from tschaub/modify-interaction-tweaks

Minor reworking of the modify interaction
This commit is contained in:
Tim Schaub
2019-09-26 17:00:57 +02:00
committed by GitHub
+78 -46
View File
@@ -267,8 +267,7 @@ class Modify extends PointerInteraction {
useSpatialIndex: false, useSpatialIndex: false,
wrapX: !!options.wrapX wrapX: !!options.wrapX
}), }),
style: options.style ? options.style : style: options.style ? options.style : getDefaultStyleFunction(),
getDefaultStyleFunction(),
updateWhileAnimating: true, updateWhileAnimating: true,
updateWhileInteracting: true updateWhileInteracting: true
}); });
@@ -279,15 +278,15 @@ class Modify extends PointerInteraction {
* @type {!Object<string, function(Feature, import("../geom/Geometry.js").default): void>} * @type {!Object<string, function(Feature, import("../geom/Geometry.js").default): void>}
*/ */
this.SEGMENT_WRITERS_ = { this.SEGMENT_WRITERS_ = {
'Point': this.writePointGeometry_, 'Point': this.writePointGeometry_.bind(this),
'LineString': this.writeLineStringGeometry_, 'LineString': this.writeLineStringGeometry_.bind(this),
'LinearRing': this.writeLineStringGeometry_, 'LinearRing': this.writeLineStringGeometry_.bind(this),
'Polygon': this.writePolygonGeometry_, 'Polygon': this.writePolygonGeometry_.bind(this),
'MultiPoint': this.writeMultiPointGeometry_, 'MultiPoint': this.writeMultiPointGeometry_.bind(this),
'MultiLineString': this.writeMultiLineStringGeometry_, 'MultiLineString': this.writeMultiLineStringGeometry_.bind(this),
'MultiPolygon': this.writeMultiPolygonGeometry_, 'MultiPolygon': this.writeMultiPolygonGeometry_.bind(this),
'Circle': this.writeCircleGeometry_, 'Circle': this.writeCircleGeometry_.bind(this),
'GeometryCollection': this.writeGeometryCollectionGeometry_ 'GeometryCollection': this.writeGeometryCollectionGeometry_.bind(this)
}; };
@@ -334,8 +333,11 @@ class Modify extends PointerInteraction {
*/ */
addFeature_(feature) { addFeature_(feature) {
const geometry = feature.getGeometry(); const geometry = feature.getGeometry();
if (geometry && geometry.getType() in this.SEGMENT_WRITERS_) { if (geometry) {
this.SEGMENT_WRITERS_[geometry.getType()].call(this, feature, geometry); const writer = this.SEGMENT_WRITERS_[geometry.getType()];
if (writer) {
writer(feature, geometry);
}
} }
const map = this.getMap(); const map = this.getMap();
if (map && map.isRendered() && this.getActive()) { if (map && map.isRendered() && this.getActive()) {
@@ -351,8 +353,7 @@ class Modify extends PointerInteraction {
willModifyFeatures_(evt) { willModifyFeatures_(evt) {
if (!this.modified_) { if (!this.modified_) {
this.modified_ = true; this.modified_ = true;
this.dispatchEvent(new ModifyEvent( this.dispatchEvent(new ModifyEvent(ModifyEventType.MODIFYSTART, this.features_, evt));
ModifyEventType.MODIFYSTART, this.features_, evt));
} }
} }
@@ -362,8 +363,7 @@ class Modify extends PointerInteraction {
*/ */
removeFeature_(feature) { removeFeature_(feature) {
this.removeFeatureSegmentData_(feature); this.removeFeatureSegmentData_(feature);
// Remove the vertex feature if the collection of canditate features // Remove the vertex feature if the collection of canditate features is empty.
// is empty.
if (this.vertexFeature_ && this.features_.getLength() === 0) { if (this.vertexFeature_ && this.features_.getLength() === 0) {
this.overlay_.getSource().removeFeature(this.vertexFeature_); this.overlay_.getSource().removeFeature(this.vertexFeature_);
this.vertexFeature_ = null; this.vertexFeature_ = null;
@@ -377,7 +377,8 @@ class Modify extends PointerInteraction {
*/ */
removeFeatureSegmentData_(feature) { removeFeatureSegmentData_(feature) {
const rBush = this.rBush_; const rBush = this.rBush_;
const /** @type {Array<SegmentData>} */ nodesToRemove = []; /** @type {Array<SegmentData>} */
const nodesToRemove = [];
rBush.forEach( rBush.forEach(
/** /**
* @param {SegmentData} node RTree node. * @param {SegmentData} node RTree node.
@@ -482,11 +483,14 @@ class Modify extends PointerInteraction {
*/ */
writePointGeometry_(feature, geometry) { writePointGeometry_(feature, geometry) {
const coordinates = geometry.getCoordinates(); const coordinates = geometry.getCoordinates();
const segmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const segmentData = {
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
segment: [coordinates, coordinates] segment: [coordinates, coordinates]
}); };
this.rBush_.insert(geometry.getExtent(), segmentData); this.rBush_.insert(geometry.getExtent(), segmentData);
} }
@@ -499,13 +503,16 @@ class Modify extends PointerInteraction {
const points = geometry.getCoordinates(); const points = geometry.getCoordinates();
for (let i = 0, ii = points.length; i < ii; ++i) { for (let i = 0, ii = points.length; i < ii; ++i) {
const coordinates = points[i]; const coordinates = points[i];
const segmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const segmentData = {
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
depth: [i], depth: [i],
index: i, index: i,
segment: [coordinates, coordinates] segment: [coordinates, coordinates]
}); };
this.rBush_.insert(geometry.getExtent(), segmentData); this.rBush_.insert(geometry.getExtent(), segmentData);
} }
} }
@@ -519,12 +526,15 @@ class Modify extends PointerInteraction {
const coordinates = geometry.getCoordinates(); const coordinates = geometry.getCoordinates();
for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) { for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {
const segment = coordinates.slice(i, i + 2); const segment = coordinates.slice(i, i + 2);
const segmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const segmentData = {
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
index: i, index: i,
segment: segment segment: segment
}); };
this.rBush_.insert(boundingExtent(segment), segmentData); this.rBush_.insert(boundingExtent(segment), segmentData);
} }
} }
@@ -540,13 +550,16 @@ class Modify extends PointerInteraction {
const coordinates = lines[j]; const coordinates = lines[j];
for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) { for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {
const segment = coordinates.slice(i, i + 2); const segment = coordinates.slice(i, i + 2);
const segmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const segmentData = {
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
depth: [j], depth: [j],
index: i, index: i,
segment: segment segment: segment
}); };
this.rBush_.insert(boundingExtent(segment), segmentData); this.rBush_.insert(boundingExtent(segment), segmentData);
} }
} }
@@ -563,13 +576,16 @@ class Modify extends PointerInteraction {
const coordinates = rings[j]; const coordinates = rings[j];
for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) { for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {
const segment = coordinates.slice(i, i + 2); const segment = coordinates.slice(i, i + 2);
const segmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const segmentData = {
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
depth: [j], depth: [j],
index: i, index: i,
segment: segment segment: segment
}); };
this.rBush_.insert(boundingExtent(segment), segmentData); this.rBush_.insert(boundingExtent(segment), segmentData);
} }
} }
@@ -588,13 +604,16 @@ class Modify extends PointerInteraction {
const coordinates = rings[j]; const coordinates = rings[j];
for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) { for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {
const segment = coordinates.slice(i, i + 2); const segment = coordinates.slice(i, i + 2);
const segmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const segmentData = {
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
depth: [j, k], depth: [j, k],
index: i, index: i,
segment: segment segment: segment
}); };
this.rBush_.insert(boundingExtent(segment), segmentData); this.rBush_.insert(boundingExtent(segment), segmentData);
} }
} }
@@ -614,18 +633,23 @@ class Modify extends PointerInteraction {
*/ */
writeCircleGeometry_(feature, geometry) { writeCircleGeometry_(feature, geometry) {
const coordinates = geometry.getCenter(); const coordinates = geometry.getCenter();
const centerSegmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const centerSegmentData = {
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
index: CIRCLE_CENTER_INDEX, index: CIRCLE_CENTER_INDEX,
segment: [coordinates, coordinates] segment: [coordinates, coordinates]
}); };
const circumferenceSegmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const circumferenceSegmentData = {
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
index: CIRCLE_CIRCUMFERENCE_INDEX, index: CIRCLE_CIRCUMFERENCE_INDEX,
segment: [coordinates, coordinates] segment: [coordinates, coordinates]
}); };
const featureSegments = [centerSegmentData, circumferenceSegmentData]; const featureSegments = [centerSegmentData, circumferenceSegmentData];
centerSegmentData.featureSegments = circumferenceSegmentData.featureSegments = featureSegments; centerSegmentData.featureSegments = circumferenceSegmentData.featureSegments = featureSegments;
this.rBush_.insert(createOrUpdateFromCoordinate(coordinates), centerSegmentData); this.rBush_.insert(createOrUpdateFromCoordinate(coordinates), centerSegmentData);
@@ -640,7 +664,9 @@ class Modify extends PointerInteraction {
writeGeometryCollectionGeometry_(feature, geometry) { writeGeometryCollectionGeometry_(feature, geometry) {
const geometries = geometry.getGeometriesArray(); const geometries = geometry.getGeometriesArray();
for (let i = 0; i < geometries.length; ++i) { for (let i = 0; i < geometries.length; ++i) {
this.SEGMENT_WRITERS_[geometries[i].getType()].call(this, feature, geometries[i]); const geometry = geometries[i];
const writer = this.SEGMENT_WRITERS_[geometry.getType()];
writer(feature, geometry);
} }
} }
@@ -955,7 +981,7 @@ class Modify extends PointerInteraction {
const feature = segmentData.feature; const feature = segmentData.feature;
const geometry = segmentData.geometry; const geometry = segmentData.geometry;
const depth = segmentData.depth; const depth = segmentData.depth;
const index = /** @type {number} */ (segmentData.index); const index = segmentData.index;
let coordinates; let coordinates;
while (vertex.length < geometry.getStride()) { while (vertex.length < geometry.getStride()) {
@@ -987,24 +1013,28 @@ class Modify extends PointerInteraction {
const rTree = this.rBush_; const rTree = this.rBush_;
rTree.remove(segmentData); rTree.remove(segmentData);
this.updateSegmentIndices_(geometry, index, depth, 1); this.updateSegmentIndices_(geometry, index, depth, 1);
const newSegmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const newSegmentData = {
segment: [segment[0], vertex], segment: [segment[0], vertex],
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
depth: depth, depth: depth,
index: index index: index
}); };
rTree.insert(boundingExtent(newSegmentData.segment),
newSegmentData); rTree.insert(boundingExtent(newSegmentData.segment), newSegmentData);
this.dragSegments_.push([newSegmentData, 1]); this.dragSegments_.push([newSegmentData, 1]);
const newSegmentData2 = /** @type {SegmentData} */ ({ /** @type {SegmentData} */
const newSegmentData2 = {
segment: [vertex, segment[1]], segment: [vertex, segment[1]],
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
depth: depth, depth: depth,
index: index + 1 index: index + 1
}); };
rTree.insert(boundingExtent(newSegmentData2.segment), newSegmentData2); rTree.insert(boundingExtent(newSegmentData2.segment), newSegmentData2);
this.dragSegments_.push([newSegmentData2, 0]); this.dragSegments_.push([newSegmentData2, 0]);
this.ignoreNextSingleClick_ = true; this.ignoreNextSingleClick_ = true;
@@ -1123,15 +1153,17 @@ class Modify extends PointerInteraction {
segments.push(right.segment[1]); segments.push(right.segment[1]);
} }
if (left !== undefined && right !== undefined) { if (left !== undefined && right !== undefined) {
const newSegmentData = /** @type {SegmentData} */ ({
/** @type {SegmentData} */
const newSegmentData = {
depth: segmentData.depth, depth: segmentData.depth,
feature: segmentData.feature, feature: segmentData.feature,
geometry: segmentData.geometry, geometry: segmentData.geometry,
index: newIndex, index: newIndex,
segment: segments segment: segments
}); };
this.rBush_.insert(boundingExtent(newSegmentData.segment),
newSegmentData); this.rBush_.insert(boundingExtent(newSegmentData.segment), newSegmentData);
} }
this.updateSegmentIndices_(geometry, index, segmentData.depth, -1); this.updateSegmentIndices_(geometry, index, segmentData.depth, -1);
if (this.vertexFeature_) { if (this.vertexFeature_) {