@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.0
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/CHANGELOG.md +1016 -2
- package/README.ja.md +39 -19
- package/README.md +41 -21
- package/dist/api/datasets.d.ts +258 -0
- package/dist/api/document.d.ts +66 -0
- package/dist/api/draw.d.ts +135 -0
- package/dist/api/draw.js +18 -0
- package/dist/api/drawing.d.ts +87 -0
- package/dist/api/errors.d.ts +35 -0
- package/dist/api/errors.js +35 -0
- package/dist/api/events.d.ts +306 -0
- package/dist/api/extension/context.d.ts +247 -0
- package/dist/api/extension/feature-type.d.ts +129 -0
- package/dist/api/extension/mode.d.ts +123 -0
- package/dist/api/extension/plugin.d.ts +51 -0
- package/dist/api/extension/plugin.js +3 -0
- package/dist/api/extension/provider.d.ts +119 -0
- package/dist/api/extension/provider.js +3 -0
- package/dist/api/extension/render.d.ts +176 -0
- package/dist/api/extension/render.js +3 -0
- package/dist/api/extension/store.d.ts +190 -0
- package/dist/api/extension/store.js +3 -0
- package/dist/api/extensions.d.ts +306 -0
- package/dist/api/extensions.js +3 -0
- package/dist/api/features.d.ts +188 -0
- package/dist/api/features.js +3 -0
- package/dist/api/groups.d.ts +111 -0
- package/dist/api/groups.js +3 -0
- package/dist/api/hidden.d.ts +45 -0
- package/dist/api/hidden.js +3 -0
- package/dist/api/impl/adapters.js +463 -0
- package/dist/api/impl/contexts.js +466 -0
- package/dist/api/impl/create-draw.js +124 -0
- package/dist/api/impl/datasets.js +404 -0
- package/dist/api/impl/destroy-guard.js +74 -0
- package/dist/api/impl/document.js +280 -0
- package/dist/api/impl/drawing.js +180 -0
- package/dist/api/impl/engine-context.d.ts +7 -0
- package/dist/api/{context.js → impl/engine-context.js} +49 -38
- package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
- package/dist/api/impl/events.js +422 -0
- package/dist/api/impl/extension-host.js +361 -0
- package/dist/api/impl/extensions.js +229 -0
- package/dist/api/impl/features.js +445 -0
- package/dist/api/impl/geometry/apply.d.ts +32 -0
- package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
- package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
- package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/split.js +10 -21
- package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
- package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
- package/dist/api/impl/geometry/types.js +3 -0
- package/dist/api/impl/groups.d.ts +3 -0
- package/dist/api/impl/groups.js +268 -0
- package/dist/api/impl/hidden.js +60 -0
- package/dist/api/impl/import-export/constants.d.ts +22 -0
- package/dist/api/impl/import-export/constants.js +24 -0
- package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
- package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
- package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
- package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
- package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
- package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
- package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
- package/dist/api/impl/import-export/image-import.d.ts +16 -0
- package/dist/api/impl/import-export/image-import.js +73 -0
- package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
- package/dist/api/impl/import-export/legacy-image-style.js +49 -0
- package/dist/api/impl/import-export/native-format.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
- package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
- package/dist/api/impl/import-export/native-upgrade.js +139 -0
- package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
- package/dist/api/impl/import-export/style-validation.d.ts +24 -0
- package/dist/api/impl/import-export/style-validation.js +86 -0
- package/dist/api/impl/import-export/types.d.ts +52 -0
- package/dist/api/impl/import-export/types.js +3 -0
- package/dist/api/impl/input.js +180 -0
- package/dist/api/impl/layers.js +307 -0
- package/dist/api/impl/metadata.d.ts +1 -0
- package/dist/api/impl/metadata.js +22 -0
- package/dist/api/impl/options.d.ts +1 -0
- package/dist/api/impl/options.js +822 -0
- package/dist/api/impl/placement.d.ts +1 -0
- package/dist/api/impl/placement.js +138 -0
- package/dist/api/impl/render-context.d.ts +13 -0
- package/dist/api/impl/render-context.js +272 -0
- package/dist/api/impl/rows.d.ts +1 -0
- package/dist/api/impl/rows.js +46 -0
- package/dist/api/impl/selection.d.ts +1 -0
- package/dist/api/impl/selection.js +186 -0
- package/dist/api/impl/shared.d.ts +64 -0
- package/dist/api/impl/shared.js +178 -0
- package/dist/api/impl/validate-extension.d.ts +1 -0
- package/dist/api/impl/validate-extension.js +159 -0
- package/dist/api/layers.d.ts +130 -0
- package/dist/api/layers.js +3 -0
- package/dist/api/metadata.d.ts +18 -0
- package/dist/api/metadata.js +3 -0
- package/dist/api/model.d.ts +487 -0
- package/dist/api/model.js +47 -0
- package/dist/api/options.d.ts +466 -0
- package/dist/api/options.js +3 -0
- package/dist/api/selection.d.ts +94 -0
- package/dist/api/selection.js +3 -0
- package/dist/api/state.d.ts +155 -0
- package/dist/api/state.js +12 -0
- package/dist/{display → dataset}/chunk.d.ts +1 -1
- package/dist/{display → dataset}/chunk.js +4 -3
- package/dist/{display → dataset}/dataset.js +18 -21
- package/dist/dataset/interaction.d.ts +1 -0
- package/dist/{display → dataset}/interaction.js +18 -6
- package/dist/dataset/manager.d.ts +1 -0
- package/dist/dataset/provider.d.ts +1 -0
- package/dist/{display → dataset}/retained.d.ts +1 -1
- package/dist/{display → dataset}/retained.js +8 -7
- package/dist/dataset/source.d.ts +1 -0
- package/dist/{display → dataset}/source.js +17 -4
- package/dist/dataset/spatial.d.ts +1 -0
- package/dist/{display → dataset}/spatial.js +1 -1
- package/dist/dataset/style.d.ts +1 -0
- package/dist/{display → dataset}/style.js +1 -1
- package/dist/dataset/table-source.d.ts +1 -0
- package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
- package/dist/{display → dataset}/thinning.d.ts +0 -10
- package/dist/{display → dataset}/thinning.js +3 -2
- package/dist/dataset/triangulation.d.ts +1 -0
- package/dist/{display → dataset}/triangulation.js +0 -0
- package/dist/{display → dataset}/types.d.ts +82 -121
- package/dist/dataset/types.js +61 -0
- package/dist/dispatcher/hit-test/box-strategies.js +13 -13
- package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
- package/dist/dispatcher/hit-test/globe-shape.js +5 -4
- package/dist/dispatcher/hit-test/service.d.ts +17 -0
- package/dist/dispatcher/hit-test/service.js +80 -16
- package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
- package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
- package/dist/dispatcher/hit-test/strategies/image.js +6 -18
- package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
- package/dist/dispatcher/hit-test/strategies/line.js +9 -2
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
- package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
- package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
- package/dist/dispatcher/hit-test/strategies/point.js +8 -4
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
- package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
- package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
- package/dist/dispatcher/input-router.js +152 -69
- package/dist/dispatcher/normalizer.js +6 -2
- package/dist/dispatcher/types.d.ts +6 -1
- package/dist/extension/feature-handler.d.ts +1 -182
- package/dist/extension/index.d.ts +4 -7
- package/dist/extension/renderers.d.ts +1 -208
- package/dist/geometry/angle.d.ts +0 -8
- package/dist/geometry/angle.js +0 -8
- package/dist/geometry/bbox.d.ts +4 -12
- package/dist/geometry/bbox.js +4 -12
- package/dist/geometry/boolean.d.ts +0 -51
- package/dist/geometry/boolean.js +0 -51
- package/dist/geometry/buffer.d.ts +0 -26
- package/dist/geometry/buffer.js +0 -26
- package/dist/geometry/circle.d.ts +0 -9
- package/dist/geometry/circle.js +0 -9
- package/dist/geometry/coords.d.ts +0 -16
- package/dist/geometry/coords.js +0 -16
- package/dist/geometry/distance.d.ts +0 -24
- package/dist/geometry/distance.js +0 -24
- package/dist/geometry/errors.d.ts +21 -36
- package/dist/geometry/errors.js +49 -29
- package/dist/geometry/geojson.d.ts +81 -0
- package/dist/geometry/geojson.js +164 -0
- package/dist/geometry/index.d.ts +38 -23
- package/dist/geometry/index.js +43 -31
- package/dist/geometry/measure.d.ts +0 -27
- package/dist/geometry/measure.js +0 -27
- package/dist/geometry/predicates.d.ts +0 -9
- package/dist/geometry/predicates.js +0 -9
- package/dist/geometry/public-bounds.d.ts +26 -0
- package/dist/geometry/public-bounds.js +30 -0
- package/dist/geometry/public-combine.d.ts +78 -0
- package/dist/geometry/public-combine.js +82 -0
- package/dist/geometry/public-create.d.ts +54 -0
- package/dist/geometry/public-create.js +70 -0
- package/dist/geometry/public-measure.d.ts +170 -0
- package/dist/geometry/public-measure.js +283 -0
- package/dist/geometry/public-predicates.d.ts +54 -0
- package/dist/geometry/public-predicates.js +144 -0
- package/dist/geometry/public-repair.d.ts +75 -0
- package/dist/geometry/public-repair.js +77 -0
- package/dist/geometry/simplify.d.ts +0 -7
- package/dist/geometry/simplify.js +0 -7
- package/dist/geometry/split.d.ts +0 -20
- package/dist/geometry/split.js +0 -20
- package/dist/geometry/units.d.ts +20 -12
- package/dist/geometry/units.js +20 -12
- package/dist/index.d.ts +52 -66
- package/dist/index.js +6 -18
- package/dist/messages.d.ts +7 -7
- package/dist/modes/draw/circle.js +83 -207
- package/dist/modes/draw/commit-layer.d.ts +5 -16
- package/dist/modes/draw/commit-layer.js +2 -13
- package/dist/modes/draw/freehand.js +108 -246
- package/dist/modes/draw/image.js +4 -2
- package/dist/modes/draw/index.d.ts +5 -5
- package/dist/modes/draw/index.js +5 -5
- package/dist/modes/draw/line.js +18 -354
- package/dist/modes/draw/point.js +29 -78
- package/dist/modes/draw/polygon.js +23 -368
- package/dist/modes/draw/trace-support.d.ts +43 -36
- package/dist/modes/draw/trace-support.js +95 -98
- package/dist/modes/draw/vertex-drawing.d.ts +1 -0
- package/dist/modes/draw/vertex-drawing.js +176 -0
- package/dist/modes/handler.d.ts +1 -285
- package/dist/modes/manager.d.ts +2 -2
- package/dist/modes/manager.js +3 -0
- package/dist/modes/select/box-selection.d.ts +3 -3
- package/dist/modes/select/box-selection.js +2 -1
- package/dist/modes/select/click-handler.d.ts +5 -5
- package/dist/modes/select/click-handler.js +22 -20
- package/dist/modes/select/cursor-handler.d.ts +2 -2
- package/dist/modes/select/drag/intermediate-writes.js +1 -1
- package/dist/modes/select/drag/move.js +3 -3
- package/dist/modes/select/drag/operation.d.ts +3 -3
- package/dist/modes/select/drag/radius.js +5 -4
- package/dist/modes/select/drag/transform.d.ts +2 -2
- package/dist/modes/select/drag/transform.js +11 -5
- package/dist/modes/select/drag/vertex.d.ts +2 -2
- package/dist/modes/select/drag/vertex.js +13 -8
- package/dist/modes/select/drag-handler.js +44 -25
- package/dist/modes/select/mode.js +17 -17
- package/dist/modes/select/shortcut-handler.d.ts +8 -8
- package/dist/modes/select/shortcut-handler.js +9 -7
- package/dist/operations/layer-operations.js +29 -168
- package/dist/operations/resize.d.ts +2 -2
- package/dist/operations/resize.js +5 -5
- package/dist/operations/rotate.js +5 -5
- package/dist/operations/selection-operations.d.ts +16 -1
- package/dist/operations/selection-operations.js +28 -13
- package/dist/operations/shared-vertex.js +4 -2
- package/dist/operations/trace-graph.d.ts +0 -18
- package/dist/operations/trace-graph.js +0 -18
- package/dist/operations/vertex.js +36 -35
- package/dist/shared/color.d.ts +1 -0
- package/dist/shared/color.js +245 -0
- package/dist/shared/config/constants.d.ts +1 -54
- package/dist/shared/config/constants.js +1 -58
- package/dist/shared/config/feature-style.d.ts +16 -13
- package/dist/shared/config/feature-style.js +9 -0
- package/dist/shared/config/rendering.d.ts +3 -3
- package/dist/shared/config/selection-highlight.d.ts +0 -15
- package/dist/shared/config/selection-highlight.js +4 -7
- package/dist/shared/config/selection.d.ts +2 -32
- package/dist/shared/config/selection.js +0 -18
- package/dist/shared/config/topology.d.ts +2 -2
- package/dist/shared/config/trace.d.ts +4 -4
- package/dist/shared/math/angle.d.ts +1 -1
- package/dist/shared/math/angle.js +1 -1
- package/dist/shared/math/circle.d.ts +1 -1
- package/dist/shared/math/circle.js +1 -1
- package/dist/shared/math/distance.d.ts +2 -1
- package/dist/shared/math/distance.js +3 -2
- package/dist/shared/math/index.d.ts +1 -1
- package/dist/shared/math/index.js +1 -1
- package/dist/shared/math/transform.d.ts +23 -0
- package/dist/shared/math/transform.js +47 -28
- package/dist/shared/properties.d.ts +18 -0
- package/dist/shared/properties.js +129 -0
- package/dist/shared/types/events.d.ts +15 -7
- package/dist/shared/types/model.d.ts +109 -159
- package/dist/shared/types/style.d.ts +1 -1
- package/dist/shared/utils/color.d.ts +2 -36
- package/dist/shared/utils/color.js +13 -70
- package/dist/shared/utils/coordinates.d.ts +30 -4
- package/dist/shared/utils/coordinates.js +56 -10
- package/dist/shared/utils/event-emitter.d.ts +1 -262
- package/dist/shared/utils/event-emitter.js +4 -3
- package/dist/shared/utils/feature-bbox.js +8 -7
- package/dist/shared/utils/feature-segments.js +5 -4
- package/dist/shared/utils/image.d.ts +0 -4
- package/dist/shared/utils/image.js +0 -6
- package/dist/shared/utils/name-generator.d.ts +14 -20
- package/dist/shared/utils/name-generator.js +20 -3
- package/dist/shared/utils/pixel-ratio.d.ts +9 -3
- package/dist/shared/utils/pixel-ratio.js +13 -4
- package/dist/shared/utils/property.d.ts +7 -50
- package/dist/shared/utils/property.js +22 -87
- package/dist/snapping/custom-targets.js +21 -4
- package/dist/snapping/indicator.js +20 -11
- package/dist/snapping/providers/display.d.ts +6 -1
- package/dist/snapping/providers/display.js +2 -1
- package/dist/snapping/providers/guide.d.ts +3 -43
- package/dist/snapping/providers/guide.js +1 -44
- package/dist/snapping/providers/intersection.js +1 -1
- package/dist/snapping/providers/store.js +3 -3
- package/dist/snapping/service.js +18 -7
- package/dist/snapping/types.d.ts +9 -35
- package/dist/store/draw-store.js +233 -142
- package/dist/store/local-visibility.d.ts +11 -6
- package/dist/store/local-visibility.js +38 -7
- package/dist/store/lock.d.ts +0 -6
- package/dist/store/lock.js +0 -6
- package/dist/store/memory/change-bus.d.ts +3 -3
- package/dist/store/memory/change-bus.js +12 -0
- package/dist/store/memory/file-store.d.ts +2 -2
- package/dist/store/memory/ui-state.d.ts +1 -51
- package/dist/store/memory/ui-state.js +122 -134
- package/dist/store/memory.d.ts +1 -8
- package/dist/store/memory.js +249 -45
- package/dist/store/ordering.d.ts +9 -0
- package/dist/store/ordering.js +17 -0
- package/dist/store/spatial/spatial-index.d.ts +1 -1
- package/dist/store/spatial/spatial-index.js +1 -1
- package/dist/store/spatial/store-spatial-index.d.ts +3 -1
- package/dist/store/spatial/store-spatial-index.js +9 -3
- package/dist/store/store.d.ts +66 -107
- package/dist/store/types.d.ts +1 -1
- package/dist/store/writable-layer.d.ts +1 -1
- package/dist/store/writable-layer.js +2 -2
- package/dist/table/builder.d.ts +83 -0
- package/dist/table/builder.js +381 -0
- package/dist/table/index.d.ts +37 -0
- package/dist/table/index.js +5 -0
- package/dist/table/packed-rtree.d.ts +1 -0
- package/dist/{display → table}/packed-rtree.js +1 -1
- package/dist/table/partition.d.ts +1 -0
- package/dist/{display → table}/partition.js +3 -3
- package/dist/table/prepare.d.ts +44 -0
- package/dist/table/prepare.js +136 -0
- package/dist/table/table.d.ts +1 -0
- package/dist/{display/columnar → table}/table.js +29 -25
- package/dist/{display/columnar → table}/types.d.ts +68 -72
- package/dist/table/types.js +3 -0
- package/dist/view/coordinator.js +4 -3
- package/dist/view/feature-companion.d.ts +13 -7
- package/dist/view/feature-companion.js +11 -3
- package/dist/view/globe-subdivision.js +3 -3
- package/dist/view/layer/attach.d.ts +1 -1
- package/dist/view/layer/attach.js +1 -1
- package/dist/view/layer/custom-layer.js +40 -11
- package/dist/view/layer/display-list.js +2 -1
- package/dist/view/layer/drape-planner.d.ts +2 -2
- package/dist/view/layer/frame-render.d.ts +3 -3
- package/dist/view/layer/frame-render.js +7 -2
- package/dist/view/layer/frame-state.d.ts +6 -6
- package/dist/view/layer/index.d.ts +2 -2
- package/dist/view/layer/index.js +1 -1
- package/dist/view/layer/render.d.ts +4 -4
- package/dist/view/layer/render.js +3 -8
- package/dist/view/layer/renderers.d.ts +2 -2
- package/dist/view/layer/renderers.js +1 -1
- package/dist/view/layer/slot-manager.d.ts +2 -2
- package/dist/view/layer/slot-manager.js +4 -4
- package/dist/view/layer/slots.d.ts +2 -2
- package/dist/view/layer/slots.js +1 -1
- package/dist/view/layer/store-retained-bbox.js +3 -2
- package/dist/view/layer/store-retained-classify.d.ts +5 -7
- package/dist/view/layer/store-retained-classify.js +19 -7
- package/dist/view/layer/store-retained-collect.js +8 -7
- package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
- package/dist/view/layer/store-retained-coord-patch.js +13 -4
- package/dist/view/layer/store-retained-immediate.d.ts +3 -3
- package/dist/view/layer/store-retained-immediate.js +3 -8
- package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
- package/dist/view/layer/store-retained.d.ts +2 -2
- package/dist/view/layer/store-retained.js +1 -1
- package/dist/view/renderers/batch-manager.js +8 -7
- package/dist/view/renderers/drawer.js +21 -15
- package/dist/view/renderers/image.js +13 -39
- package/dist/view/renderers/line/line-types.d.ts +3 -3
- package/dist/view/renderers/line/sdf-line.js +3 -1
- package/dist/view/renderers/point/billboard-depth.js +1 -1
- package/dist/view/renderers/point/point-instance.js +1 -1
- package/dist/view/renderers/point/point-shape.js +2 -2
- package/dist/view/renderers/point/point-style.js +48 -4
- package/dist/view/renderers/polygon/batch.js +1 -2
- package/dist/view/renderers/polygon/fill.js +3 -1
- package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
- package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
- package/dist/view/renderers/stroke.js +3 -1
- package/dist/view/shaders/helpers.d.ts +2 -42
- package/dist/view/shaders/helpers.js +0 -6
- package/dist/view/shaders/projection.d.ts +15 -7
- package/dist/view/shaders/projection.js +23 -6
- package/dist/view/shaders/quad.d.ts +16 -12
- package/dist/view/shaders/quad.js +34 -13
- package/dist/view/style-rule.d.ts +5 -42
- package/dist/view/style-rule.js +20 -44
- package/dist/view/terrain/binding.d.ts +1 -0
- package/dist/view/terrain/binding.js +29 -0
- package/dist/view/terrain/context.d.ts +3 -4
- package/dist/view/terrain/context.js +4 -5
- package/dist/view/terrain/drape/geometry.js +1 -1
- package/dist/view/terrain/drape/pass.d.ts +1 -1
- package/dist/view/terrain/drape/pass.js +8 -7
- package/dist/view/terrain/polygon.d.ts +9 -5
- package/dist/view/terrain/polygon.js +16 -2
- package/dist/view/terrain/state.d.ts +1 -1
- package/dist/view/terrain/state.js +1 -1
- package/dist/view/terrain/tessellation.d.ts +2 -2
- package/dist/view/terrain/tessellation.js +1 -1
- package/dist/view/ui/auxiliary-handles.d.ts +6 -29
- package/dist/view/ui/bounds.js +8 -12
- package/dist/view/ui/handle-test.js +2 -2
- package/dist/view/ui/handle-thinning.js +17 -17
- package/dist/view/ui/handles.js +21 -13
- package/dist/view/ui/helper.d.ts +1 -1
- package/dist/view/ui/helper.js +1 -1
- package/dist/view/ui/index.d.ts +1 -1
- package/dist/view/ui/selection-scope.js +4 -2
- package/dist/view/ui/selection-ui/bounding-box.js +6 -6
- package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
- package/dist/view/ui/selection-ui/extension-registry.js +70 -7
- package/dist/view/ui/selection-ui/index.d.ts +2 -2
- package/dist/view/ui/selection-ui/index.js +1 -1
- package/dist/view/ui/selection-ui/renderer.js +15 -38
- package/dist/view/ui/selection-ui/types.d.ts +17 -2
- package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
- package/dist/view/ui/selection-ui-drawer.js +63 -2
- package/dist/view/ui/tentative.js +1 -1
- package/dist/webgl/index.d.ts +65 -0
- package/dist/webgl/index.js +62 -0
- package/package.json +20 -9
- package/dist/api/api.d.ts +0 -1259
- package/dist/api/api.js +0 -86
- package/dist/api/context.d.ts +0 -173
- package/dist/api/display-api.js +0 -23
- package/dist/api/event-api.d.ts +0 -13
- package/dist/api/event-api.js +0 -17
- package/dist/api/extension-api.d.ts +0 -46
- package/dist/api/extension-api.js +0 -85
- package/dist/api/feature-api.d.ts +0 -11
- package/dist/api/feature-api.js +0 -101
- package/dist/api/geometry/apply.d.ts +0 -51
- package/dist/api/geometry/boolean.d.ts +0 -28
- package/dist/api/geometry/boolean.js +0 -65
- package/dist/api/geometry/types.d.ts +0 -31
- package/dist/api/geometry-operations.d.ts +0 -162
- package/dist/api/geometry-operations.js +0 -94
- package/dist/api/group-api.d.ts +0 -10
- package/dist/api/group-api.js +0 -78
- package/dist/api/import-export/constants.d.ts +0 -29
- package/dist/api/import-export/constants.js +0 -40
- package/dist/api/import-export/file-name.d.ts +0 -10
- package/dist/api/import-export/file-name.js +0 -20
- package/dist/api/import-export/geojson-export.d.ts +0 -19
- package/dist/api/import-export/image-import.d.ts +0 -12
- package/dist/api/import-export/image-import.js +0 -53
- package/dist/api/import-export/index.d.ts +0 -9
- package/dist/api/import-export/index.js +0 -107
- package/dist/api/import-export/native-format.d.ts +0 -15
- package/dist/api/import-export/style-validation.d.ts +0 -27
- package/dist/api/import-export/style-validation.js +0 -49
- package/dist/api/import-export/types.d.ts +0 -26
- package/dist/api/index.d.ts +0 -15
- package/dist/api/index.js +0 -3
- package/dist/api/input-api.d.ts +0 -158
- package/dist/api/input-api.js +0 -144
- package/dist/api/instance-api.d.ts +0 -38
- package/dist/api/instance-api.js +0 -136
- package/dist/api/layer-api.d.ts +0 -12
- package/dist/api/layer-api.js +0 -62
- package/dist/api/selection-api.d.ts +0 -7
- package/dist/api/selection-api.js +0 -78
- package/dist/api/snapping-api.d.ts +0 -125
- package/dist/api/snapping-api.js +0 -50
- package/dist/api/topology-api.d.ts +0 -30
- package/dist/api/topology-api.js +0 -16
- package/dist/api/tracing-api.d.ts +0 -31
- package/dist/api/tracing-api.js +0 -16
- package/dist/dispatcher/hit-test/index.d.ts +0 -14
- package/dist/dispatcher/hit-test/index.js +0 -9
- package/dist/dispatcher/index.d.ts +0 -15
- package/dist/dispatcher/index.js +0 -3
- package/dist/display/columnar/index.d.ts +0 -12
- package/dist/display/columnar/index.js +0 -13
- package/dist/display/columnar/prepare.d.ts +0 -42
- package/dist/display/columnar/prepare.js +0 -116
- package/dist/display/index.d.ts +0 -13
- package/dist/display/types.js +0 -43
- package/dist/maplibre-gl-draw.d.ts +0 -47
- package/dist/modes/cursor.js +0 -72
- package/dist/modes/index.d.ts +0 -7
- package/dist/operations/index.d.ts +0 -9
- package/dist/operations/index.js +0 -3
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/mutation-hooks.d.ts +0 -28
- package/dist/plugins/mutation-hooks.js +0 -84
- package/dist/plugins/plugin-context.js +0 -367
- package/dist/plugins/plugin-manager.d.ts +0 -103
- package/dist/plugins/plugin-manager.js +0 -316
- package/dist/plugins/plugin.d.ts +0 -529
- package/dist/shared/config/index.d.ts +0 -17
- package/dist/shared/config/index.js +0 -8
- package/dist/shared/utils/index.d.ts +0 -15
- package/dist/shared/utils/index.js +0 -24
- package/dist/snapping/index.d.ts +0 -14
- package/dist/snapping/index.js +0 -4
- package/dist/store/change-merger.js +0 -102
- package/dist/store/event-bridge.js +0 -161
- package/dist/store/index.d.ts +0 -12
- package/dist/store/index.js +0 -4
- package/dist/view/index.d.ts +0 -47
- package/dist/view/index.js +0 -20
- /package/dist/api/{geometry/types.js → datasets.js} +0 -0
- /package/dist/api/{import-export/types.js → document.js} +0 -0
- /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
- /package/dist/{display/index.js → api/events.js} +0 -0
- /package/dist/{modes/index.js → api/extension/context.js} +0 -0
- /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
- /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
- /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
- /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
- /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
- /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
- /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
- /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
- /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
- /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
- /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
- /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
- /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
- /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
- /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
- /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
- /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
- /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
- /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
- /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
- /package/dist/{display → dataset}/chunk-set.js +0 -0
- /package/dist/{display → dataset}/dataset.d.ts +0 -0
- /package/dist/{display → dataset}/manager.js +0 -0
- /package/dist/{display → dataset}/provider.js +0 -0
- /package/dist/{display → dataset}/selection.d.ts +0 -0
- /package/dist/{display → dataset}/selection.js +0 -0
|
@@ -3,90 +3,117 @@
|
|
|
3
3
|
import { resolveVertexCoordinates } from '../../operations/shared-vertex.js';
|
|
4
4
|
import { buildTraceGraph, findTracePath } from '../../operations/trace-graph.js';
|
|
5
5
|
import { degreesPerPixel } from '../../snapping/geometry.js';
|
|
6
|
-
import { isSnapVisible } from '../../snapping/providers/shared.js';
|
|
7
6
|
import { DEFAULT_SNAP_OPTIONS } from '../../snapping/types.js';
|
|
7
|
+
import { isLocallyHidden } from '../../store/local-visibility.js';
|
|
8
8
|
/**
|
|
9
9
|
* The margin of the extent over which the material of the graph is collected
|
|
10
10
|
* (as a ratio of the bbox of the two endpoints)
|
|
11
11
|
*/
|
|
12
12
|
const TRACE_BBOX_MARGIN_RATIO = 0.2;
|
|
13
|
+
/** A feature of the document or a row, in the shape the graph is built from */
|
|
14
|
+
function graphFeature(id, geometry, type = geometry.type) {
|
|
15
|
+
return {
|
|
16
|
+
id,
|
|
17
|
+
type,
|
|
18
|
+
geometry,
|
|
19
|
+
layerId: '',
|
|
20
|
+
groupId: undefined,
|
|
21
|
+
properties: {},
|
|
22
|
+
locked: false,
|
|
23
|
+
visible: true,
|
|
24
|
+
style: {},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
13
27
|
/**
|
|
14
|
-
*
|
|
28
|
+
* The trace source over the context of a mode: the options of the instance, the features of
|
|
29
|
+
* the document by extent and the rows of the datasets to trace along
|
|
15
30
|
*/
|
|
16
|
-
export function
|
|
17
|
-
|
|
31
|
+
export function traceSourceOf(ctx) {
|
|
32
|
+
const { draw, store } = ctx;
|
|
33
|
+
const shown = (feature) => {
|
|
34
|
+
if (!feature.visible)
|
|
35
|
+
return false;
|
|
36
|
+
if (!store.getLayer(feature.layerId)?.visible)
|
|
37
|
+
return false;
|
|
38
|
+
if (feature.groupId && store.getGroup(feature.groupId)?.visible === false)
|
|
39
|
+
return false;
|
|
40
|
+
return !isLocallyHidden(feature, store);
|
|
41
|
+
};
|
|
42
|
+
return {
|
|
43
|
+
isEnabled: () => draw.options.get().tracing?.enabled !== false,
|
|
44
|
+
tolerancePx: () => draw.options.get().snapping?.tolerancePx ?? DEFAULT_SNAP_OPTIONS.tolerancePx,
|
|
45
|
+
zoom: () => ctx.screen.zoom,
|
|
46
|
+
geometryOf(anchor) {
|
|
47
|
+
if (anchor.datasetId === undefined) {
|
|
48
|
+
return draw.features.get(anchor.featureId)?.geometry ?? null;
|
|
49
|
+
}
|
|
50
|
+
const dataset = draw.datasets.get(anchor.datasetId);
|
|
51
|
+
const index = dataset?.findRow(anchor.featureId);
|
|
52
|
+
if (!dataset || index === null || index === undefined)
|
|
53
|
+
return null;
|
|
54
|
+
return dataset.getRow(index)?.geometry ?? null;
|
|
55
|
+
},
|
|
56
|
+
features(bbox) {
|
|
57
|
+
const extent = [bbox.minX, bbox.minY, bbox.maxX, bbox.maxY];
|
|
58
|
+
const features = draw.features
|
|
59
|
+
.list({ bbox: extent })
|
|
60
|
+
.filter(shown)
|
|
61
|
+
.map((feature) => feature);
|
|
62
|
+
for (const { row } of ctx.listTraceRows(extent)) {
|
|
63
|
+
if (row.geometry)
|
|
64
|
+
features.push(graphFeature(String(row.id), row.geometry));
|
|
65
|
+
}
|
|
66
|
+
return features;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
18
69
|
}
|
|
19
70
|
/**
|
|
20
|
-
* Reads the snap target of
|
|
71
|
+
* Reads the snap target of an input as an endpoint of a trace
|
|
21
72
|
*
|
|
22
|
-
* Returns null for snaps that cannot be used for tracing (a guide, an intersection
|
|
23
|
-
*
|
|
73
|
+
* Returns null for snaps that cannot be used for tracing (a guide, an intersection, an
|
|
74
|
+
* external candidate without a feature ID), when nothing was snapped, and when tracing is off.
|
|
24
75
|
*/
|
|
25
|
-
export function readTraceAnchor(
|
|
26
|
-
if (!
|
|
76
|
+
export function readTraceAnchor(source, event) {
|
|
77
|
+
if (!source.isEnabled())
|
|
27
78
|
return null;
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
if (!result || !target || target.featureId === undefined)
|
|
79
|
+
const target = event.snapped.target;
|
|
80
|
+
if (!target || target.featureId === undefined)
|
|
31
81
|
return null;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (target.vertex)
|
|
39
|
-
return {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (segment?.startRef && segment.endRef) {
|
|
47
|
-
return {
|
|
48
|
-
featureId: target.featureId,
|
|
49
|
-
datasetId: target.datasetId,
|
|
50
|
-
endpoint: {
|
|
51
|
-
coordinate,
|
|
52
|
-
segment: { startRef: segment.startRef, endRef: segment.endRef },
|
|
53
|
-
},
|
|
54
|
-
};
|
|
82
|
+
const coordinate = [event.snapped.lngLat[0], event.snapped.lngLat[1]];
|
|
83
|
+
const anchor = (endpoint) => ({
|
|
84
|
+
featureId: target.featureId,
|
|
85
|
+
...(target.datasetId !== undefined && { datasetId: target.datasetId }),
|
|
86
|
+
endpoint,
|
|
87
|
+
});
|
|
88
|
+
if (target.vertex)
|
|
89
|
+
return anchor({ coordinate, vertex: target.vertex });
|
|
90
|
+
if (target.kind === 'edge' && target.segment) {
|
|
91
|
+
const { start, end } = target.segment;
|
|
92
|
+
return anchor({
|
|
93
|
+
coordinate,
|
|
94
|
+
segment: { start: [start[0], start[1]], end: [end[0], end[1]] },
|
|
95
|
+
});
|
|
55
96
|
}
|
|
56
97
|
return null;
|
|
57
98
|
}
|
|
58
99
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* Where it is resolved from depends on its origin. One from the Store is looked up with
|
|
62
|
-
* store.getFeature, one from a dataset with getDatasetFeature.
|
|
100
|
+
* Turns the snap target into an endpoint of the graph (resolves a vertex reference into the
|
|
101
|
+
* coordinate the feature holds)
|
|
63
102
|
*/
|
|
64
|
-
function
|
|
65
|
-
if (anchor.datasetId === undefined) {
|
|
66
|
-
return context.store.getFeature(anchor.featureId) ?? null;
|
|
67
|
-
}
|
|
68
|
-
return context.getDatasetFeature?.(anchor.datasetId, anchor.featureId) ?? null;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Turns the snap target into an endpoint of the graph (resolves the vertex references into
|
|
72
|
-
* actual coordinates)
|
|
73
|
-
*/
|
|
74
|
-
function toGraphEndpoint(context, anchor) {
|
|
103
|
+
function toGraphEndpoint(source, anchor) {
|
|
75
104
|
const { coordinate, vertex, segment } = anchor.endpoint;
|
|
76
|
-
const
|
|
105
|
+
const geometry = source.geometryOf(anchor);
|
|
106
|
+
if (!geometry)
|
|
107
|
+
return null;
|
|
77
108
|
if (vertex) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
109
|
+
const resolved = resolveVertexCoordinates(graphFeature(anchor.featureId, geometry), [
|
|
110
|
+
vertex,
|
|
111
|
+
])[0];
|
|
81
112
|
return { coordinate, node: resolved ?? coordinate };
|
|
82
113
|
}
|
|
83
|
-
if (!segment
|
|
84
|
-
return null;
|
|
85
|
-
const start = resolveVertexCoordinates(feature, [segment.startRef])[0];
|
|
86
|
-
const end = resolveVertexCoordinates(feature, [segment.endRef])[0];
|
|
87
|
-
if (!start || !end)
|
|
114
|
+
if (!segment)
|
|
88
115
|
return null;
|
|
89
|
-
return { coordinate, segment
|
|
116
|
+
return { coordinate, segment };
|
|
90
117
|
}
|
|
91
118
|
/**
|
|
92
119
|
* The extent over which the material of the graph is collected
|
|
@@ -94,13 +121,13 @@ function toGraphEndpoint(context, anchor) {
|
|
|
94
121
|
* The bbox of the two endpoints is expanded by 20 percent of its size plus the snapping
|
|
95
122
|
* tolerance.
|
|
96
123
|
*/
|
|
97
|
-
function traceBounds(
|
|
124
|
+
function traceBounds(source, from, to) {
|
|
98
125
|
const minX = Math.min(from[0], to[0]);
|
|
99
126
|
const maxX = Math.max(from[0], to[0]);
|
|
100
127
|
const minY = Math.min(from[1], to[1]);
|
|
101
128
|
const maxY = Math.max(from[1], to[1]);
|
|
102
|
-
const tolerancePx =
|
|
103
|
-
const perPixel = degreesPerPixel((minY + maxY) / 2,
|
|
129
|
+
const tolerancePx = source.tolerancePx();
|
|
130
|
+
const perPixel = degreesPerPixel((minY + maxY) / 2, source.zoom());
|
|
104
131
|
const marginX = (maxX - minX) * TRACE_BBOX_MARGIN_RATIO + perPixel.lng * tolerancePx;
|
|
105
132
|
const marginY = (maxY - minY) * TRACE_BBOX_MARGIN_RATIO + perPixel.lat * tolerancePx;
|
|
106
133
|
return {
|
|
@@ -110,35 +137,6 @@ function traceBounds(context, from, to) {
|
|
|
110
137
|
maxY: maxY + marginY,
|
|
111
138
|
};
|
|
112
139
|
}
|
|
113
|
-
/**
|
|
114
|
-
* Collects the features that become the material of the graph
|
|
115
|
-
*
|
|
116
|
-
* The same scope as the targets of snapping, that is, the visible features of the Store and,
|
|
117
|
-
* when snapping to data is enabled, the visible features of the datasets.
|
|
118
|
-
*/
|
|
119
|
-
function collectTraceFeatures(context, bbox) {
|
|
120
|
-
const lng = (bbox.minX + bbox.maxX) / 2;
|
|
121
|
-
const lat = (bbox.minY + bbox.maxY) / 2;
|
|
122
|
-
// findNear looks up with a square extent, so the larger of the two radii is used
|
|
123
|
-
const radius = Math.max(bbox.maxX - lng, bbox.maxY - lat);
|
|
124
|
-
const features = [];
|
|
125
|
-
const seen = new Set();
|
|
126
|
-
for (const id of context.spatialIndex.findNear([lng, lat], radius)) {
|
|
127
|
-
if (seen.has(id))
|
|
128
|
-
continue;
|
|
129
|
-
seen.add(id);
|
|
130
|
-
const feature = context.store.getFeature(id);
|
|
131
|
-
if (!feature)
|
|
132
|
-
continue;
|
|
133
|
-
if (!isSnapVisible(feature, context.store))
|
|
134
|
-
continue;
|
|
135
|
-
features.push(feature);
|
|
136
|
-
}
|
|
137
|
-
const display = context.getDatasetTraceFeatures?.(bbox);
|
|
138
|
-
if (display)
|
|
139
|
-
features.push(...display);
|
|
140
|
-
return features;
|
|
141
|
-
}
|
|
142
140
|
/**
|
|
143
141
|
* Derives the path between the previous confirmed click and the current snap target
|
|
144
142
|
*
|
|
@@ -148,14 +146,13 @@ function collectTraceFeatures(context, bbox) {
|
|
|
148
146
|
* shared vertex. Returns null when the two ends are not connected or when an endpoint cannot
|
|
149
147
|
* be resolved (the caller then treats it as a straight line).
|
|
150
148
|
*/
|
|
151
|
-
export function computeTracePath(
|
|
149
|
+
export function computeTracePath(source, from, to) {
|
|
152
150
|
if (!from || !to)
|
|
153
151
|
return null;
|
|
154
|
-
const fromEndpoint = toGraphEndpoint(
|
|
155
|
-
const toEndpoint = toGraphEndpoint(
|
|
152
|
+
const fromEndpoint = toGraphEndpoint(source, from);
|
|
153
|
+
const toEndpoint = toGraphEndpoint(source, to);
|
|
156
154
|
if (!fromEndpoint || !toEndpoint)
|
|
157
155
|
return null;
|
|
158
|
-
const bbox = traceBounds(
|
|
159
|
-
|
|
160
|
-
return findTracePath(buildTraceGraph(features, bbox), fromEndpoint, toEndpoint);
|
|
156
|
+
const bbox = traceBounds(source, fromEndpoint.coordinate, toEndpoint.coordinate);
|
|
157
|
+
return findTracePath(buildTraceGraph(source.features(bbox), bbox), fromEndpoint, toEndpoint);
|
|
161
158
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { computeTracePath, readTraceAnchor, traceSourceOf } from './trace-support.js';
|
|
4
|
+
/** How near the closing vertex a click finishes the shape, in pixels */
|
|
5
|
+
const VERTEX_CLICK_TOLERANCE = 10;
|
|
6
|
+
/**
|
|
7
|
+
* Creates the handler of a mode that draws a shape vertex by vertex
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export function createVertexDrawing(ctx, shape) {
|
|
12
|
+
const source = traceSourceOf(ctx);
|
|
13
|
+
let vertices = [];
|
|
14
|
+
/** The vertices undone, to redo */
|
|
15
|
+
let redo = [];
|
|
16
|
+
/** The last position of the pointer, to keep the dashed line on undo and redo */
|
|
17
|
+
let pointer = null;
|
|
18
|
+
/** Whether the pointer is on the closing vertex */
|
|
19
|
+
let nearClosing = false;
|
|
20
|
+
/** The snap target of the last placed vertex: where the next trace starts */
|
|
21
|
+
let traceAnchor = null;
|
|
22
|
+
/** The traced vertices up to the pointer, shown before they are placed */
|
|
23
|
+
let tracePreview = null;
|
|
24
|
+
const closable = () => vertices.length >= shape.minVertices && nearClosing;
|
|
25
|
+
/**
|
|
26
|
+
* Whether the input is on a placed vertex: within the click tolerance for the pointer, and at
|
|
27
|
+
* exactly its position for the input made from code, which is not a click of a hand
|
|
28
|
+
*/
|
|
29
|
+
const onVertex = (event, index) => {
|
|
30
|
+
const vertex = vertices[index];
|
|
31
|
+
if (event.programmatic) {
|
|
32
|
+
return event.snapped.lngLat[0] === vertex[0] && event.snapped.lngLat[1] === vertex[1];
|
|
33
|
+
}
|
|
34
|
+
const [x, y] = ctx.screen.project(vertex);
|
|
35
|
+
return Math.hypot(event.point[0] - x, event.point[1] - y) <= VERTEX_CLICK_TOLERANCE;
|
|
36
|
+
};
|
|
37
|
+
const show = (withPointer) => {
|
|
38
|
+
if (vertices.length === 0) {
|
|
39
|
+
ctx.preview.clear();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const tail = withPointer && pointer ? [...(tracePreview ?? []), pointer] : null;
|
|
43
|
+
const { feature, options } = shape.preview(vertices, tail, closable());
|
|
44
|
+
ctx.preview.set(feature, options);
|
|
45
|
+
};
|
|
46
|
+
const clearTrace = () => {
|
|
47
|
+
traceAnchor = null;
|
|
48
|
+
tracePreview = null;
|
|
49
|
+
};
|
|
50
|
+
const reset = () => {
|
|
51
|
+
vertices = [];
|
|
52
|
+
redo = [];
|
|
53
|
+
pointer = null;
|
|
54
|
+
nearClosing = false;
|
|
55
|
+
clearTrace();
|
|
56
|
+
ctx.preview.clear();
|
|
57
|
+
};
|
|
58
|
+
const finish = () => {
|
|
59
|
+
if (vertices.length < shape.minVertices)
|
|
60
|
+
return;
|
|
61
|
+
const input = shape.feature(vertices);
|
|
62
|
+
ctx.draw.transact(() => {
|
|
63
|
+
const feature = ctx.commitFeature(input);
|
|
64
|
+
if (feature)
|
|
65
|
+
ctx.draw.selection.set('feature', [feature.id]);
|
|
66
|
+
});
|
|
67
|
+
reset();
|
|
68
|
+
ctx.setMode('select');
|
|
69
|
+
};
|
|
70
|
+
const place = (event) => {
|
|
71
|
+
// The vertices of the boundary between the last placed vertex and this one come first
|
|
72
|
+
const anchor = readTraceAnchor(source, event);
|
|
73
|
+
const path = computeTracePath(source, traceAnchor, anchor);
|
|
74
|
+
if (path)
|
|
75
|
+
vertices.push(...path);
|
|
76
|
+
traceAnchor = anchor;
|
|
77
|
+
tracePreview = null;
|
|
78
|
+
vertices.push([event.snapped.lngLat[0], event.snapped.lngLat[1]]);
|
|
79
|
+
redo = [];
|
|
80
|
+
show(false);
|
|
81
|
+
};
|
|
82
|
+
const snapPreference = {
|
|
83
|
+
// The boundary the trace started along wins a tie between snapping candidates
|
|
84
|
+
get prefer() {
|
|
85
|
+
if (!traceAnchor || !source.isEnabled())
|
|
86
|
+
return null;
|
|
87
|
+
return {
|
|
88
|
+
featureId: traceAnchor.featureId,
|
|
89
|
+
...(traceAnchor.datasetId !== undefined && { datasetId: traceAnchor.datasetId }),
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
return {
|
|
94
|
+
writes: true,
|
|
95
|
+
snapPreference,
|
|
96
|
+
onEnter() {
|
|
97
|
+
ctx.cursor.set('crosshair');
|
|
98
|
+
ctx.draw.transact(() => ctx.draw.selection.clear(), { source: 'silent' });
|
|
99
|
+
reset();
|
|
100
|
+
},
|
|
101
|
+
onExit() {
|
|
102
|
+
ctx.cursor.reset();
|
|
103
|
+
reset();
|
|
104
|
+
},
|
|
105
|
+
// What was being drawn is dropped when the state is reset from outside
|
|
106
|
+
onCancel: reset,
|
|
107
|
+
// A double click comes after its two clicks, which placed its position once (or finished
|
|
108
|
+
// the shape on the closing vertex); it finishes the shape and never zooms the map
|
|
109
|
+
onDoubleClick() {
|
|
110
|
+
finish();
|
|
111
|
+
return true;
|
|
112
|
+
},
|
|
113
|
+
onClick(event) {
|
|
114
|
+
// Read from the click itself: no pointer move has to come between two clicks
|
|
115
|
+
nearClosing = vertices.length > 0 && onVertex(event, shape.closingVertex(vertices));
|
|
116
|
+
if (closable())
|
|
117
|
+
finish();
|
|
118
|
+
// The second click of a double click lands on the vertex the first one placed
|
|
119
|
+
else if (vertices.length === 0 || !onVertex(event, vertices.length - 1))
|
|
120
|
+
place(event);
|
|
121
|
+
return true;
|
|
122
|
+
},
|
|
123
|
+
onPointerMove(event) {
|
|
124
|
+
pointer = [event.snapped.lngLat[0], event.snapped.lngLat[1]];
|
|
125
|
+
nearClosing = vertices.length > 0 && onVertex(event, shape.closingVertex(vertices));
|
|
126
|
+
tracePreview = computeTracePath(source, traceAnchor, readTraceAnchor(source, event));
|
|
127
|
+
ctx.cursor.set(closable() ? 'pointer' : 'crosshair');
|
|
128
|
+
if (vertices.length > 0)
|
|
129
|
+
show(true);
|
|
130
|
+
return false;
|
|
131
|
+
},
|
|
132
|
+
onKeyDown(event) {
|
|
133
|
+
switch (event.key) {
|
|
134
|
+
case 'Escape':
|
|
135
|
+
if (vertices.length > 0)
|
|
136
|
+
reset();
|
|
137
|
+
else
|
|
138
|
+
ctx.setMode('select');
|
|
139
|
+
return true;
|
|
140
|
+
case 'Enter':
|
|
141
|
+
finish();
|
|
142
|
+
return true;
|
|
143
|
+
case 'Backspace':
|
|
144
|
+
case 'Delete':
|
|
145
|
+
if (vertices.length > 0) {
|
|
146
|
+
vertices.pop();
|
|
147
|
+
// A vertex removed with the keyboard cannot be redone, and the trace starts over
|
|
148
|
+
redo = [];
|
|
149
|
+
clearTrace();
|
|
150
|
+
show(false);
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
default:
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
onUndoVertex() {
|
|
158
|
+
const removed = vertices.pop();
|
|
159
|
+
if (!removed)
|
|
160
|
+
return false;
|
|
161
|
+
redo.push(removed);
|
|
162
|
+
clearTrace();
|
|
163
|
+
show(true);
|
|
164
|
+
return true;
|
|
165
|
+
},
|
|
166
|
+
onRedoVertex() {
|
|
167
|
+
const restored = redo.pop();
|
|
168
|
+
if (!restored)
|
|
169
|
+
return false;
|
|
170
|
+
vertices.push(restored);
|
|
171
|
+
clearTrace();
|
|
172
|
+
show(true);
|
|
173
|
+
return true;
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|