@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
package/dist/modes/handler.d.ts
CHANGED
|
@@ -1,285 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* ModeHandler
|
|
3
|
-
*
|
|
4
|
-
* Handler interface for the drawing modes.
|
|
5
|
-
* Every mode implements this interface.
|
|
6
|
-
*/
|
|
7
|
-
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
8
|
-
import type { DragNormalizedEvent, KeyNormalizedEvent, MouseNormalizedEvent } from '../dispatcher/types.js';
|
|
9
|
-
import type { Mode } from '../store/types.js';
|
|
10
|
-
/**
|
|
11
|
-
* An input whose coordinates go through snapping, as asked about by
|
|
12
|
-
* {@link ModeHandler.isSnapEnabledFor}.
|
|
13
|
-
*
|
|
14
|
-
* Corresponds one to one with the inputs whose coordinates InputRouter passes through snapping
|
|
15
|
-
* (click / mousemove / dragstart / dragmove / dragend).
|
|
16
|
-
*/
|
|
17
|
-
export type SnapInputType = 'click' | 'mousemove' | 'dragstart' | 'dragmove' | 'dragend';
|
|
18
|
-
/**
|
|
19
|
-
* The services of the draw instance a mode works with, passed to
|
|
20
|
-
* {@link ModeHandler.onStart}.
|
|
21
|
-
*
|
|
22
|
-
* Note: the redraw is triggered automatically by RenderCoordinator subscribing to Store changes,
|
|
23
|
-
* so a mode does not need to call requestRepaint() explicitly.
|
|
24
|
-
*/
|
|
25
|
-
export interface ModeContext {
|
|
26
|
-
/** The map the draw instance is attached to */
|
|
27
|
-
map: MapLibreMap;
|
|
28
|
-
/** The Store of the document; a mode writes features through it */
|
|
29
|
-
store: import('../store/store.js').Store;
|
|
30
|
-
/**
|
|
31
|
-
* The queries of the spatial index (it is derived from the Store, so a mode only reads it)
|
|
32
|
-
*/
|
|
33
|
-
spatialIndex: import('../store/spatial/spatial-index.js').SpatialQuery;
|
|
34
|
-
/** The hit test of the features of the Store alone */
|
|
35
|
-
hitTestService: import('../dispatcher/hit-test/service.js').HitTestService;
|
|
36
|
-
/**
|
|
37
|
-
* Returns the foreground hit in the visual stacking order (unified z traversal)
|
|
38
|
-
*
|
|
39
|
-
* Traverses the features of the Store and the datasets in a single
|
|
40
|
-
* stacking order. Selection, drag and cursor decisions use this one (`hitTestService.hitTest`
|
|
41
|
-
* looks only at the Store, so it would grab a feature that is occluded by a dataset).
|
|
42
|
-
*/
|
|
43
|
-
hitTestTopmost: import('../dispatcher/hit-test/topmost.js').HitTestTopmost;
|
|
44
|
-
/**
|
|
45
|
-
* Provider of the companion rendering and the companion hits (the ones of this draw instance)
|
|
46
|
-
*
|
|
47
|
-
* Used to return a consumed companion hit to the provider.
|
|
48
|
-
*/
|
|
49
|
-
featureCompanions: import('../view/feature-companion.js').FeatureCompanionRegistry;
|
|
50
|
-
/**
|
|
51
|
-
* The selection scope of this draw instance (the extension points of the custom feature
|
|
52
|
-
* types, the auxiliary handles and the thinned handle sets)
|
|
53
|
-
*
|
|
54
|
-
* The same object the CustomLayer draws the selection UI with, so hit testing and rendering
|
|
55
|
-
* agree, and a second draw instance on the page never takes part.
|
|
56
|
-
*/
|
|
57
|
-
selectionScope: import('../view/ui/selection-scope.js').SelectionScope;
|
|
58
|
-
/** The emitter of the `draw.*` events of the draw instance */
|
|
59
|
-
eventEmitter: import('../shared/utils/event-emitter.js').EventEmitter;
|
|
60
|
-
/** The resolved colors and sizes of the selection UI */
|
|
61
|
-
selectionStyle: import('../shared/config/selection.js').SelectionUIConfig;
|
|
62
|
-
/**
|
|
63
|
-
* Topology configuration (simultaneous movement of shared vertices, and so on)
|
|
64
|
-
*
|
|
65
|
-
* When omitted, it is treated as the default value (everything disabled).
|
|
66
|
-
*/
|
|
67
|
-
topology?: import('../shared/config/topology.js').TopologyConfig;
|
|
68
|
-
/**
|
|
69
|
-
* Trace configuration (whether edge tracing is enabled or disabled)
|
|
70
|
-
*
|
|
71
|
-
* When omitted, it is treated as the default value (enabled). It is the same object that
|
|
72
|
-
* draw.tracing rewrites, so a switch at runtime takes effect on the very next input.
|
|
73
|
-
*/
|
|
74
|
-
trace?: import('../shared/config/trace.js').TraceConfig;
|
|
75
|
-
/**
|
|
76
|
-
* The resolved snapping options
|
|
77
|
-
*
|
|
78
|
-
* Read so that the simultaneous movement of shared vertices shares the "modifier key for
|
|
79
|
-
* temporary disabling" with snapping. When snapping is not configured, it is omitted and
|
|
80
|
-
* the default 'alt' is assumed.
|
|
81
|
-
*/
|
|
82
|
-
snapOptions?: import('../snapping/types.js').ResolvedSnapOptions;
|
|
83
|
-
/** Generates the default name of a new feature (such as "Polygon 3") */
|
|
84
|
-
autoNameGenerator: import('../shared/utils/name-generator.js').AutoNameGenerator;
|
|
85
|
-
/** The box selection strategies by feature type */
|
|
86
|
-
boxSelectionRegistry: import('../dispatcher/hit-test/box-strategy.js').BoxSelectionStrategyRegistry;
|
|
87
|
-
/** The plugin manager of the draw instance (omitted when none is set up) */
|
|
88
|
-
pluginManager?: import('../plugins/plugin-manager.js').PluginManager;
|
|
89
|
-
/** Requests a mode change, as `draw.setMode` does (the same refusals apply) */
|
|
90
|
-
setMode: (mode: Mode) => void;
|
|
91
|
-
/** Generates a new unique feature id */
|
|
92
|
-
generateFeatureId: () => string;
|
|
93
|
-
/**
|
|
94
|
-
* Gets the ID of the writable layer, the layer that new features are written into
|
|
95
|
-
*
|
|
96
|
-
* The active layer when it exists, is not locked, is visible and is not locally hidden,
|
|
97
|
-
* otherwise the first such layer, otherwise an empty string. A mode reads it when it
|
|
98
|
-
* commits a feature; when it is an empty string the mode must not create the feature: it
|
|
99
|
-
* discards the drawing (clears the tentative state) and returns to select.
|
|
100
|
-
*/
|
|
101
|
-
getCurrentLayerId: () => string;
|
|
102
|
-
/**
|
|
103
|
-
* Whether the line widths of the features a drawing mode creates follow the zoom (the
|
|
104
|
-
* `scaleWithZoom` option of the instance)
|
|
105
|
-
*
|
|
106
|
-
* When it is true, a mode writes the zoom of the commit into `properties.createdZoom`, and
|
|
107
|
-
* the widths of the feature grow and shrink with the map from there. When it is false, it
|
|
108
|
-
* writes no created zoom and the widths stay the same on the screen.
|
|
109
|
-
*/
|
|
110
|
-
scaleWithZoom: boolean;
|
|
111
|
-
/**
|
|
112
|
-
* Gets the most recent snapping result (always null when snapping is not configured)
|
|
113
|
-
*
|
|
114
|
-
* This is the only read port through which a mode learns about snapping. InputRouter passes
|
|
115
|
-
* the coordinates of click / mousemove through snapping before delivering them to the mode,
|
|
116
|
-
* so at the time of onClick / onMouseMove the result readable here is the snapping result
|
|
117
|
-
* corresponding to the event that was just delivered (tracing reads it).
|
|
118
|
-
*/
|
|
119
|
-
getSnapResult?: () => import('../snapping/types.js').SnapResult | null;
|
|
120
|
-
/**
|
|
121
|
-
* Gets a feature of a dataset (omitted when it is not configured)
|
|
122
|
-
*
|
|
123
|
-
* This is the port through which a mode resolves to a feature a snap target that was snapped
|
|
124
|
-
* to data (a dataset). It is a feature that is not in the Store, so it cannot
|
|
125
|
-
* be looked up with store.getFeature (tracing reads it).
|
|
126
|
-
*/
|
|
127
|
-
getDatasetFeature?: (datasetId: string, featureId: string) => import('../store/types.js').Feature | null;
|
|
128
|
-
/**
|
|
129
|
-
* Looks up, by extent, the features of the datasets usable for tracing
|
|
130
|
-
*
|
|
131
|
-
* This is the port for adding the features of data (a dataset) to the material
|
|
132
|
-
* of the edge graph. It returns an empty array when snapping to data is disabled.
|
|
133
|
-
*/
|
|
134
|
-
getDatasetTraceFeatures?: (bbox: import('../store/types.js').BoundingBox) => import('../store/types.js').Feature[];
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* The implementation of an interaction mode: it receives the normalized input while it is the
|
|
138
|
-
* current mode.
|
|
139
|
-
*
|
|
140
|
-
* Register a custom mode with `draw.registerMode(name, factory)` or `Plugin.modes`, and enter
|
|
141
|
-
* it with `draw.setMode(name)`. The context is passed in `onStart()` and the implementation
|
|
142
|
-
* keeps it in a field; it is not passed to the event handlers. Every handler is optional. The
|
|
143
|
-
* coordinates of the pointer events have already gone through snapping (see
|
|
144
|
-
* `isSnapEnabledFor`).
|
|
145
|
-
*
|
|
146
|
-
* @example
|
|
147
|
-
* ```ts
|
|
148
|
-
* import type { ModeContext, ModeHandler, MouseNormalizedEvent } from '@sakuzu/maplibre-gl-draw';
|
|
149
|
-
*
|
|
150
|
-
* // A mode that logs the clicked position and returns to select on Escape
|
|
151
|
-
* class ProbeMode implements ModeHandler {
|
|
152
|
-
* readonly modeName = 'probe';
|
|
153
|
-
* private context: ModeContext | null = null;
|
|
154
|
-
*
|
|
155
|
-
* onStart(context: ModeContext): void {
|
|
156
|
-
* this.context = context;
|
|
157
|
-
* }
|
|
158
|
-
* onClick(event: MouseNormalizedEvent): void {
|
|
159
|
-
* console.log(event.lngLat.lng, event.lngLat.lat);
|
|
160
|
-
* }
|
|
161
|
-
* onKeyDown(event: { key: string }): void {
|
|
162
|
-
* if (event.key === 'Escape') this.context?.setMode('select');
|
|
163
|
-
* }
|
|
164
|
-
* }
|
|
165
|
-
*
|
|
166
|
-
* draw.registerMode('probe', () => new ProbeMode());
|
|
167
|
-
* draw.setMode('probe');
|
|
168
|
-
* ```
|
|
169
|
-
*/
|
|
170
|
-
export interface ModeHandler {
|
|
171
|
-
/** The name the mode is registered under */
|
|
172
|
-
readonly modeName: Mode;
|
|
173
|
-
/**
|
|
174
|
-
* Whether the mode writes new features into a layer
|
|
175
|
-
*
|
|
176
|
-
* A mode that declares true is entered only while a layer can be written (while
|
|
177
|
-
* `ModeContext.getCurrentLayerId` returns a non-empty string); otherwise setMode is ignored
|
|
178
|
-
* and the current mode is kept. The built-in drawing modes declare it, and a plugin mode
|
|
179
|
-
* that creates features declares it to get the same gate. The declaration does not remove
|
|
180
|
-
* the check at commit time: the layer can stop being writable while the mode is active.
|
|
181
|
-
*/
|
|
182
|
-
readonly writesFeatures?: boolean;
|
|
183
|
-
/** Called when the mode becomes the current mode; keep the context for later */
|
|
184
|
-
onStart?(context: ModeContext): void;
|
|
185
|
-
/** Called when another mode replaces it or the draw instance is destroyed */
|
|
186
|
-
onStop?(): void;
|
|
187
|
-
/** Called on a click */
|
|
188
|
-
onClick?(event: MouseNormalizedEvent): void;
|
|
189
|
-
/** Called on a double click */
|
|
190
|
-
onDoubleClick?(event: MouseNormalizedEvent): void;
|
|
191
|
-
/** Called on a mouse move */
|
|
192
|
-
onMouseMove?(event: MouseNormalizedEvent): void;
|
|
193
|
-
/**
|
|
194
|
-
* Called on a mouse down
|
|
195
|
-
* @returns returning true consumes the event (stops the propagation to MapLibre)
|
|
196
|
-
*/
|
|
197
|
-
onMouseDown?(event: MouseNormalizedEvent): boolean | undefined;
|
|
198
|
-
/** Called on a mouse up */
|
|
199
|
-
onMouseUp?(event: MouseNormalizedEvent): void;
|
|
200
|
-
/** Called when a drag starts */
|
|
201
|
-
onDragStart?(event: DragNormalizedEvent): void;
|
|
202
|
-
/** Called during a drag */
|
|
203
|
-
onDragMove?(event: DragNormalizedEvent): void;
|
|
204
|
-
/** Called when a drag ends */
|
|
205
|
-
onDragEnd?(event: DragNormalizedEvent): void;
|
|
206
|
-
/**
|
|
207
|
-
* Called when a press ends without a release (a second finger touched the screen, or the
|
|
208
|
-
* browser cancelled the touch)
|
|
209
|
-
*
|
|
210
|
-
* Nothing is decided: the mode abandons the press, restores what the press changed and
|
|
211
|
-
* gives the pan back to MapLibre. It can arrive before onDragStart (a press that has not
|
|
212
|
-
* become a drag yet). The coordinates are the last known position.
|
|
213
|
-
*/
|
|
214
|
-
onDragCancel?(event: DragNormalizedEvent): void;
|
|
215
|
-
/** Called on a key down (normalized) */
|
|
216
|
-
onKeyDown?(event: KeyNormalizedEvent): void;
|
|
217
|
-
/** Called on a key up (normalized) */
|
|
218
|
-
onKeyUp?(event: KeyNormalizedEvent): void;
|
|
219
|
-
/**
|
|
220
|
-
* Called after an external state change
|
|
221
|
-
*
|
|
222
|
-
* Used to reset the internal state of the mode after an external state change
|
|
223
|
-
* (a change applied from outside the mode) has been carried out.
|
|
224
|
-
* Example: when the state is changed externally while drawing in the Circle mode,
|
|
225
|
-
* the drawing state is reset.
|
|
226
|
-
*/
|
|
227
|
-
onExternalStateChange?(): void;
|
|
228
|
-
/**
|
|
229
|
-
* Called after a selection change
|
|
230
|
-
*
|
|
231
|
-
* Used to update the internal state of the mode when the selection is changed from a plugin.
|
|
232
|
-
*/
|
|
233
|
-
onSelectionChange?(): void;
|
|
234
|
-
/**
|
|
235
|
-
* Undoes a vertex while drawing
|
|
236
|
-
*
|
|
237
|
-
* Called when Cmd+Z/Ctrl+Z is pressed while drawing a LineString/Polygon.
|
|
238
|
-
* @returns whether the undo was carried out
|
|
239
|
-
*/
|
|
240
|
-
undoVertex?(): boolean;
|
|
241
|
-
/**
|
|
242
|
-
* Redoes a vertex that was undone
|
|
243
|
-
*
|
|
244
|
-
* Called when Cmd+Shift+Z/Ctrl+Y is pressed while drawing.
|
|
245
|
-
* @returns whether the redo was carried out
|
|
246
|
-
*/
|
|
247
|
-
redoVertex?(): boolean;
|
|
248
|
-
/**
|
|
249
|
-
* Returns the feature to prefer when snapping candidates are tied
|
|
250
|
-
*
|
|
251
|
-
* Read by InputRouter right before it passes the coordinates through snapping, and passed as
|
|
252
|
-
* the preferFeature of SnapContext. A drawing mode returns the anchor of the trace (the
|
|
253
|
-
* boundary it started tracing along), which prevents the snap target from jumping to another
|
|
254
|
-
* feature whose coordinates overlap exactly.
|
|
255
|
-
*
|
|
256
|
-
* @returns the feature to prefer, or null if there is none
|
|
257
|
-
*/
|
|
258
|
-
getSnapPreference?(): {
|
|
259
|
-
featureId: string;
|
|
260
|
-
datasetId?: string;
|
|
261
|
-
} | null;
|
|
262
|
-
/**
|
|
263
|
-
* Returns, per input type, whether snapping is to be applied
|
|
264
|
-
*
|
|
265
|
-
* Read by InputRouter right before it passes the coordinates through snapping. An input type
|
|
266
|
-
* for which false is returned does not go through SnapService and reaches the mode with its
|
|
267
|
-
* raw coordinates. When this is omitted (and when true is returned), snapping is applied as
|
|
268
|
-
* before.
|
|
269
|
-
*
|
|
270
|
-
* The tolerance (10 pixels by default) is a value premised on "once per click", so in a
|
|
271
|
-
* drag-driven drawing that passes several hundred points in a single stroke (freehand), the
|
|
272
|
-
* intermediate sample points are pulled one after another to nearby vertices and a line drawn
|
|
273
|
-
* straight ends up bent. A port that can be switched off per input type is provided so that
|
|
274
|
-
* only the inside of the stroke can be let through untouched (the start point and the end
|
|
275
|
-
* point can remain snapped).
|
|
276
|
-
*
|
|
277
|
-
* @param inputType the type of the input for which snapping is about to be applied
|
|
278
|
-
* @returns true if snapping is to be applied
|
|
279
|
-
*/
|
|
280
|
-
isSnapEnabledFor?(inputType: SnapInputType): boolean;
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Creates a new {@link ModeHandler}; called every time the mode is entered.
|
|
284
|
-
*/
|
|
285
|
-
export type ModeFactory = () => ModeHandler;
|
|
1
|
+
export {};
|
package/dist/modes/manager.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { EngineModeHandler } from './handler.js';
|
|
2
2
|
/**
|
|
3
3
|
* Options of ModeManagerImpl
|
|
4
4
|
*/
|
|
@@ -11,5 +11,5 @@ export interface ModeManagerOptions {
|
|
|
11
11
|
* `writesFeatures`). When it returns false the request is ignored and the current mode is
|
|
12
12
|
* kept, like the interaction lock. When it is omitted, every registered mode can be entered.
|
|
13
13
|
*/
|
|
14
|
-
canEnter?: (handler:
|
|
14
|
+
canEnter?: (handler: EngineModeHandler) => boolean;
|
|
15
15
|
}
|
package/dist/modes/manager.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { BoxSelection, Coordinate, Feature } from '../../store/types.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { EngineModeContext } from '../handler.js';
|
|
3
3
|
/**
|
|
4
4
|
* Detect the features inside the box
|
|
5
5
|
*
|
|
6
6
|
* First the candidates are obtained quickly through the SpatialIndex (rbush),
|
|
7
7
|
* and then a precise inside-the-box test is performed.
|
|
8
8
|
*/
|
|
9
|
-
export declare function queryFeaturesInBox(boxSelection: BoxSelection, context:
|
|
9
|
+
export declare function queryFeaturesInBox(boxSelection: BoxSelection, context: EngineModeContext): string[];
|
|
10
10
|
type Rect = {
|
|
11
11
|
minX: number;
|
|
12
12
|
minY: number;
|
|
@@ -37,7 +37,7 @@ export declare function isFeatureInBox(feature: Feature, rect: {
|
|
|
37
37
|
minY: number;
|
|
38
38
|
maxX: number;
|
|
39
39
|
maxY: number;
|
|
40
|
-
}, boxSelectionRegistry:
|
|
40
|
+
}, boxSelectionRegistry: EngineModeContext['boxSelectionRegistry']): boolean;
|
|
41
41
|
/**
|
|
42
42
|
* The fallback box selection test
|
|
43
43
|
*
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Responsible for handling box selection in select mode
|
|
7
7
|
*/
|
|
8
|
+
import { coordinatesOf } from '../../shared/utils/coordinates.js';
|
|
8
9
|
import { isLocallyHidden } from '../../store/local-visibility.js';
|
|
9
10
|
/**
|
|
10
11
|
* Detect the features inside the box
|
|
@@ -111,7 +112,7 @@ export function fallbackBoxSelection(feature, rect) {
|
|
|
111
112
|
coord[1] >= rect.minY &&
|
|
112
113
|
coord[1] <= rect.maxY);
|
|
113
114
|
};
|
|
114
|
-
const coords = feature
|
|
115
|
+
const coords = coordinatesOf(feature);
|
|
115
116
|
// When the coordinates are a single point
|
|
116
117
|
if (Array.isArray(coords) &&
|
|
117
118
|
coords.length === 2 &&
|
|
@@ -8,25 +8,25 @@
|
|
|
8
8
|
* (LineString / Polygon / the Multi types) -> vertex selection
|
|
9
9
|
* 3. Unified z traversal (hitTestTopmost) -> if it is a Store feature, the selection is
|
|
10
10
|
* updated / shift+click toggles / re-clicking an already selected feature is delegated to
|
|
11
|
-
*
|
|
11
|
+
* plugins.handleFeatureClick.
|
|
12
12
|
* If a dataset is in the foreground, Store features are not grabbed and it
|
|
13
13
|
* is treated as clearing the selection.
|
|
14
14
|
* If a feature companion is in the foreground, the click is consumed and passed to the
|
|
15
15
|
* provider (the selection is left unchanged)
|
|
16
16
|
*
|
|
17
|
-
* Double click: selects the feature and notifies
|
|
17
|
+
* Double click: selects the feature and notifies plugins.handleFeatureDoubleClick
|
|
18
18
|
*/
|
|
19
19
|
import type { MouseNormalizedEvent } from '../../dispatcher/types.js';
|
|
20
20
|
import type { SelectionUIConfig } from '../../shared/config/selection.js';
|
|
21
|
-
import type {
|
|
21
|
+
import type { EngineModeContext } from '../handler.js';
|
|
22
22
|
/**
|
|
23
23
|
* The main logic of onClick
|
|
24
24
|
*/
|
|
25
|
-
export declare function handleSelectClick(event: MouseNormalizedEvent, context:
|
|
25
|
+
export declare function handleSelectClick(event: MouseNormalizedEvent, context: EngineModeContext, config: SelectionUIConfig): void;
|
|
26
26
|
/**
|
|
27
27
|
* The main logic of onDoubleClick
|
|
28
28
|
*
|
|
29
29
|
* A double click on a feature is consumed (its default action is prevented, so MapLibre does
|
|
30
30
|
* not zoom); a double click on the empty map is left to MapLibre.
|
|
31
31
|
*/
|
|
32
|
-
export declare function handleSelectDoubleClick(event: MouseNormalizedEvent, context:
|
|
32
|
+
export declare function handleSelectDoubleClick(event: MouseNormalizedEvent, context: EngineModeContext): void;
|
|
@@ -30,7 +30,7 @@ export function handleSelectClick(event, context, config) {
|
|
|
30
30
|
* not zoom); a double click on the empty map is left to MapLibre.
|
|
31
31
|
*/
|
|
32
32
|
export function handleSelectDoubleClick(event, context) {
|
|
33
|
-
if (context.
|
|
33
|
+
if (context.plugins?.isPluginInteracting())
|
|
34
34
|
return;
|
|
35
35
|
const { store } = context;
|
|
36
36
|
const orderedFeatures = getDisplayFeatures(store);
|
|
@@ -39,13 +39,11 @@ export function handleSelectDoubleClick(event, context) {
|
|
|
39
39
|
if (top?.kind !== 'store')
|
|
40
40
|
return;
|
|
41
41
|
event.originalEvent.preventDefault();
|
|
42
|
-
const filtered = context.
|
|
43
|
-
top.feature.id,
|
|
44
|
-
];
|
|
42
|
+
const filtered = context.plugins?.filterSelectionCandidates([top.feature.id]) ?? [top.feature.id];
|
|
45
43
|
if (filtered.length > 0) {
|
|
46
44
|
store.setSelection('feature', filtered);
|
|
47
45
|
}
|
|
48
|
-
context.
|
|
46
|
+
context.plugins?.handleFeatureDoubleClick(top.feature.id, event);
|
|
49
47
|
}
|
|
50
48
|
/**
|
|
51
49
|
* Click handling during a plugin interaction
|
|
@@ -53,7 +51,7 @@ export function handleSelectDoubleClick(event, context) {
|
|
|
53
51
|
* @returns true when the click was consumed (= the caller skips the rest of the handling)
|
|
54
52
|
*/
|
|
55
53
|
function handlePluginInteractionClick(event, context) {
|
|
56
|
-
const pm = context.
|
|
54
|
+
const pm = context.plugins;
|
|
57
55
|
if (!pm?.isPluginInteracting())
|
|
58
56
|
return false;
|
|
59
57
|
const container = pm.getPluginInteractionContainer();
|
|
@@ -91,20 +89,20 @@ function handleVertexClick(event, selectedIds, context, config) {
|
|
|
91
89
|
if (!featureId)
|
|
92
90
|
return false;
|
|
93
91
|
const vertexRef = handleHit.vertexRef;
|
|
94
|
-
const currentVertexSelection = store.
|
|
92
|
+
const currentVertexSelection = store.getVertexSelection();
|
|
95
93
|
if (event.modifiers.shift && currentVertexSelection?.featureId === featureId) {
|
|
96
94
|
// Shift+click: add / remove a vertex of the same feature
|
|
97
|
-
const refs = currentVertexSelection.
|
|
95
|
+
const refs = currentVertexSelection.vertices;
|
|
98
96
|
if (hasVertexRef(refs, vertexRef)) {
|
|
99
97
|
const newRefs = refs.filter((r) => !isSameVertexRef(r, vertexRef));
|
|
100
|
-
store.setSelectedVertices(newRefs.length === 0 ? null : { featureId,
|
|
98
|
+
store.setSelectedVertices(newRefs.length === 0 ? null : { featureId, vertices: newRefs });
|
|
101
99
|
}
|
|
102
100
|
else {
|
|
103
|
-
store.setSelectedVertices({ featureId,
|
|
101
|
+
store.setSelectedVertices({ featureId, vertices: [...refs, vertexRef] });
|
|
104
102
|
}
|
|
105
103
|
}
|
|
106
104
|
else {
|
|
107
|
-
store.setSelectedVertices({ featureId,
|
|
105
|
+
store.setSelectedVertices({ featureId, vertices: [vertexRef] });
|
|
108
106
|
}
|
|
109
107
|
return true;
|
|
110
108
|
}
|
|
@@ -114,17 +112,21 @@ function handleVertexClick(event, selectedIds, context, config) {
|
|
|
114
112
|
function handleFeatureClick(event, selection, selectedIds, context) {
|
|
115
113
|
const { store } = context;
|
|
116
114
|
const orderedFeatures = getDisplayFeatures(store);
|
|
117
|
-
|
|
118
|
-
// A feature companion is in the foreground: the provider receives the click
|
|
119
|
-
// the selection in no way at all (not even clearing it as an empty click
|
|
120
|
-
//
|
|
115
|
+
let top = context.hitTestTopmost(event.point, { orderedFeatures });
|
|
116
|
+
// A feature companion is in the foreground: the provider receives the click. When it consumes
|
|
117
|
+
// it, core changes the selection in no way at all (not even clearing it as an empty click
|
|
118
|
+
// would); when it leaves it, the click is one on the feature that owns the companion
|
|
121
119
|
if (top?.kind === 'companion') {
|
|
122
|
-
notifyFeatureCompanionClick(context.featureCompanions, top.companion)
|
|
123
|
-
|
|
120
|
+
if (notifyFeatureCompanionClick(context.featureCompanions, top.companion, event))
|
|
121
|
+
return;
|
|
122
|
+
const owner = store.getFeature(top.companion.featureId);
|
|
123
|
+
if (!owner)
|
|
124
|
+
return;
|
|
125
|
+
top = { kind: 'store', feature: owner };
|
|
124
126
|
}
|
|
125
127
|
// When there is nothing, and when a dataset is in the foreground, Store
|
|
126
128
|
// features are not grabbed. A dataset's click fires only when the intercepting side
|
|
127
|
-
// (
|
|
129
|
+
// (dataset/interaction) is interactive.
|
|
128
130
|
if (top?.kind !== 'store') {
|
|
129
131
|
if (!event.modifiers.shift) {
|
|
130
132
|
store.setSelection(null, []);
|
|
@@ -134,7 +136,7 @@ function handleFeatureClick(event, selection, selectedIds, context) {
|
|
|
134
136
|
const feature = top.feature;
|
|
135
137
|
// Re-clicking an already selected feature -> delegate to the plugins
|
|
136
138
|
if (!event.modifiers.shift && selectedIds.length === 1 && selectedIds.includes(feature.id)) {
|
|
137
|
-
if (context.
|
|
139
|
+
if (context.plugins?.handleFeatureClick(feature.id, event)) {
|
|
138
140
|
return;
|
|
139
141
|
}
|
|
140
142
|
}
|
|
@@ -142,7 +144,7 @@ function handleFeatureClick(event, selection, selectedIds, context) {
|
|
|
142
144
|
const candidateIds = event.modifiers.shift
|
|
143
145
|
? toggleSelection(selection, feature.id)
|
|
144
146
|
: [feature.id];
|
|
145
|
-
const filtered = context.
|
|
147
|
+
const filtered = context.plugins?.filterSelectionCandidates(candidateIds) ?? candidateIds;
|
|
146
148
|
if (filtered.length === 0) {
|
|
147
149
|
store.setSelection(null, []);
|
|
148
150
|
}
|
|
@@ -11,5 +11,5 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { MouseNormalizedEvent } from '../../dispatcher/types.js';
|
|
13
13
|
import type { SelectionUIConfig } from '../../shared/config/selection.js';
|
|
14
|
-
import type {
|
|
15
|
-
export declare function updateCursorForSelection(event: MouseNormalizedEvent, context:
|
|
14
|
+
import type { EngineModeContext } from '../handler.js';
|
|
15
|
+
export declare function updateCursorForSelection(event: MouseNormalizedEvent, context: EngineModeContext, config: SelectionUIConfig): void;
|
|
@@ -128,7 +128,7 @@ export class IntermediateWrites {
|
|
|
128
128
|
*
|
|
129
129
|
* The last value of every feature that was touched (including features that followed along
|
|
130
130
|
* through a shared vertex) is rewritten as a committed update (no options), gathered into a
|
|
131
|
-
* single store.transact. Because it is notified as one
|
|
131
|
+
* single store.transact. Because it is notified as one StoreChange, a subscriber that records
|
|
132
132
|
* changes can treat this batch as a single step with its existing mechanism.
|
|
133
133
|
*
|
|
134
134
|
* The committed value is simply the last diff that was recorded. That way it does not depend
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
import { mapCoordinatesDeep } from '../../../shared/utils/coordinates.js';
|
|
3
|
+
import { coordinatesOf, geometryFromCoordinates, mapCoordinatesDeep, } from '../../../shared/utils/coordinates.js';
|
|
4
4
|
import { dragStartLngLat } from './operation.js';
|
|
5
5
|
/**
|
|
6
6
|
* Translate coordinates
|
|
@@ -35,7 +35,7 @@ export class MoveDrag {
|
|
|
35
35
|
const initialCoords = this.state.initialCoordinates.get(id);
|
|
36
36
|
if (feature && initialCoords) {
|
|
37
37
|
const newCoords = translateCoordinates(initialCoords, dx, dy);
|
|
38
|
-
writes.write(store, id, {
|
|
38
|
+
writes.write(store, id, { geometry: geometryFromCoordinates(feature.type, newCoords) });
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -48,7 +48,7 @@ export function startMoveDrag(event, featureIds, store) {
|
|
|
48
48
|
for (const id of featureIds) {
|
|
49
49
|
const feature = store.getFeature(id);
|
|
50
50
|
if (feature) {
|
|
51
|
-
initialCoordinates.set(id, JSON.parse(JSON.stringify(feature
|
|
51
|
+
initialCoordinates.set(id, JSON.parse(JSON.stringify(coordinatesOf(feature))));
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
return new MoveDrag({
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { DragNormalizedEvent } from '../../../dispatcher/types.js';
|
|
10
10
|
import type { Feature } from '../../../store/types.js';
|
|
11
|
-
import type {
|
|
11
|
+
import type { EngineModeContext } from '../../handler.js';
|
|
12
12
|
/** The Store a drag writes to */
|
|
13
|
-
export type DragStore =
|
|
13
|
+
export type DragStore = EngineModeContext['store'];
|
|
14
14
|
/**
|
|
15
15
|
* The selection scope of the draw instance the drag belongs to (the resize and rotate
|
|
16
16
|
* strategies of custom types, and the auxiliary handle providers). Null before a drag starts
|
|
17
17
|
*/
|
|
18
|
-
export type DragScope =
|
|
18
|
+
export type DragScope = EngineModeContext['selectionScope'] | null;
|
|
19
19
|
/**
|
|
20
20
|
* The drag start position (the exact position before the 3-pixel movement)
|
|
21
21
|
*/
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
import { haversineDistanceMeters, initialBearingDegrees } from '../../../geometry/
|
|
3
|
+
import { haversineDistanceMeters, initialBearingDegrees } from '../../../geometry/distance.js';
|
|
4
|
+
import { drawProperties } from '../../../shared/properties.js';
|
|
5
|
+
import { coordinatesOf } from '../../../shared/utils/coordinates.js';
|
|
4
6
|
/** @internal */
|
|
5
7
|
export class RadiusDrag {
|
|
6
8
|
constructor(state) {
|
|
@@ -31,8 +33,7 @@ export class RadiusDrag {
|
|
|
31
33
|
const updates = {
|
|
32
34
|
properties: {
|
|
33
35
|
...feature.properties,
|
|
34
|
-
radiusMeters: newRadiusMeters,
|
|
35
|
-
radiusHandleAngle: newAngle,
|
|
36
|
+
...drawProperties({ radiusMeters: newRadiusMeters, radiusHandleAngle: newAngle }),
|
|
36
37
|
},
|
|
37
38
|
};
|
|
38
39
|
writes.write(store, this.state.featureId, updates);
|
|
@@ -45,5 +46,5 @@ export function startRadiusDrag(featureId, store) {
|
|
|
45
46
|
const feature = store.getFeature(featureId);
|
|
46
47
|
if (feature?.type !== 'Circle')
|
|
47
48
|
return null;
|
|
48
|
-
return new RadiusDrag({ featureId, center: feature
|
|
49
|
+
return new RadiusDrag({ featureId, center: coordinatesOf(feature) });
|
|
49
50
|
}
|
|
@@ -5,12 +5,12 @@ import type { DragNormalizedEvent } from '../../../dispatcher/types.js';
|
|
|
5
5
|
import type { HandleType } from '../../../shared/config/constants.js';
|
|
6
6
|
import type { Feature } from '../../../store/types.js';
|
|
7
7
|
import type { BoundingBoxCoords } from '../../../view/ui/selection-ui/index.js';
|
|
8
|
-
import type {
|
|
8
|
+
import type { EngineModeContext } from '../../handler.js';
|
|
9
9
|
import type { DragScope, DragStore } from './operation.js';
|
|
10
10
|
/**
|
|
11
11
|
* Start a resize drag from a bounding box handle
|
|
12
12
|
*/
|
|
13
|
-
export declare function startResizeDrag(event: DragNormalizedEvent, handle: HandleType, bbox: BoundingBoxCoords, features: Feature[], map:
|
|
13
|
+
export declare function startResizeDrag(event: DragNormalizedEvent, handle: HandleType, bbox: BoundingBoxCoords, features: Feature[], map: EngineModeContext['map'], scope: DragScope): ResizeDrag;
|
|
14
14
|
/**
|
|
15
15
|
* Start a rotate drag from the rotation handle, and set the DragState it draws from
|
|
16
16
|
*/
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
3
|
import { computeResize, startResize } from '../../../operations/resize.js';
|
|
4
4
|
import { computeRotation, getRotationDelta, startRotation } from '../../../operations/rotate.js';
|
|
5
|
+
import { drawProperties } from '../../../shared/properties.js';
|
|
6
|
+
import { geometryFromCoordinates } from '../../../shared/utils/coordinates.js';
|
|
5
7
|
import { computeBoundingBox } from '../../../view/ui/selection-ui/index.js';
|
|
6
8
|
import { dragStartLngLat, selectedFeaturesOf } from './operation.js';
|
|
7
9
|
// === Resize operation ===
|
|
@@ -33,19 +35,21 @@ export class ResizeDrag {
|
|
|
33
35
|
const resizeResults = computeResize(this.state, event.lngLat, [feature], this.scope?.extensions);
|
|
34
36
|
const result = resizeResults.get(feature.id);
|
|
35
37
|
if (result) {
|
|
36
|
-
const updates = {
|
|
38
|
+
const updates = {
|
|
39
|
+
geometry: geometryFromCoordinates(feature.type, result.coordinates),
|
|
40
|
+
};
|
|
37
41
|
// Update the scale property when there is one (Text, Image, etc.)
|
|
38
42
|
if (result.scale !== undefined) {
|
|
39
43
|
updates.properties = {
|
|
40
44
|
...feature.properties,
|
|
41
|
-
scale: result.scale,
|
|
45
|
+
...drawProperties({ scale: result.scale }),
|
|
42
46
|
};
|
|
43
47
|
}
|
|
44
48
|
// For a Circle, also update the radiusMeters property
|
|
45
49
|
if (result.radiusMeters !== undefined && feature.type === 'Circle') {
|
|
46
50
|
updates.properties = {
|
|
47
51
|
...feature.properties,
|
|
48
|
-
radiusMeters: result.radiusMeters,
|
|
52
|
+
...drawProperties({ radiusMeters: result.radiusMeters }),
|
|
49
53
|
};
|
|
50
54
|
}
|
|
51
55
|
// For a custom resize, also update the width / height properties (Note, etc.)
|
|
@@ -95,12 +99,14 @@ export class RotateDrag {
|
|
|
95
99
|
for (const [id, result] of rotateResults) {
|
|
96
100
|
const feature = store.getFeature(id);
|
|
97
101
|
if (feature) {
|
|
98
|
-
const updates = {
|
|
102
|
+
const updates = {
|
|
103
|
+
geometry: geometryFromCoordinates(feature.type, result.coordinates),
|
|
104
|
+
};
|
|
99
105
|
// Update the rotation property when there is one (Text, Image, Note, etc.)
|
|
100
106
|
if (result.rotation !== undefined) {
|
|
101
107
|
updates.properties = {
|
|
102
108
|
...feature.properties,
|
|
103
|
-
rotation: result.rotation,
|
|
109
|
+
...drawProperties({ rotation: result.rotation }),
|
|
104
110
|
};
|
|
105
111
|
}
|
|
106
112
|
writes.write(store, id, updates);
|