Merge pull request #10013 from tschaub/modify-interaction-tweaks
Minor reworking of the modify interaction
This commit is contained in:
@@ -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_) {
|
||||||
|
|||||||
Reference in New Issue
Block a user