@deck.gl-community/editable-layers 9.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +14 -0
- package/dist/curve-utils.d.ts +2 -0
- package/dist/curve-utils.js +61 -0
- package/dist/edit-modes/composite-mode.d.ts +14 -0
- package/dist/edit-modes/composite-mode.js +47 -0
- package/dist/edit-modes/draw-90degree-polygon-mode.d.ts +11 -0
- package/dist/edit-modes/draw-90degree-polygon-mode.js +179 -0
- package/dist/edit-modes/draw-circle-by-diameter-mode.d.ts +24 -0
- package/dist/edit-modes/draw-circle-by-diameter-mode.js +78 -0
- package/dist/edit-modes/draw-circle-from-center-mode.d.ts +22 -0
- package/dist/edit-modes/draw-circle-from-center-mode.js +70 -0
- package/dist/edit-modes/draw-ellipse-by-bounding-box-mode.d.ts +5 -0
- package/dist/edit-modes/draw-ellipse-by-bounding-box-mode.js +20 -0
- package/dist/edit-modes/draw-ellipse-using-three-points-mode.d.ts +5 -0
- package/dist/edit-modes/draw-ellipse-using-three-points-mode.js +16 -0
- package/dist/edit-modes/draw-line-string-mode.d.ts +25 -0
- package/dist/edit-modes/draw-line-string-mode.js +170 -0
- package/dist/edit-modes/draw-point-mode.d.ts +8 -0
- package/dist/edit-modes/draw-point-mode.js +28 -0
- package/dist/edit-modes/draw-polygon-by-dragging-mode.d.ts +14 -0
- package/dist/edit-modes/draw-polygon-by-dragging-mode.js +87 -0
- package/dist/edit-modes/draw-polygon-mode.d.ts +10 -0
- package/dist/edit-modes/draw-polygon-mode.js +143 -0
- package/dist/edit-modes/draw-rectangle-from-center-mode.d.ts +5 -0
- package/dist/edit-modes/draw-rectangle-from-center-mode.js +17 -0
- package/dist/edit-modes/draw-rectangle-mode.d.ts +5 -0
- package/dist/edit-modes/draw-rectangle-mode.js +11 -0
- package/dist/edit-modes/draw-rectangle-using-three-points-mode.d.ts +5 -0
- package/dist/edit-modes/draw-rectangle-using-three-points-mode.js +28 -0
- package/dist/edit-modes/draw-square-from-center-mode.d.ts +5 -0
- package/dist/edit-modes/draw-square-from-center-mode.js +35 -0
- package/dist/edit-modes/draw-square-mode.d.ts +5 -0
- package/dist/edit-modes/draw-square-mode.js +28 -0
- package/dist/edit-modes/duplicate-mode.d.ts +7 -0
- package/dist/edit-modes/duplicate-mode.js +17 -0
- package/dist/edit-modes/edit-mode.d.ts +11 -0
- package/dist/edit-modes/edit-mode.js +2 -0
- package/dist/edit-modes/elevation-mode.d.ts +13 -0
- package/dist/edit-modes/elevation-mode.js +49 -0
- package/dist/edit-modes/extend-line-string-mode.d.ts +9 -0
- package/dist/edit-modes/extend-line-string-mode.js +72 -0
- package/dist/edit-modes/extrude-mode.d.ts +15 -0
- package/dist/edit-modes/extrude-mode.js +186 -0
- package/dist/edit-modes/geojson-edit-mode.d.ts +33 -0
- package/dist/edit-modes/geojson-edit-mode.js +208 -0
- package/dist/edit-modes/immutable-feature-collection.d.ts +43 -0
- package/dist/edit-modes/immutable-feature-collection.js +300 -0
- package/dist/edit-modes/measure-angle-mode.d.ts +11 -0
- package/dist/edit-modes/measure-angle-mode.js +99 -0
- package/dist/edit-modes/measure-area-mode.d.ts +8 -0
- package/dist/edit-modes/measure-area-mode.js +50 -0
- package/dist/edit-modes/measure-distance-mode.d.ts +19 -0
- package/dist/edit-modes/measure-distance-mode.js +171 -0
- package/dist/edit-modes/modify-mode.d.ts +15 -0
- package/dist/edit-modes/modify-mode.js +203 -0
- package/dist/edit-modes/resize-circle-mode.d.ts +16 -0
- package/dist/edit-modes/resize-circle-mode.js +142 -0
- package/dist/edit-modes/rotate-mode.d.ts +17 -0
- package/dist/edit-modes/rotate-mode.js +151 -0
- package/dist/edit-modes/scale-mode.d.ts +27 -0
- package/dist/edit-modes/scale-mode.js +173 -0
- package/dist/edit-modes/snappable-mode.d.ts +21 -0
- package/dist/edit-modes/snappable-mode.js +109 -0
- package/dist/edit-modes/split-polygon-mode.d.ts +10 -0
- package/dist/edit-modes/split-polygon-mode.js +164 -0
- package/dist/edit-modes/three-click-polygon-mode.d.ts +10 -0
- package/dist/edit-modes/three-click-polygon-mode.js +72 -0
- package/dist/edit-modes/transform-mode.d.ts +9 -0
- package/dist/edit-modes/transform-mode.js +63 -0
- package/dist/edit-modes/translate-mode.d.ts +13 -0
- package/dist/edit-modes/translate-mode.js +113 -0
- package/dist/edit-modes/two-click-polygon-mode.d.ts +13 -0
- package/dist/edit-modes/two-click-polygon-mode.js +93 -0
- package/dist/edit-modes/types.d.ts +86 -0
- package/dist/edit-modes/types.js +1 -0
- package/dist/edit-modes/utils.d.ts +36 -0
- package/dist/edit-modes/utils.js +381 -0
- package/dist/edit-modes/view-mode.d.ts +3 -0
- package/dist/edit-modes/view-mode.js +3 -0
- package/dist/editable-layers/editable-geojson-layer.d.ts +98 -0
- package/dist/editable-layers/editable-geojson-layer.js +450 -0
- package/dist/editable-layers/editable-h3-cluster-layer.d.ts +34 -0
- package/dist/editable-layers/editable-h3-cluster-layer.js +164 -0
- package/dist/editable-layers/editable-layer.d.ts +49 -0
- package/dist/editable-layers/editable-layer.js +195 -0
- package/dist/editable-layers/editable-path-layer.d.ts +9 -0
- package/dist/editable-layers/editable-path-layer.js +34 -0
- package/dist/editable-layers/elevated-edit-handle-layer.d.ts +7 -0
- package/dist/editable-layers/elevated-edit-handle-layer.js +24 -0
- package/dist/editable-layers/junction-scatterplot-layer.d.ts +14 -0
- package/dist/editable-layers/junction-scatterplot-layer.js +41 -0
- package/dist/editable-layers/path-marker-layer/arrow-2d-geometry.d.ts +4 -0
- package/dist/editable-layers/path-marker-layer/arrow-2d-geometry.js +55 -0
- package/dist/editable-layers/path-marker-layer/create-path-markers.d.ts +16 -0
- package/dist/editable-layers/path-marker-layer/create-path-markers.js +75 -0
- package/dist/editable-layers/path-marker-layer/path-marker-layer.d.ts +40 -0
- package/dist/editable-layers/path-marker-layer/path-marker-layer.js +121 -0
- package/dist/editable-layers/path-marker-layer/polyline.d.ts +18 -0
- package/dist/editable-layers/path-marker-layer/polyline.js +37 -0
- package/dist/editable-layers/path-outline-layer/path-outline-layer.d.ts +26 -0
- package/dist/editable-layers/path-outline-layer/path-outline-layer.js +106 -0
- package/dist/editable-layers/selection-layer.d.ts +26 -0
- package/dist/editable-layers/selection-layer.js +167 -0
- package/dist/geojson-types.d.ts +58 -0
- package/dist/geojson-types.js +2 -0
- package/dist/index.cjs +5825 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.js +62 -0
- package/dist/lib/constants.d.ts +6 -0
- package/dist/lib/constants.js +6 -0
- package/dist/lib/deck-renderer/deck-cache.d.ts +14 -0
- package/dist/lib/deck-renderer/deck-cache.js +51 -0
- package/dist/lib/deck-renderer/deck-drawer.d.ts +63 -0
- package/dist/lib/deck-renderer/deck-drawer.js +232 -0
- package/dist/lib/feature.d.ts +10 -0
- package/dist/lib/feature.js +16 -0
- package/dist/lib/layer-mouse-event.d.ts +11 -0
- package/dist/lib/layer-mouse-event.js +24 -0
- package/dist/lib/layers/junctions-layer.d.ts +8 -0
- package/dist/lib/layers/junctions-layer.js +33 -0
- package/dist/lib/layers/segments-layer.d.ts +18 -0
- package/dist/lib/layers/segments-layer.js +94 -0
- package/dist/lib/layers/texts-layer.d.ts +8 -0
- package/dist/lib/layers/texts-layer.js +32 -0
- package/dist/lib/math.d.ts +11 -0
- package/dist/lib/math.js +22 -0
- package/dist/lib/nebula-layer.d.ts +13 -0
- package/dist/lib/nebula-layer.js +26 -0
- package/dist/lib/nebula.d.ts +34 -0
- package/dist/lib/nebula.js +254 -0
- package/dist/lib/style.d.ts +19 -0
- package/dist/lib/style.js +20 -0
- package/dist/memoize.d.ts +6 -0
- package/dist/memoize.js +40 -0
- package/dist/mode-handlers/composite-mode-handler.d.ts +24 -0
- package/dist/mode-handlers/composite-mode-handler.js +55 -0
- package/dist/mode-handlers/draw-90degree-polygon-handler.d.ts +13 -0
- package/dist/mode-handlers/draw-90degree-polygon-handler.js +169 -0
- package/dist/mode-handlers/draw-circle-by-bounding-box-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-circle-by-bounding-box-handler.js +29 -0
- package/dist/mode-handlers/draw-circle-from-center-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-circle-from-center-handler.js +27 -0
- package/dist/mode-handlers/draw-ellipse-by-bounding-box-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-ellipse-by-bounding-box-handler.js +30 -0
- package/dist/mode-handlers/draw-ellipse-using-three-points-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-ellipse-using-three-points-handler.js +37 -0
- package/dist/mode-handlers/draw-line-string-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-line-string-handler.js +83 -0
- package/dist/mode-handlers/draw-point-handler.d.ts +5 -0
- package/dist/mode-handlers/draw-point-handler.js +11 -0
- package/dist/mode-handlers/draw-polygon-handler.d.ts +11 -0
- package/dist/mode-handlers/draw-polygon-handler.js +92 -0
- package/dist/mode-handlers/draw-rectangle-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-rectangle-handler.js +18 -0
- package/dist/mode-handlers/draw-rectangle-using-three-points-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-rectangle-using-three-points-handler.js +49 -0
- package/dist/mode-handlers/duplicate-handler.d.ts +9 -0
- package/dist/mode-handlers/duplicate-handler.js +19 -0
- package/dist/mode-handlers/elevation-handler.d.ts +19 -0
- package/dist/mode-handlers/elevation-handler.js +48 -0
- package/dist/mode-handlers/extrude-handler.d.ts +18 -0
- package/dist/mode-handlers/extrude-handler.js +176 -0
- package/dist/mode-handlers/mode-handler.d.ts +61 -0
- package/dist/mode-handlers/mode-handler.js +286 -0
- package/dist/mode-handlers/modify-handler.d.ts +19 -0
- package/dist/mode-handlers/modify-handler.js +193 -0
- package/dist/mode-handlers/rotate-handler.d.ts +17 -0
- package/dist/mode-handlers/rotate-handler.js +74 -0
- package/dist/mode-handlers/scale-handler.d.ts +17 -0
- package/dist/mode-handlers/scale-handler.js +76 -0
- package/dist/mode-handlers/snappable-handler.d.ts +33 -0
- package/dist/mode-handlers/snappable-handler.js +133 -0
- package/dist/mode-handlers/split-polygon-handler.d.ts +11 -0
- package/dist/mode-handlers/split-polygon-handler.js +154 -0
- package/dist/mode-handlers/three-click-polygon-handler.d.ts +5 -0
- package/dist/mode-handlers/three-click-polygon-handler.js +18 -0
- package/dist/mode-handlers/translate-handler.d.ts +17 -0
- package/dist/mode-handlers/translate-handler.js +72 -0
- package/dist/mode-handlers/two-click-polygon-handler.d.ts +5 -0
- package/dist/mode-handlers/two-click-polygon-handler.js +18 -0
- package/dist/mode-handlers/view-handler.d.ts +8 -0
- package/dist/mode-handlers/view-handler.js +10 -0
- package/dist/shaderlib/color/color.d.ts +8 -0
- package/dist/shaderlib/color/color.js +51 -0
- package/dist/shaderlib/outline/outline.d.ts +8 -0
- package/dist/shaderlib/outline/outline.js +97 -0
- package/dist/shaderlib/utils/utils.d.ts +8 -0
- package/dist/shaderlib/utils/utils.js +28 -0
- package/dist/translateFromCenter.d.ts +4 -0
- package/dist/translateFromCenter.js +19 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +20 -0
- package/dist/utils.js +144 -0
- package/package.json +84 -0
- package/src/constants.ts +15 -0
- package/src/curve-utils.ts +77 -0
- package/src/edit-modes/composite-mode.ts +74 -0
- package/src/edit-modes/draw-90degree-polygon-mode.ts +220 -0
- package/src/edit-modes/draw-circle-by-diameter-mode.ts +88 -0
- package/src/edit-modes/draw-circle-from-center-mode.ts +79 -0
- package/src/edit-modes/draw-ellipse-by-bounding-box-mode.ts +25 -0
- package/src/edit-modes/draw-ellipse-using-three-points-mode.ts +23 -0
- package/src/edit-modes/draw-line-string-mode.ts +200 -0
- package/src/edit-modes/draw-point-mode.ts +35 -0
- package/src/edit-modes/draw-polygon-by-dragging-mode.ts +106 -0
- package/src/edit-modes/draw-polygon-mode.ts +171 -0
- package/src/edit-modes/draw-rectangle-from-center-mode.ts +23 -0
- package/src/edit-modes/draw-rectangle-mode.ts +14 -0
- package/src/edit-modes/draw-rectangle-using-three-points-mode.ts +36 -0
- package/src/edit-modes/draw-square-from-center-mode.ts +46 -0
- package/src/edit-modes/draw-square-mode.ts +36 -0
- package/src/edit-modes/duplicate-mode.ts +21 -0
- package/src/edit-modes/edit-mode.ts +30 -0
- package/src/edit-modes/elevation-mode.ts +86 -0
- package/src/edit-modes/extend-line-string-mode.ts +87 -0
- package/src/edit-modes/extrude-mode.ts +254 -0
- package/src/edit-modes/geojson-edit-mode.ts +283 -0
- package/src/edit-modes/immutable-feature-collection.ts +417 -0
- package/src/edit-modes/measure-angle-mode.ts +127 -0
- package/src/edit-modes/measure-area-mode.ts +62 -0
- package/src/edit-modes/measure-distance-mode.ts +215 -0
- package/src/edit-modes/modify-mode.ts +293 -0
- package/src/edit-modes/resize-circle-mode.ts +202 -0
- package/src/edit-modes/rotate-mode.ts +208 -0
- package/src/edit-modes/scale-mode.ts +231 -0
- package/src/edit-modes/snappable-mode.ts +174 -0
- package/src/edit-modes/split-polygon-mode.ts +201 -0
- package/src/edit-modes/three-click-polygon-mode.ts +111 -0
- package/src/edit-modes/transform-mode.ts +75 -0
- package/src/edit-modes/translate-mode.ts +161 -0
- package/src/edit-modes/two-click-polygon-mode.ts +132 -0
- package/src/edit-modes/types.ts +135 -0
- package/src/edit-modes/utils.ts +513 -0
- package/src/edit-modes/view-mode.ts +3 -0
- package/src/editable-layers/editable-geojson-layer.ts +603 -0
- package/src/editable-layers/editable-h3-cluster-layer.ts +226 -0
- package/src/editable-layers/editable-layer.ts +252 -0
- package/src/editable-layers/editable-path-layer.ts +51 -0
- package/src/editable-layers/elevated-edit-handle-layer.ts +33 -0
- package/src/editable-layers/junction-scatterplot-layer.ts +53 -0
- package/src/editable-layers/path-marker-layer/arrow-2d-geometry.ts +61 -0
- package/src/editable-layers/path-marker-layer/create-path-markers.ts +107 -0
- package/src/editable-layers/path-marker-layer/path-marker-layer.ts +179 -0
- package/src/editable-layers/path-marker-layer/polyline.ts +40 -0
- package/src/editable-layers/path-outline-layer/path-outline-layer.ts +147 -0
- package/src/editable-layers/selection-layer.ts +209 -0
- package/src/geojson-types.ts +89 -0
- package/src/index.ts +125 -0
- package/src/lib/constants.ts +6 -0
- package/src/lib/deck-renderer/deck-cache.ts +61 -0
- package/src/lib/deck-renderer/deck-drawer.ts +263 -0
- package/src/lib/feature.ts +27 -0
- package/src/lib/layer-mouse-event.ts +32 -0
- package/src/lib/layers/junctions-layer.ts +40 -0
- package/src/lib/layers/segments-layer.ts +108 -0
- package/src/lib/layers/texts-layer.ts +43 -0
- package/src/lib/math.ts +26 -0
- package/src/lib/nebula-layer.ts +33 -0
- package/src/lib/nebula.ts +323 -0
- package/src/lib/style.ts +22 -0
- package/src/memoize.ts +43 -0
- package/src/mode-handlers/composite-mode-handler.ts +89 -0
- package/src/mode-handlers/draw-90degree-polygon-handler.ts +201 -0
- package/src/mode-handlers/draw-circle-by-bounding-box-handler.ts +39 -0
- package/src/mode-handlers/draw-circle-from-center-handler.ts +38 -0
- package/src/mode-handlers/draw-ellipse-by-bounding-box-handler.ts +41 -0
- package/src/mode-handlers/draw-ellipse-using-three-points-handler.ts +46 -0
- package/src/mode-handlers/draw-line-string-handler.ts +108 -0
- package/src/mode-handlers/draw-point-handler.ts +15 -0
- package/src/mode-handlers/draw-polygon-handler.ts +121 -0
- package/src/mode-handlers/draw-rectangle-handler.ts +28 -0
- package/src/mode-handlers/draw-rectangle-using-three-points-handler.ts +60 -0
- package/src/mode-handlers/duplicate-handler.ts +25 -0
- package/src/mode-handlers/elevation-handler.ts +88 -0
- package/src/mode-handlers/extrude-handler.ts +245 -0
- package/src/mode-handlers/mode-handler.ts +394 -0
- package/src/mode-handlers/modify-handler.ts +263 -0
- package/src/mode-handlers/rotate-handler.ts +107 -0
- package/src/mode-handlers/scale-handler.ts +105 -0
- package/src/mode-handlers/snappable-handler.ts +184 -0
- package/src/mode-handlers/split-polygon-handler.ts +177 -0
- package/src/mode-handlers/three-click-polygon-handler.ts +25 -0
- package/src/mode-handlers/translate-handler.ts +110 -0
- package/src/mode-handlers/two-click-polygon-handler.ts +25 -0
- package/src/mode-handlers/view-handler.ts +13 -0
- package/src/shaderlib/color/color.ts +56 -0
- package/src/shaderlib/outline/outline.ts +101 -0
- package/src/shaderlib/utils/utils.ts +33 -0
- package/src/translateFromCenter.ts +48 -0
- package/src/types.ts +39 -0
- package/src/utils.ts +185 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import nearestPointOnLine from '@turf/nearest-point-on-line';
|
|
2
|
+
import { point, lineString as toLineString } from '@turf/helpers';
|
|
3
|
+
import { recursivelyTraverseNestedArrays, nearestPointOnProjectedLine, } from '../utils';
|
|
4
|
+
import { ModeHandler, getPickedEditHandle, getEditHandlesForGeometry, } from './mode-handler';
|
|
5
|
+
// TODO edit-modes: delete handlers once EditMode fully implemented
|
|
6
|
+
export class ModifyHandler extends ModeHandler {
|
|
7
|
+
_lastPointerMovePicks;
|
|
8
|
+
getEditHandles(picks, mapCoords) {
|
|
9
|
+
let handles = [];
|
|
10
|
+
const { features } = this.featureCollection.getObject();
|
|
11
|
+
for (const index of this.getSelectedFeatureIndexes()) {
|
|
12
|
+
if (index < features.length) {
|
|
13
|
+
const { geometry } = features[index];
|
|
14
|
+
handles.push(...getEditHandlesForGeometry(geometry, index));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.warn(`selectedFeatureIndexes out of range ${index}`); // eslint-disable-line no-console,no-undef
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// intermediate edit handle
|
|
21
|
+
if (picks && picks.length && mapCoords) {
|
|
22
|
+
const existingEditHandle = picks.find((pick) => pick.isEditingHandle && pick.object && pick.object.type === 'existing');
|
|
23
|
+
// don't show intermediate point when too close to an existing edit handle
|
|
24
|
+
const featureAsPick = !existingEditHandle && picks.find((pick) => !pick.isEditingHandle);
|
|
25
|
+
// is the feature in the pick selected
|
|
26
|
+
if (featureAsPick &&
|
|
27
|
+
!featureAsPick.object.geometry.type.includes('Point') &&
|
|
28
|
+
this.getSelectedFeatureIndexes().includes(featureAsPick.index)) {
|
|
29
|
+
let intermediatePoint = null;
|
|
30
|
+
let positionIndexPrefix = [];
|
|
31
|
+
const referencePoint = point(mapCoords);
|
|
32
|
+
// process all lines of the (single) feature
|
|
33
|
+
recursivelyTraverseNestedArrays(featureAsPick.object.geometry.coordinates, [], (lineString, prefix) => {
|
|
34
|
+
const lineStringFeature = toLineString(lineString);
|
|
35
|
+
const candidateIntermediatePoint = this.nearestPointOnLine(
|
|
36
|
+
// @ts-expect-error turf type diff
|
|
37
|
+
lineStringFeature, referencePoint);
|
|
38
|
+
if (!intermediatePoint ||
|
|
39
|
+
candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist) {
|
|
40
|
+
intermediatePoint = candidateIntermediatePoint;
|
|
41
|
+
positionIndexPrefix = prefix;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
// tack on the lone intermediate point to the set of handles
|
|
45
|
+
if (intermediatePoint) {
|
|
46
|
+
const { geometry: { coordinates: position }, properties: { index }, } = intermediatePoint;
|
|
47
|
+
handles = [
|
|
48
|
+
...handles,
|
|
49
|
+
{
|
|
50
|
+
position,
|
|
51
|
+
positionIndexes: [...positionIndexPrefix, index + 1],
|
|
52
|
+
featureIndex: featureAsPick.index,
|
|
53
|
+
type: 'intermediate',
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return handles;
|
|
60
|
+
}
|
|
61
|
+
// turf.js does not support elevation for nearestPointOnLine
|
|
62
|
+
nearestPointOnLine(line, inPoint) {
|
|
63
|
+
const { coordinates } = line.geometry;
|
|
64
|
+
if (coordinates.some((coord) => coord.length > 2)) {
|
|
65
|
+
const modeConfig = this.getModeConfig();
|
|
66
|
+
if (modeConfig && modeConfig.viewport) {
|
|
67
|
+
// This line has elevation, we need to use alternative algorithm
|
|
68
|
+
return nearestPointOnProjectedLine(line, inPoint, modeConfig.viewport);
|
|
69
|
+
}
|
|
70
|
+
// eslint-disable-next-line no-console,no-undef
|
|
71
|
+
console.log('Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.');
|
|
72
|
+
}
|
|
73
|
+
// @ts-expect-error geojson types diff
|
|
74
|
+
return nearestPointOnLine(line, inPoint);
|
|
75
|
+
}
|
|
76
|
+
handleClick(event) {
|
|
77
|
+
let editAction = null;
|
|
78
|
+
const clickedEditHandle = getPickedEditHandle(event.picks);
|
|
79
|
+
if (clickedEditHandle && clickedEditHandle.featureIndex >= 0) {
|
|
80
|
+
if (clickedEditHandle.type === 'existing') {
|
|
81
|
+
let updatedData;
|
|
82
|
+
try {
|
|
83
|
+
updatedData = this.getImmutableFeatureCollection()
|
|
84
|
+
.removePosition(clickedEditHandle.featureIndex, clickedEditHandle.positionIndexes)
|
|
85
|
+
.getObject();
|
|
86
|
+
}
|
|
87
|
+
catch (ignored) {
|
|
88
|
+
// This happens if user attempts to remove the last point
|
|
89
|
+
}
|
|
90
|
+
if (updatedData) {
|
|
91
|
+
editAction = {
|
|
92
|
+
updatedData,
|
|
93
|
+
editType: 'removePosition',
|
|
94
|
+
featureIndexes: [clickedEditHandle.featureIndex],
|
|
95
|
+
editContext: {
|
|
96
|
+
positionIndexes: clickedEditHandle.positionIndexes,
|
|
97
|
+
position: clickedEditHandle.position,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (clickedEditHandle.type === 'intermediate') {
|
|
103
|
+
const updatedData = this.getImmutableFeatureCollection()
|
|
104
|
+
.addPosition(clickedEditHandle.featureIndex, clickedEditHandle.positionIndexes, clickedEditHandle.position)
|
|
105
|
+
.getObject();
|
|
106
|
+
if (updatedData) {
|
|
107
|
+
editAction = {
|
|
108
|
+
updatedData,
|
|
109
|
+
editType: 'addPosition',
|
|
110
|
+
featureIndexes: [clickedEditHandle.featureIndex],
|
|
111
|
+
editContext: {
|
|
112
|
+
positionIndexes: clickedEditHandle.positionIndexes,
|
|
113
|
+
position: clickedEditHandle.position,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return editAction;
|
|
120
|
+
}
|
|
121
|
+
handlePointerMove(event) {
|
|
122
|
+
this._lastPointerMovePicks = event.picks;
|
|
123
|
+
let editAction = null;
|
|
124
|
+
const editHandle = getPickedEditHandle(event.pointerDownPicks);
|
|
125
|
+
if (event.isDragging && editHandle) {
|
|
126
|
+
const updatedData = this.getImmutableFeatureCollection()
|
|
127
|
+
.replacePosition(editHandle.featureIndex, editHandle.positionIndexes, event.mapCoords)
|
|
128
|
+
.getObject();
|
|
129
|
+
editAction = {
|
|
130
|
+
updatedData,
|
|
131
|
+
editType: 'movePosition',
|
|
132
|
+
featureIndexes: [editHandle.featureIndex],
|
|
133
|
+
editContext: {
|
|
134
|
+
positionIndexes: editHandle.positionIndexes,
|
|
135
|
+
position: event.mapCoords,
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Cancel map panning if pointer went down on an edit handle
|
|
140
|
+
const cancelMapPan = Boolean(editHandle);
|
|
141
|
+
return { editAction, cancelMapPan };
|
|
142
|
+
}
|
|
143
|
+
handleStartDragging(event) {
|
|
144
|
+
let editAction = null;
|
|
145
|
+
const selectedFeatureIndexes = this.getSelectedFeatureIndexes();
|
|
146
|
+
const editHandle = getPickedEditHandle(event.picks);
|
|
147
|
+
if (selectedFeatureIndexes.length && editHandle && editHandle.type === 'intermediate') {
|
|
148
|
+
const updatedData = this.getImmutableFeatureCollection()
|
|
149
|
+
.addPosition(editHandle.featureIndex, editHandle.positionIndexes, event.mapCoords)
|
|
150
|
+
.getObject();
|
|
151
|
+
editAction = {
|
|
152
|
+
updatedData,
|
|
153
|
+
editType: 'addPosition',
|
|
154
|
+
featureIndexes: [editHandle.featureIndex],
|
|
155
|
+
editContext: {
|
|
156
|
+
positionIndexes: editHandle.positionIndexes,
|
|
157
|
+
position: event.mapCoords,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return editAction;
|
|
162
|
+
}
|
|
163
|
+
handleStopDragging(event) {
|
|
164
|
+
let editAction = null;
|
|
165
|
+
const selectedFeatureIndexes = this.getSelectedFeatureIndexes();
|
|
166
|
+
const editHandle = getPickedEditHandle(event.picks);
|
|
167
|
+
if (selectedFeatureIndexes.length && editHandle) {
|
|
168
|
+
const updatedData = this.getImmutableFeatureCollection()
|
|
169
|
+
.replacePosition(editHandle.featureIndex, editHandle.positionIndexes, event.mapCoords)
|
|
170
|
+
.getObject();
|
|
171
|
+
editAction = {
|
|
172
|
+
updatedData,
|
|
173
|
+
editType: 'finishMovePosition',
|
|
174
|
+
featureIndexes: [editHandle.featureIndex],
|
|
175
|
+
editContext: {
|
|
176
|
+
positionIndexes: editHandle.positionIndexes,
|
|
177
|
+
position: event.mapCoords,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return editAction;
|
|
182
|
+
}
|
|
183
|
+
getCursor({ isDragging }) {
|
|
184
|
+
const picks = this._lastPointerMovePicks;
|
|
185
|
+
if (picks && picks.length > 0) {
|
|
186
|
+
const handlePicked = picks.some((pick) => pick.isEditingHandle);
|
|
187
|
+
if (handlePicked) {
|
|
188
|
+
return 'cell';
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return isDragging ? 'grabbing' : 'grab';
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FeatureCollection, Position } from '../geojson-types';
|
|
2
|
+
import { PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
|
|
3
|
+
import { EditAction, ModeHandler } from './mode-handler';
|
|
4
|
+
export declare class RotateHandler extends ModeHandler {
|
|
5
|
+
_isRotatable: boolean;
|
|
6
|
+
_geometryBeingRotated: FeatureCollection | null | undefined;
|
|
7
|
+
handlePointerMove(event: PointerMoveEvent): {
|
|
8
|
+
editAction: EditAction | null | undefined;
|
|
9
|
+
cancelMapPan: boolean;
|
|
10
|
+
};
|
|
11
|
+
handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
|
|
12
|
+
handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
|
|
13
|
+
getCursor({ isDragging }: {
|
|
14
|
+
isDragging: boolean;
|
|
15
|
+
}): string;
|
|
16
|
+
getRotateAction(startDragPoint: Position, currentPoint: Position, editType: string): EditAction;
|
|
17
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import turfCentroid from '@turf/centroid';
|
|
2
|
+
import turfBearing from '@turf/bearing';
|
|
3
|
+
import turfTransformRotate from '@turf/transform-rotate';
|
|
4
|
+
import { ModeHandler } from './mode-handler';
|
|
5
|
+
// TODO edit-modes: delete handlers once EditMode fully implemented
|
|
6
|
+
export class RotateHandler extends ModeHandler {
|
|
7
|
+
_isRotatable = undefined;
|
|
8
|
+
_geometryBeingRotated;
|
|
9
|
+
handlePointerMove(event) {
|
|
10
|
+
let editAction = null;
|
|
11
|
+
this._isRotatable = Boolean(this._geometryBeingRotated) || this.isSelectionPicked(event.picks);
|
|
12
|
+
if (!this._isRotatable || !event.pointerDownMapCoords) {
|
|
13
|
+
// Nothing to do
|
|
14
|
+
return { editAction: null, cancelMapPan: false };
|
|
15
|
+
}
|
|
16
|
+
if (event.isDragging && this._geometryBeingRotated) {
|
|
17
|
+
// Rotate the geometry
|
|
18
|
+
editAction = this.getRotateAction(event.pointerDownMapCoords, event.mapCoords, 'rotating');
|
|
19
|
+
}
|
|
20
|
+
return { editAction, cancelMapPan: true };
|
|
21
|
+
}
|
|
22
|
+
handleStartDragging(event) {
|
|
23
|
+
if (!this._isRotatable) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
this._geometryBeingRotated = this.getSelectedFeaturesAsFeatureCollection();
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
handleStopDragging(event) {
|
|
30
|
+
let editAction = null;
|
|
31
|
+
if (this._geometryBeingRotated) {
|
|
32
|
+
// Rotate the geometry
|
|
33
|
+
editAction = this.getRotateAction(event.pointerDownMapCoords, event.mapCoords, 'rotated');
|
|
34
|
+
this._geometryBeingRotated = null;
|
|
35
|
+
}
|
|
36
|
+
return editAction;
|
|
37
|
+
}
|
|
38
|
+
getCursor({ isDragging }) {
|
|
39
|
+
if (this._isRotatable) {
|
|
40
|
+
// TODO: look at doing SVG cursors to get a better "rotate" cursor
|
|
41
|
+
return 'move';
|
|
42
|
+
}
|
|
43
|
+
return isDragging ? 'grabbing' : 'grab';
|
|
44
|
+
}
|
|
45
|
+
getRotateAction(startDragPoint, currentPoint, editType) {
|
|
46
|
+
const startPosition = startDragPoint;
|
|
47
|
+
// @ts-expect-error turf types diff
|
|
48
|
+
const centroid = turfCentroid(this._geometryBeingRotated);
|
|
49
|
+
// @ts-expect-error turf types diff
|
|
50
|
+
const angle = getRotationAngle(centroid, startPosition, currentPoint);
|
|
51
|
+
// @ts-expect-error turf type diff
|
|
52
|
+
const rotatedFeatures = turfTransformRotate(
|
|
53
|
+
// @ts-expect-error turf type diff
|
|
54
|
+
this._geometryBeingRotated, angle);
|
|
55
|
+
let updatedData = this.getImmutableFeatureCollection();
|
|
56
|
+
const selectedIndexes = this.getSelectedFeatureIndexes();
|
|
57
|
+
for (let i = 0; i < selectedIndexes.length; i++) {
|
|
58
|
+
const selectedIndex = selectedIndexes[i];
|
|
59
|
+
const movedFeature = rotatedFeatures.features[i];
|
|
60
|
+
updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
updatedData: updatedData.getObject(),
|
|
64
|
+
editType,
|
|
65
|
+
featureIndexes: selectedIndexes,
|
|
66
|
+
editContext: null,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function getRotationAngle(centroid, startDragPoint, currentPoint) {
|
|
71
|
+
const bearing1 = turfBearing(centroid, startDragPoint);
|
|
72
|
+
const bearing2 = turfBearing(centroid, currentPoint);
|
|
73
|
+
return bearing2 - bearing1;
|
|
74
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FeatureCollection, Position } from '../geojson-types';
|
|
2
|
+
import { PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
|
|
3
|
+
import { EditAction, ModeHandler } from './mode-handler';
|
|
4
|
+
export declare class ScaleHandler extends ModeHandler {
|
|
5
|
+
_isScalable: boolean;
|
|
6
|
+
_geometryBeingScaled: FeatureCollection | null | undefined;
|
|
7
|
+
handlePointerMove(event: PointerMoveEvent): {
|
|
8
|
+
editAction: EditAction | null | undefined;
|
|
9
|
+
cancelMapPan: boolean;
|
|
10
|
+
};
|
|
11
|
+
handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
|
|
12
|
+
handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
|
|
13
|
+
getCursor({ isDragging }: {
|
|
14
|
+
isDragging: boolean;
|
|
15
|
+
}): string;
|
|
16
|
+
getScaleAction(startDragPoint: Position, currentPoint: Position, editType: string): EditAction;
|
|
17
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import turfCentroid from '@turf/centroid';
|
|
2
|
+
import turfDistance from '@turf/distance';
|
|
3
|
+
import turfTransformScale from '@turf/transform-scale';
|
|
4
|
+
import { ModeHandler } from './mode-handler';
|
|
5
|
+
// TODO edit-modes: delete handlers once EditMode fully implemented
|
|
6
|
+
export class ScaleHandler extends ModeHandler {
|
|
7
|
+
_isScalable = undefined;
|
|
8
|
+
_geometryBeingScaled;
|
|
9
|
+
handlePointerMove(event) {
|
|
10
|
+
let editAction = null;
|
|
11
|
+
this._isScalable = Boolean(this._geometryBeingScaled) || this.isSelectionPicked(event.picks);
|
|
12
|
+
if (!this._isScalable || !event.pointerDownMapCoords) {
|
|
13
|
+
// Nothing to do
|
|
14
|
+
return { editAction: null, cancelMapPan: false };
|
|
15
|
+
}
|
|
16
|
+
if (event.isDragging && this._geometryBeingScaled) {
|
|
17
|
+
// Scale the geometry
|
|
18
|
+
editAction = this.getScaleAction(event.pointerDownMapCoords, event.mapCoords, 'scaling');
|
|
19
|
+
}
|
|
20
|
+
return { editAction, cancelMapPan: true };
|
|
21
|
+
}
|
|
22
|
+
handleStartDragging(event) {
|
|
23
|
+
if (!this._isScalable) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
this._geometryBeingScaled = this.getSelectedFeaturesAsFeatureCollection();
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
handleStopDragging(event) {
|
|
30
|
+
let editAction = null;
|
|
31
|
+
if (this._geometryBeingScaled) {
|
|
32
|
+
// Scale the geometry
|
|
33
|
+
editAction = this.getScaleAction(event.pointerDownMapCoords, event.mapCoords, 'scaled');
|
|
34
|
+
this._geometryBeingScaled = null;
|
|
35
|
+
}
|
|
36
|
+
return editAction;
|
|
37
|
+
}
|
|
38
|
+
getCursor({ isDragging }) {
|
|
39
|
+
if (this._isScalable) {
|
|
40
|
+
// TODO: look at doing SVG cursors to get a better "scale" cursor
|
|
41
|
+
return 'move';
|
|
42
|
+
}
|
|
43
|
+
return isDragging ? 'grabbing' : 'grab';
|
|
44
|
+
}
|
|
45
|
+
getScaleAction(startDragPoint, currentPoint, editType) {
|
|
46
|
+
const startPosition = startDragPoint;
|
|
47
|
+
// @ts-expect-error turf types diff
|
|
48
|
+
const centroid = turfCentroid(this._geometryBeingScaled);
|
|
49
|
+
// @ts-expect-error turf types diff
|
|
50
|
+
const factor = getScaleFactor(centroid, startPosition, currentPoint);
|
|
51
|
+
// @ts-expect-error turf type diff
|
|
52
|
+
const scaledFeatures = turfTransformScale(
|
|
53
|
+
// @ts-expect-error turf type diff
|
|
54
|
+
this._geometryBeingScaled, factor, {
|
|
55
|
+
origin: centroid,
|
|
56
|
+
});
|
|
57
|
+
let updatedData = this.getImmutableFeatureCollection();
|
|
58
|
+
const selectedIndexes = this.getSelectedFeatureIndexes();
|
|
59
|
+
for (let i = 0; i < selectedIndexes.length; i++) {
|
|
60
|
+
const selectedIndex = selectedIndexes[i];
|
|
61
|
+
const movedFeature = scaledFeatures.features[i];
|
|
62
|
+
updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
updatedData: updatedData.getObject(),
|
|
66
|
+
editType,
|
|
67
|
+
featureIndexes: selectedIndexes,
|
|
68
|
+
editContext: null,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function getScaleFactor(centroid, startDragPoint, currentPoint) {
|
|
73
|
+
const startDistance = turfDistance(centroid, startDragPoint);
|
|
74
|
+
const endDistance = turfDistance(centroid, currentPoint);
|
|
75
|
+
return endDistance / startDistance;
|
|
76
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Feature, FeatureCollection, Position } from '../geojson-types';
|
|
2
|
+
import { PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
|
|
3
|
+
import { EditHandle, EditAction, ModeHandler } from './mode-handler';
|
|
4
|
+
type HandlePicks = {
|
|
5
|
+
pickedHandle?: EditHandle;
|
|
6
|
+
potentialSnapHandle?: EditHandle;
|
|
7
|
+
};
|
|
8
|
+
export declare class SnappableHandler extends ModeHandler {
|
|
9
|
+
_handler: ModeHandler;
|
|
10
|
+
_editHandlePicks: HandlePicks | null | undefined;
|
|
11
|
+
_startDragSnapHandlePosition: Position;
|
|
12
|
+
constructor(handler: ModeHandler);
|
|
13
|
+
setFeatureCollection(featureCollection: FeatureCollection): void;
|
|
14
|
+
setModeConfig(modeConfig: any): void;
|
|
15
|
+
setSelectedFeatureIndexes(indexes: number[]): void;
|
|
16
|
+
_getSnappedMouseEvent(event: Record<string, any>, snapPoint: Position): PointerMoveEvent;
|
|
17
|
+
_getEditHandlePicks(event: PointerMoveEvent): HandlePicks;
|
|
18
|
+
_updatePickedHandlePosition(editAction: EditAction): void;
|
|
19
|
+
_getSnapTargets(): Feature[];
|
|
20
|
+
_getNonPickedIntermediateHandles(): EditHandle[];
|
|
21
|
+
getEditHandles(picks?: Array<Record<string, any>>, mapCoords?: Position): any[];
|
|
22
|
+
_getSnapAwareEvent(event: Record<string, any>): Record<string, any>;
|
|
23
|
+
handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
|
|
24
|
+
handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
|
|
25
|
+
getCursor(event: {
|
|
26
|
+
isDragging: boolean;
|
|
27
|
+
}): string;
|
|
28
|
+
handlePointerMove(event: PointerMoveEvent): {
|
|
29
|
+
editAction: EditAction | null | undefined;
|
|
30
|
+
cancelMapPan: boolean;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { ModeHandler, getPickedEditHandle, getEditHandlesForGeometry, } from './mode-handler';
|
|
2
|
+
// TODO edit-modes: delete handlers once EditMode fully implemented
|
|
3
|
+
export class SnappableHandler extends ModeHandler {
|
|
4
|
+
_handler;
|
|
5
|
+
_editHandlePicks;
|
|
6
|
+
_startDragSnapHandlePosition = undefined;
|
|
7
|
+
constructor(handler) {
|
|
8
|
+
super();
|
|
9
|
+
this._handler = handler;
|
|
10
|
+
}
|
|
11
|
+
setFeatureCollection(featureCollection) {
|
|
12
|
+
this._handler.setFeatureCollection(featureCollection);
|
|
13
|
+
}
|
|
14
|
+
setModeConfig(modeConfig) {
|
|
15
|
+
this._modeConfig = modeConfig;
|
|
16
|
+
this._handler.setModeConfig(modeConfig);
|
|
17
|
+
}
|
|
18
|
+
setSelectedFeatureIndexes(indexes) {
|
|
19
|
+
this._handler.setSelectedFeatureIndexes(indexes);
|
|
20
|
+
}
|
|
21
|
+
_getSnappedMouseEvent(event, snapPoint) {
|
|
22
|
+
// @ts-expect-error narrow event type
|
|
23
|
+
return Object.assign({}, event, {
|
|
24
|
+
mapCoords: snapPoint,
|
|
25
|
+
pointerDownMapCoords: this._startDragSnapHandlePosition,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
_getEditHandlePicks(event) {
|
|
29
|
+
const { picks } = event;
|
|
30
|
+
const potentialSnapHandle = picks.find((pick) => pick.object && pick.object.type === 'intermediate');
|
|
31
|
+
const handles = { potentialSnapHandle: potentialSnapHandle && potentialSnapHandle.object };
|
|
32
|
+
const pickedHandle = getPickedEditHandle(event.pointerDownPicks);
|
|
33
|
+
if (pickedHandle) {
|
|
34
|
+
return { ...handles, pickedHandle };
|
|
35
|
+
}
|
|
36
|
+
return handles;
|
|
37
|
+
}
|
|
38
|
+
_updatePickedHandlePosition(editAction) {
|
|
39
|
+
const { pickedHandle = {} } = this._editHandlePicks || {};
|
|
40
|
+
if (pickedHandle && editAction) {
|
|
41
|
+
const { featureIndexes, updatedData } = editAction;
|
|
42
|
+
for (let i = 0; i < featureIndexes.length; i++) {
|
|
43
|
+
const selectedIndex = featureIndexes[i];
|
|
44
|
+
const updatedFeature = updatedData.features[selectedIndex];
|
|
45
|
+
const { positionIndexes, featureIndex } = pickedHandle;
|
|
46
|
+
if (selectedIndex >= 0 && featureIndex === selectedIndex) {
|
|
47
|
+
const { coordinates } = updatedFeature.geometry;
|
|
48
|
+
pickedHandle.position = positionIndexes.reduce((a, b) => a[b], coordinates);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// If additionalSnapTargets is present in modeConfig and is populated, this
|
|
54
|
+
// method will return those features along with the features
|
|
55
|
+
// that live in the current layer. Otherwise, this method will simply return the
|
|
56
|
+
// features from the current layer
|
|
57
|
+
_getSnapTargets() {
|
|
58
|
+
let { additionalSnapTargets } = this.getModeConfig() || {};
|
|
59
|
+
additionalSnapTargets = additionalSnapTargets || [];
|
|
60
|
+
const features = [
|
|
61
|
+
...this._handler.featureCollection.getObject().features,
|
|
62
|
+
...additionalSnapTargets,
|
|
63
|
+
];
|
|
64
|
+
return features;
|
|
65
|
+
}
|
|
66
|
+
_getNonPickedIntermediateHandles() {
|
|
67
|
+
const handles = [];
|
|
68
|
+
const features = this._getSnapTargets();
|
|
69
|
+
for (let i = 0; i < features.length; i++) {
|
|
70
|
+
// Filter out the currently selected feature(s)
|
|
71
|
+
const isCurrentIndexFeatureNotSelected = i < features.length && !this._handler.getSelectedFeatureIndexes().includes(i);
|
|
72
|
+
if (isCurrentIndexFeatureNotSelected) {
|
|
73
|
+
const { geometry } = features[i];
|
|
74
|
+
handles.push(...getEditHandlesForGeometry(geometry, i, 'intermediate'));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return handles;
|
|
78
|
+
}
|
|
79
|
+
// If no snap handle has been picked, only display the edit handles of the
|
|
80
|
+
// selected feature. If a snap handle has been picked, display said snap handle
|
|
81
|
+
// along with all snappable points on all non-selected features.
|
|
82
|
+
getEditHandles(picks, mapCoords) {
|
|
83
|
+
const { enableSnapping } = this._modeConfig || {};
|
|
84
|
+
const handles = this._handler.getEditHandles(picks, mapCoords);
|
|
85
|
+
if (!enableSnapping)
|
|
86
|
+
return handles;
|
|
87
|
+
const { pickedHandle } = this._editHandlePicks || {};
|
|
88
|
+
if (pickedHandle) {
|
|
89
|
+
handles.push(...this._getNonPickedIntermediateHandles(), pickedHandle);
|
|
90
|
+
return handles;
|
|
91
|
+
}
|
|
92
|
+
const { features } = this._handler.featureCollection.getObject();
|
|
93
|
+
for (const index of this._handler.getSelectedFeatureIndexes()) {
|
|
94
|
+
if (index < features.length) {
|
|
95
|
+
const { geometry } = features[index];
|
|
96
|
+
handles.push(...getEditHandlesForGeometry(geometry, index, 'snap'));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return handles.filter(Boolean);
|
|
100
|
+
}
|
|
101
|
+
_getSnapAwareEvent(event) {
|
|
102
|
+
const { potentialSnapHandle } = this._editHandlePicks || {};
|
|
103
|
+
return potentialSnapHandle && potentialSnapHandle.position
|
|
104
|
+
? this._getSnappedMouseEvent(event, potentialSnapHandle.position)
|
|
105
|
+
: event;
|
|
106
|
+
}
|
|
107
|
+
handleStartDragging(event) {
|
|
108
|
+
this._startDragSnapHandlePosition = (getPickedEditHandle(event.picks) || {}).position;
|
|
109
|
+
return this._handler.handleStartDragging(event);
|
|
110
|
+
}
|
|
111
|
+
handleStopDragging(event) {
|
|
112
|
+
// @ts-expect-error narrow event type
|
|
113
|
+
const modeActionSummary = this._handler.handleStopDragging(this._getSnapAwareEvent(event));
|
|
114
|
+
this._editHandlePicks = null;
|
|
115
|
+
return modeActionSummary;
|
|
116
|
+
}
|
|
117
|
+
getCursor(event) {
|
|
118
|
+
return this._handler.getCursor(event);
|
|
119
|
+
}
|
|
120
|
+
handlePointerMove(event) {
|
|
121
|
+
const { enableSnapping } = this._handler.getModeConfig() || {};
|
|
122
|
+
if (enableSnapping) {
|
|
123
|
+
this._editHandlePicks = this._getEditHandlePicks(event);
|
|
124
|
+
}
|
|
125
|
+
// @ts-expect-error narrow event type
|
|
126
|
+
const modeActionSummary = this._handler.handlePointerMove(this._getSnapAwareEvent(event));
|
|
127
|
+
const { editAction } = modeActionSummary;
|
|
128
|
+
if (editAction) {
|
|
129
|
+
this._updatePickedHandlePosition(editAction);
|
|
130
|
+
}
|
|
131
|
+
return modeActionSummary;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EditAction, ModeHandler } from './mode-handler';
|
|
2
|
+
import { ClickEvent, PointerMoveEvent } from '../edit-modes/types';
|
|
3
|
+
export declare class SplitPolygonHandler extends ModeHandler {
|
|
4
|
+
calculateMapCoords(clickSequence: any, mapCoords: any): any;
|
|
5
|
+
handleClick(event: ClickEvent): EditAction | null | undefined;
|
|
6
|
+
handlePointerMove({ mapCoords }: PointerMoveEvent): {
|
|
7
|
+
editAction: EditAction | null | undefined;
|
|
8
|
+
cancelMapPan: boolean;
|
|
9
|
+
};
|
|
10
|
+
splitPolygon(): EditAction;
|
|
11
|
+
}
|