@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
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* When it does not hold, the caller drops to the previous vertex displacement path (a
|
|
17
17
|
* two-stage arrangement). The condition for dropping is decided here by `canDrape`.
|
|
18
18
|
*/
|
|
19
|
+
import { coordinatesOf } from '../../../shared/utils/coordinates.js';
|
|
19
20
|
import { getCreatedZoom } from '../../../shared/utils/property.js';
|
|
20
21
|
import { getDisplayFeatures, isLocallyHidden } from '../../../store/local-visibility.js';
|
|
21
22
|
import { layerDrawFactors } from '../../renderers/draw-factors.js';
|
|
@@ -229,7 +230,7 @@ function collectStoreFeature(context, feature, layer, source, bakedOpacity) {
|
|
|
229
230
|
*
|
|
230
231
|
* So that the retained batch side does not draw the same features that were put on, the caller
|
|
231
232
|
* tells the dataset "the polygons and lines are drawn by the drape"
|
|
232
|
-
* (`drapedDatasets`). The test here and `collectFeature` in `
|
|
233
|
+
* (`drapedDatasets`). The test here and `collectFeature` in `dataset/retained.ts` form a
|
|
233
234
|
* pair, so the condition must never be changed on only one side.
|
|
234
235
|
*/
|
|
235
236
|
function collectDataset(context, dataset, source) {
|
|
@@ -252,7 +253,7 @@ function collectDataset(context, dataset, source) {
|
|
|
252
253
|
if (rings.length === 0)
|
|
253
254
|
continue;
|
|
254
255
|
const width = widthOf(feature, strokeStyle.width, context.pixelRatio);
|
|
255
|
-
pushElement(context, feature
|
|
256
|
+
pushElement(context, coordinatesOf(feature), 0, rings, {
|
|
256
257
|
fill: fillColor,
|
|
257
258
|
stroke: [
|
|
258
259
|
strokeStyle.color[0],
|
|
@@ -281,7 +282,7 @@ function collectDataset(context, dataset, source) {
|
|
|
281
282
|
if (paths.length === 0)
|
|
282
283
|
continue;
|
|
283
284
|
const width = widthOf(feature, strokeStyle.width, context.pixelRatio);
|
|
284
|
-
pushElement(context, feature
|
|
285
|
+
pushElement(context, coordinatesOf(feature), 1, paths, {
|
|
285
286
|
fill: [0, 0, 0, 0],
|
|
286
287
|
stroke: [
|
|
287
288
|
strokeStyle.color[0],
|
|
@@ -313,14 +314,14 @@ function widthOf(feature, width, pixelRatio) {
|
|
|
313
314
|
/** The rings of a polygon (with the closing point dropped) */
|
|
314
315
|
function polygonRings(feature) {
|
|
315
316
|
return feature.type === 'Polygon'
|
|
316
|
-
? openRings(feature
|
|
317
|
-
: feature.
|
|
317
|
+
? openRings(coordinatesOf(feature))
|
|
318
|
+
: coordinatesOf(feature).flatMap((part) => openRings(part));
|
|
318
319
|
}
|
|
319
320
|
/** The paths of a line */
|
|
320
321
|
function linePaths(feature) {
|
|
321
322
|
const paths = feature.type === 'LineString' || feature.type === 'Freehand'
|
|
322
|
-
? [feature
|
|
323
|
-
: feature
|
|
323
|
+
? [coordinatesOf(feature)]
|
|
324
|
+
: coordinatesOf(feature);
|
|
324
325
|
return paths.filter((path) => path.length >= 2);
|
|
325
326
|
}
|
|
326
327
|
/** Pushes an element */
|
|
@@ -2,19 +2,23 @@
|
|
|
2
2
|
* The injection point for terrain subdivision of polygons
|
|
3
3
|
*
|
|
4
4
|
* Called from the polygon renderers (polygon/sdf-polygon.ts and polygon/batch.ts). When the
|
|
5
|
-
* terrain is disabled, `
|
|
5
|
+
* terrain is disabled, `terrainStepOf(context)` returns null and the caller does
|
|
6
6
|
* nothing. Rendering without terrain therefore does not change by a single byte.
|
|
7
7
|
*/
|
|
8
|
+
import type { TerrainAnchors } from '../../api/extension/context.js';
|
|
9
|
+
import type { RenderContext } from '../../api/extension/render.js';
|
|
8
10
|
import type { Coordinate } from '../../store/types.js';
|
|
9
11
|
import type { TerrainContext } from './context.js';
|
|
10
12
|
import { type MercatorRect, type TessellationStep } from './tessellation.js';
|
|
11
13
|
/**
|
|
12
|
-
* Returns the subdivision step of the terrain mesh for the current frame
|
|
14
|
+
* Returns the subdivision step of the terrain mesh for the current frame, to cut a shape so
|
|
15
|
+
* that it follows the terrain (pass it to `densifyPath`).
|
|
13
16
|
*
|
|
14
|
-
* @param
|
|
15
|
-
* @returns The step, or `null` when the terrain is disabled
|
|
17
|
+
* @param terrain - The render context of the draw call, or its `terrain`
|
|
18
|
+
* @returns The step, or `null` when the terrain is disabled (or the object was not handed out
|
|
19
|
+
* by the engine)
|
|
16
20
|
*/
|
|
17
|
-
export declare function
|
|
21
|
+
export declare function terrainTessellationStep(terrain: RenderContext | TerrainAnchors): TessellationStep | null;
|
|
18
22
|
/**
|
|
19
23
|
* Decides the effective step for a single feature
|
|
20
24
|
*
|
|
@@ -1,16 +1,30 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { terrainStateOf } from './binding.js';
|
|
3
4
|
import { TERRAIN_MAX_BATCH_SUBDIVISION_CELLS, TERRAIN_MAX_COARSEN_STEPS, TERRAIN_MAX_SUBDIVISION_POINTS, TERRAIN_MAX_TILED_SUBDIVISION_POINTS, } from './metrics.js';
|
|
4
5
|
import { getTerrainRenderState } from './state.js';
|
|
5
6
|
import { cellsInRegion, densifyRings, mercatorX, mercatorY, rectsIntersect, subdivideTriangles, } from './tessellation.js';
|
|
6
7
|
import { tilingSignature } from './tiling.js';
|
|
7
8
|
/**
|
|
8
|
-
* Returns the subdivision step of the terrain mesh for the current frame
|
|
9
|
+
* Returns the subdivision step of the terrain mesh for the current frame, to cut a shape so
|
|
10
|
+
* that it follows the terrain (pass it to `densifyPath`).
|
|
11
|
+
*
|
|
12
|
+
* @param terrain - The render context of the draw call, or its `terrain`
|
|
13
|
+
* @returns The step, or `null` when the terrain is disabled (or the object was not handed out
|
|
14
|
+
* by the engine)
|
|
15
|
+
*/
|
|
16
|
+
export function terrainTessellationStep(terrain) {
|
|
17
|
+
const state = terrainStateOf(terrain);
|
|
18
|
+
return state ? terrainStepOf(state) : null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* {@link terrainTessellationStep} over the terrain state of an instance
|
|
9
22
|
*
|
|
10
23
|
* @param context The terrain state of the draw instance
|
|
11
24
|
* @returns The step, or `null` when the terrain is disabled
|
|
25
|
+
* @internal
|
|
12
26
|
*/
|
|
13
|
-
export function
|
|
27
|
+
export function terrainStepOf(context) {
|
|
14
28
|
const terrain = getTerrainRenderState(context);
|
|
15
29
|
if (!terrain.active || !(terrain.stepGrid > 0))
|
|
16
30
|
return null;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* (`context.ts`; how a shared global broke with several instances is written there). Every
|
|
7
7
|
* accessor takes that context explicitly: the renderers of a CustomLayer receive their
|
|
8
8
|
* instance's context at construction, and extension renderers receive it in the draw context
|
|
9
|
-
* (`
|
|
9
|
+
* (`FrameDrawContext.terrain`). Nothing here reads "the instance drawn last".
|
|
10
10
|
*
|
|
11
11
|
* When the terrain is disabled, `INACTIVE_TERRAIN_STATE` is held and the shader's
|
|
12
12
|
* `u_terrain_on` becomes 0. The vertex computation when it is 0 is exactly identical to
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* (`context.ts`; how a shared global broke with several instances is written there). Every
|
|
9
9
|
* accessor takes that context explicitly: the renderers of a CustomLayer receive their
|
|
10
10
|
* instance's context at construction, and extension renderers receive it in the draw context
|
|
11
|
-
* (`
|
|
11
|
+
* (`FrameDrawContext.terrain`). Nothing here reads "the instance drawn last".
|
|
12
12
|
*
|
|
13
13
|
* When the terrain is disabled, `INACTIVE_TERRAIN_STATE` is held and the shader's
|
|
14
14
|
* `u_terrain_on` becomes 0. The vertex computation when it is 0 is exactly identical to
|
|
@@ -47,7 +47,7 @@ export interface MercatorRect {
|
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
49
|
* How finely a line or a fill is subdivided to follow the terrain mesh, as
|
|
50
|
-
* {@link
|
|
50
|
+
* {@link terrainTessellationStep} returns it.
|
|
51
51
|
*/
|
|
52
52
|
export interface TessellationStep {
|
|
53
53
|
/**
|
|
@@ -193,7 +193,7 @@ export declare function latFromMercatorY(y: number): number;
|
|
|
193
193
|
* on the original line).
|
|
194
194
|
*
|
|
195
195
|
* @param path The vertices `[lng, lat]` in degrees
|
|
196
|
-
* @param step The step from {@link
|
|
196
|
+
* @param step The step from {@link terrainTessellationStep}
|
|
197
197
|
* @returns The densified vertices. The input itself for fewer than 2 positions or a step of
|
|
198
198
|
* 0; insertion stops when `step.maxPoints` is reached
|
|
199
199
|
*/
|
|
@@ -91,7 +91,7 @@ export function latFromMercatorY(y) {
|
|
|
91
91
|
* on the original line).
|
|
92
92
|
*
|
|
93
93
|
* @param path The vertices `[lng, lat]` in degrees
|
|
94
|
-
* @param step The step from {@link
|
|
94
|
+
* @param step The step from {@link terrainTessellationStep}
|
|
95
95
|
* @returns The densified vertices. The input itself for fewer than 2 positions or a step of
|
|
96
96
|
* 0; insertion stops when `step.maxPoints` is reached
|
|
97
97
|
*/
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Extension point for the auxiliary handles
|
|
3
3
|
*
|
|
4
4
|
* A general-purpose hook for showing and grabbing handles on the selected feature that are
|
|
5
|
-
* "neither a vertex nor a resize handle".
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* "neither a vertex nor a resize handle". Core draws them with the look of the vertex handles
|
|
6
|
+
* (the selection UI), hit tests them at the same size and delegates their drags. core knows
|
|
7
|
+
* nothing at all about the meaning of a handle (it only carries the position and the
|
|
8
|
+
* identifier).
|
|
9
9
|
*
|
|
10
10
|
* There are two ways to emit handles: those bound to the selected feature (getHandles) and
|
|
11
11
|
* those that can always be emitted regardless of the selection (getGlobalHandles). The
|
|
@@ -72,31 +72,8 @@ export interface AuxiliaryHandleHit {
|
|
|
72
72
|
* A source of handles on the selected feature that are neither vertices nor resize handles,
|
|
73
73
|
* and the receiver of their drags.
|
|
74
74
|
*
|
|
75
|
-
*
|
|
76
|
-
* the handles
|
|
77
|
-
* renderer, for example).
|
|
78
|
-
*
|
|
79
|
-
* @example
|
|
80
|
-
* ```ts
|
|
81
|
-
* import type { AuxiliaryHandleProvider } from '@sakuzu/maplibre-gl-draw';
|
|
82
|
-
*
|
|
83
|
-
* // A handle 20 px above the first vertex of the selected line, which logs its drag
|
|
84
|
-
* const labelHandle: AuxiliaryHandleProvider = {
|
|
85
|
-
* id: 'label-handle',
|
|
86
|
-
* getHandles(feature, ctx) {
|
|
87
|
-
* if (feature.type !== 'LineString') return [];
|
|
88
|
-
* const first = (feature.coordinates as [number, number][])[0];
|
|
89
|
-
* const p = ctx.project(first);
|
|
90
|
-
* const { lng, lat } = ctx.unproject({ x: p.x, y: p.y - 20 });
|
|
91
|
-
* return [{ id: 'label', position: [lng, lat], cursor: 'move' }];
|
|
92
|
-
* },
|
|
93
|
-
* onHandleDragStart: () => true,
|
|
94
|
-
* onHandleDragMove: (event) => console.log(event.lngLat),
|
|
95
|
-
* onHandleDragEnd: () => {},
|
|
96
|
-
* };
|
|
97
|
-
*
|
|
98
|
-
* const unregister = draw.registerAuxiliaryHandleProvider(labelHandle);
|
|
99
|
-
* ```
|
|
75
|
+
* A `HandleProvider` of `draw.extensions.handleProviders` is installed as one. The engine draws
|
|
76
|
+
* the handles with the look of the vertex handles, hit tests them and delegates their drags.
|
|
100
77
|
*/
|
|
101
78
|
export interface AuxiliaryHandleProvider {
|
|
102
79
|
/** Identifier unique within the registry (re-registering with the same id overwrites) */
|
package/dist/view/ui/bounds.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
3
|
import { applyMarginToBoundingBox } from '../../shared/math/index.js';
|
|
4
|
-
import { computeBoundingBox, hasZeroArea,
|
|
4
|
+
import { computeBoundingBox, hasZeroArea, resolvePointFrameCornersWith, } from './selection-ui/index.js';
|
|
5
5
|
/**
|
|
6
6
|
* Compute the bounding box with a margin of a feature in geographic coordinates
|
|
7
7
|
*
|
|
@@ -82,7 +82,8 @@ export function computeCombinedGeoBoundingBox(features, transform, config, exten
|
|
|
82
82
|
/**
|
|
83
83
|
* Compute the bounding box with a margin of a single-coordinate feature in geographic coordinates
|
|
84
84
|
*
|
|
85
|
-
* The extent of the frame of a point (registrable per type;
|
|
85
|
+
* The extent of the frame of a point (registrable per type; the marker of a built-in point, or
|
|
86
|
+
* a 12px square when unregistered)
|
|
86
87
|
* plus the margin is computed in screen coordinates and converted into geographic ones.
|
|
87
88
|
* The coordinate received is the center of the bbox (since features other than Point can
|
|
88
89
|
* also be zero-area, e.g. a MultiPoint with a single point; coordinates must not be
|
|
@@ -90,17 +91,12 @@ export function computeCombinedGeoBoundingBox(features, transform, config, exten
|
|
|
90
91
|
*/
|
|
91
92
|
function computeSingleCoordGeoBoundingBox(feature, coord, transform, margin, extensions) {
|
|
92
93
|
const center = transform.project(coord);
|
|
93
|
-
// The
|
|
94
|
-
const
|
|
95
|
-
? extensions.
|
|
96
|
-
:
|
|
97
|
-
const halfWidth = extent.halfWidth + margin;
|
|
98
|
-
const halfHeight = extent.halfHeight + margin;
|
|
94
|
+
// The corners of the frame of the point (its outline, or its extent) + the margin
|
|
95
|
+
const corners = extensions
|
|
96
|
+
? extensions.resolvePointFrameCorners(feature, center, margin)
|
|
97
|
+
: resolvePointFrameCornersWith(undefined, undefined, feature, center, margin);
|
|
99
98
|
// Convert the 4 corners in screen coordinates into geographic coordinates
|
|
100
|
-
const topLeft =
|
|
101
|
-
const topRight = transform.unproject({ x: center.x + halfWidth, y: center.y - halfHeight });
|
|
102
|
-
const bottomRight = transform.unproject({ x: center.x + halfWidth, y: center.y + halfHeight });
|
|
103
|
-
const bottomLeft = transform.unproject({ x: center.x - halfWidth, y: center.y + halfHeight });
|
|
99
|
+
const [topLeft, topRight, bottomRight, bottomLeft] = corners.map((corner) => transform.unproject(corner));
|
|
104
100
|
return {
|
|
105
101
|
topLeft: [topLeft.lng, topLeft.lat],
|
|
106
102
|
topRight: [topRight.lng, topRight.lat],
|
|
@@ -216,8 +216,8 @@ function hitTestCircleRadiusHandle(feature, config, params) {
|
|
|
216
216
|
*
|
|
217
217
|
* Enumerating the handles is left to the callback (the aggregation of the providers), while
|
|
218
218
|
* the test is done with the same screen-px rectangle as the existing handles. To keep the
|
|
219
|
-
* grab feel uniform, the test size is the same as for the vertex handles
|
|
220
|
-
*
|
|
219
|
+
* grab feel uniform, the test size is the same as for the vertex handles, which is also the
|
|
220
|
+
* size the selection UI draws them at.
|
|
221
221
|
*/
|
|
222
222
|
function hitTestAuxiliaryHandles(feature, config, zoom, params, getAuxiliaryHandles) {
|
|
223
223
|
const context = {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { HANDLE_THINNING_THRESHOLD, MIDPOINT_MIN_EDGE_PX, MIN_HANDLE_SPACING_PX, THINNING_REFRESH_DEBOUNCE_MS, } from '../../shared/config/selection.js';
|
|
16
16
|
import { mercatorMidpoint } from '../../shared/math/globe-subdivision.js';
|
|
17
|
-
import { supportsVertexEditing } from '../../shared/utils/coordinates.js';
|
|
17
|
+
import { coordinatesOf, supportsVertexEditing } from '../../shared/utils/coordinates.js';
|
|
18
18
|
import { isSameVertexRef } from '../../shared/utils/vertex-ref.js';
|
|
19
19
|
/**
|
|
20
20
|
* Decomposes a feature into scan units
|
|
@@ -26,15 +26,15 @@ import { isSameVertexRef } from '../../shared/utils/vertex-ref.js';
|
|
|
26
26
|
function collectHandleRuns(feature) {
|
|
27
27
|
const runs = [];
|
|
28
28
|
if (feature.type === 'LineString') {
|
|
29
|
-
pushLineRun(runs, feature
|
|
29
|
+
pushLineRun(runs, coordinatesOf(feature));
|
|
30
30
|
}
|
|
31
31
|
else if (feature.type === 'Polygon') {
|
|
32
|
-
pushPolygonRuns(runs, feature
|
|
32
|
+
pushPolygonRuns(runs, coordinatesOf(feature));
|
|
33
33
|
}
|
|
34
34
|
else if (feature.type === 'MultiPoint') {
|
|
35
35
|
// Splitting a MultiPoint per part would adopt every point and defeat the thinning, so
|
|
36
36
|
// all parts are scanned as a single sequence
|
|
37
|
-
const points = feature
|
|
37
|
+
const points = coordinatesOf(feature);
|
|
38
38
|
runs.push({
|
|
39
39
|
coords: points,
|
|
40
40
|
vertexCount: points.length,
|
|
@@ -44,13 +44,13 @@ function collectHandleRuns(feature) {
|
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
else if (feature.type === 'MultiLineString') {
|
|
47
|
-
const parts = feature
|
|
47
|
+
const parts = coordinatesOf(feature);
|
|
48
48
|
for (let part = 0; part < parts.length; part++) {
|
|
49
49
|
pushLineRun(runs, parts[part], part);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
else if (feature.type === 'MultiPolygon') {
|
|
53
|
-
const parts = feature
|
|
53
|
+
const parts = coordinatesOf(feature);
|
|
54
54
|
for (let part = 0; part < parts.length; part++) {
|
|
55
55
|
pushPolygonRuns(runs, parts[part], part);
|
|
56
56
|
}
|
|
@@ -112,25 +112,25 @@ export function countPotentialHandles(feature) {
|
|
|
112
112
|
if (feature.type === 'Point')
|
|
113
113
|
return 1;
|
|
114
114
|
if (feature.type === 'LineString') {
|
|
115
|
-
return countLineHandles(feature.
|
|
115
|
+
return countLineHandles(coordinatesOf(feature).length);
|
|
116
116
|
}
|
|
117
117
|
if (feature.type === 'Polygon') {
|
|
118
|
-
return countPolygonHandles(feature
|
|
118
|
+
return countPolygonHandles(coordinatesOf(feature));
|
|
119
119
|
}
|
|
120
120
|
if (feature.type === 'MultiPoint') {
|
|
121
121
|
// Each coordinate is the vertex handle of one part. There are no edges
|
|
122
|
-
return feature.
|
|
122
|
+
return coordinatesOf(feature).length;
|
|
123
123
|
}
|
|
124
124
|
if (feature.type === 'MultiLineString') {
|
|
125
125
|
let total = 0;
|
|
126
|
-
for (const part of feature
|
|
126
|
+
for (const part of coordinatesOf(feature)) {
|
|
127
127
|
total += countLineHandles(part.length);
|
|
128
128
|
}
|
|
129
129
|
return total;
|
|
130
130
|
}
|
|
131
131
|
if (feature.type === 'MultiPolygon') {
|
|
132
132
|
let total = 0;
|
|
133
|
-
for (const part of feature
|
|
133
|
+
for (const part of coordinatesOf(feature)) {
|
|
134
134
|
total += countPolygonHandles(part);
|
|
135
135
|
}
|
|
136
136
|
return total;
|
|
@@ -254,23 +254,23 @@ export function includeRequiredVertexRefs(set, required) {
|
|
|
254
254
|
function getRefCoords(feature, ref) {
|
|
255
255
|
const part = ref.part ?? 0;
|
|
256
256
|
if (feature.type === 'Point') {
|
|
257
|
-
return [feature
|
|
257
|
+
return [coordinatesOf(feature)];
|
|
258
258
|
}
|
|
259
259
|
if (feature.type === 'LineString') {
|
|
260
|
-
return feature
|
|
260
|
+
return coordinatesOf(feature);
|
|
261
261
|
}
|
|
262
262
|
if (feature.type === 'Polygon') {
|
|
263
|
-
return feature
|
|
263
|
+
return coordinatesOf(feature)[ref.ring] ?? null;
|
|
264
264
|
}
|
|
265
265
|
if (feature.type === 'MultiPoint') {
|
|
266
|
-
const point = feature
|
|
266
|
+
const point = coordinatesOf(feature)[part];
|
|
267
267
|
return point ? [point] : null;
|
|
268
268
|
}
|
|
269
269
|
if (feature.type === 'MultiLineString') {
|
|
270
|
-
return feature
|
|
270
|
+
return coordinatesOf(feature)[part] ?? null;
|
|
271
271
|
}
|
|
272
272
|
if (feature.type === 'MultiPolygon') {
|
|
273
|
-
return feature
|
|
273
|
+
return coordinatesOf(feature)[part]?.[ref.ring] ?? null;
|
|
274
274
|
}
|
|
275
275
|
return null;
|
|
276
276
|
}
|
package/dist/view/ui/handles.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
import { destinationPoint } from '../../geometry/
|
|
3
|
+
import { destinationPoint } from '../../geometry/distance.js';
|
|
4
4
|
import { mercatorMidpoint } from '../../shared/math/globe-subdivision.js';
|
|
5
5
|
import { applyMarginToBoundingBox, clampLatitude } from '../../shared/math/index.js';
|
|
6
|
+
import { coordinatesOf } from '../../shared/utils/coordinates.js';
|
|
6
7
|
import { getCircleRadius, getRadiusHandleAngle } from '../../shared/utils/property.js';
|
|
7
8
|
import { hasVertexRef, isSameVertexRef } from '../../shared/utils/vertex-ref.js';
|
|
8
9
|
import { includeRequiredVertexRefs, resolveMidpointCoordinate, resolveVertexCoordinate, } from './handle-thinning.js';
|
|
@@ -164,18 +165,18 @@ export function computeVertexHandles(feature, visibleSet) {
|
|
|
164
165
|
const handles = [];
|
|
165
166
|
if (feature.type === 'Point') {
|
|
166
167
|
// A Point is a single vertex
|
|
167
|
-
const coord = feature
|
|
168
|
+
const coord = coordinatesOf(feature);
|
|
168
169
|
handles.push({ type: 'vertex', position: coord, vertexRef: { ring: 0, index: 0 } });
|
|
169
170
|
}
|
|
170
171
|
else if (feature.type === 'LineString') {
|
|
171
|
-
collectLineVertexHandles(feature
|
|
172
|
+
collectLineVertexHandles(coordinatesOf(feature), handles);
|
|
172
173
|
}
|
|
173
174
|
else if (feature.type === 'Polygon') {
|
|
174
|
-
collectPolygonVertexHandles(feature
|
|
175
|
+
collectPolygonVertexHandles(coordinatesOf(feature), handles);
|
|
175
176
|
}
|
|
176
177
|
else if (feature.type === 'MultiPoint') {
|
|
177
178
|
// Each coordinate is one part. ring / index are always 0
|
|
178
|
-
const points = feature
|
|
179
|
+
const points = coordinatesOf(feature);
|
|
179
180
|
for (let part = 0; part < points.length; part++) {
|
|
180
181
|
handles.push({
|
|
181
182
|
type: 'vertex',
|
|
@@ -185,13 +186,13 @@ export function computeVertexHandles(feature, visibleSet) {
|
|
|
185
186
|
}
|
|
186
187
|
}
|
|
187
188
|
else if (feature.type === 'MultiLineString') {
|
|
188
|
-
const parts = feature
|
|
189
|
+
const parts = coordinatesOf(feature);
|
|
189
190
|
for (let part = 0; part < parts.length; part++) {
|
|
190
191
|
collectLineVertexHandles(parts[part], handles, part);
|
|
191
192
|
}
|
|
192
193
|
}
|
|
193
194
|
else if (feature.type === 'MultiPolygon') {
|
|
194
|
-
const parts = feature
|
|
195
|
+
const parts = coordinatesOf(feature);
|
|
195
196
|
for (let part = 0; part < parts.length; part++) {
|
|
196
197
|
collectPolygonVertexHandles(parts[part], handles, part);
|
|
197
198
|
}
|
|
@@ -208,7 +209,7 @@ export function computeCircleRadiusHandle(feature) {
|
|
|
208
209
|
if (feature.type !== 'Circle') {
|
|
209
210
|
return null;
|
|
210
211
|
}
|
|
211
|
-
const center = feature
|
|
212
|
+
const center = coordinatesOf(feature);
|
|
212
213
|
const radiusMeters = getCircleRadius(feature);
|
|
213
214
|
const radiusHandleAngle = getRadiusHandleAngle(feature);
|
|
214
215
|
if (!radiusMeters || radiusMeters <= 0) {
|
|
@@ -227,7 +228,7 @@ export function computeCircleCenterHandle(feature) {
|
|
|
227
228
|
if (feature.type !== 'Circle') {
|
|
228
229
|
return null;
|
|
229
230
|
}
|
|
230
|
-
const center = feature
|
|
231
|
+
const center = coordinatesOf(feature);
|
|
231
232
|
return {
|
|
232
233
|
type: 'center',
|
|
233
234
|
position: center,
|
|
@@ -283,19 +284,19 @@ export function computeMidpointHandles(feature, visibleSet) {
|
|
|
283
284
|
}
|
|
284
285
|
const handles = [];
|
|
285
286
|
if (feature.type === 'LineString') {
|
|
286
|
-
collectLineMidpointHandles(feature
|
|
287
|
+
collectLineMidpointHandles(coordinatesOf(feature), handles);
|
|
287
288
|
}
|
|
288
289
|
else if (feature.type === 'Polygon') {
|
|
289
|
-
collectPolygonMidpointHandles(feature
|
|
290
|
+
collectPolygonMidpointHandles(coordinatesOf(feature), handles);
|
|
290
291
|
}
|
|
291
292
|
else if (feature.type === 'MultiLineString') {
|
|
292
|
-
const parts = feature
|
|
293
|
+
const parts = coordinatesOf(feature);
|
|
293
294
|
for (let part = 0; part < parts.length; part++) {
|
|
294
295
|
collectLineMidpointHandles(parts[part], handles, part);
|
|
295
296
|
}
|
|
296
297
|
}
|
|
297
298
|
else if (feature.type === 'MultiPolygon') {
|
|
298
|
-
const parts = feature
|
|
299
|
+
const parts = coordinatesOf(feature);
|
|
299
300
|
for (let part = 0; part < parts.length; part++) {
|
|
300
301
|
collectPolygonMidpointHandles(parts[part], handles, part);
|
|
301
302
|
}
|
|
@@ -528,6 +529,13 @@ export class SelectionHandlesRenderer {
|
|
|
528
529
|
const handles = computeVertexHandles(feature).filter((h) => hasVertexRef(followedVertices, h.vertexRef));
|
|
529
530
|
this.drawHandlesWithStyle(handles, this.config.vertexHandle.followed, zoom);
|
|
530
531
|
}
|
|
532
|
+
/**
|
|
533
|
+
* Draws the auxiliary handles of the extensions with the look of the vertex handles, the
|
|
534
|
+
* size their hit test uses
|
|
535
|
+
*/
|
|
536
|
+
drawAuxiliaryHandles(positions, zoom) {
|
|
537
|
+
this.drawHandlesWithStyle(positions.map((position) => ({ position })), this.config.vertexHandle.point, zoom);
|
|
538
|
+
}
|
|
531
539
|
/**
|
|
532
540
|
* Draws a group of handles with a single style
|
|
533
541
|
*
|
package/dist/view/ui/helper.d.ts
CHANGED
|
@@ -16,4 +16,4 @@ import type { Store } from '../../store/store.js';
|
|
|
16
16
|
* @param store The Store to read the selection from
|
|
17
17
|
* @returns The feature ids. An empty array when nothing is selected
|
|
18
18
|
*/
|
|
19
|
-
export declare function getSelectedFeatureIds(store: Store): string[];
|
|
19
|
+
export declare function getSelectedFeatureIds(store: Store): readonly string[];
|
package/dist/view/ui/helper.js
CHANGED
package/dist/view/ui/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export { getCursorForHandle, hitTestGlobalAuxiliaryHandles, hitTestHandles, } fr
|
|
|
9
9
|
export type { HandleInfo } from './handles.js';
|
|
10
10
|
export { computeMidpointHandles, computeResizeHandles, computeRotateHandle, computeVertexHandles, SelectionHandlesRenderer, } from './handles.js';
|
|
11
11
|
export { computeSelectionBoundingBox, getSelectedFeatureIds, getSelectedFeatures, } from './helper.js';
|
|
12
|
-
export type { AdditionalHandleInfo, AdditionalResizeHandlesCalculator, BoundingBoxCoords, CustomBoundingBoxCalculator,
|
|
12
|
+
export type { AdditionalHandleInfo, AdditionalResizeHandlesCalculator, BoundingBoxCoords, CustomBoundingBoxCalculator, PointFrameExtent, PointFrameExtentProvider, ResizeStrategy, SelectionExtensionRegistry, TypeResizeCalculator, } from './selection-ui/index.js';
|
|
13
13
|
export { computeBoundingBox, computeCombinedBoundingBox, createSelectionExtensionRegistry, DEFAULT_POINT_FRAME_SIZE, rotateBoundingBox, SelectionUIRenderer, } from './selection-ui/index.js';
|
|
14
14
|
export type { TentativeRendererDeps } from './tentative.js';
|
|
15
15
|
export { TentativeRenderer } from './tentative.js';
|
|
@@ -15,10 +15,12 @@ import { createSelectionExtensionRegistry, } from './selection-ui/extension-regi
|
|
|
15
15
|
/**
|
|
16
16
|
* Creates the selection scope of one draw instance
|
|
17
17
|
*
|
|
18
|
+
* @param options.defaultPointFrameExtent - The extent of the frame of a point whose type
|
|
19
|
+
* registers none (see createSelectionExtensionRegistry)
|
|
18
20
|
* @internal
|
|
19
21
|
*/
|
|
20
|
-
export function createSelectionScope() {
|
|
21
|
-
const extensions = createSelectionExtensionRegistry();
|
|
22
|
+
export function createSelectionScope(options = {}) {
|
|
23
|
+
const extensions = createSelectionExtensionRegistry(options.defaultPointFrameExtent);
|
|
22
24
|
const auxiliaryHandles = createAuxiliaryHandleRegistry();
|
|
23
25
|
const thinning = new HandleThinningCache();
|
|
24
26
|
return {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import { circleBoundingBox } from '../../../geometry/circle.js';
|
|
14
14
|
import { pixelsToDegreesLat, pixelsToDegreesLng } from '../../../shared/math/index.js';
|
|
15
15
|
import { fromPlane, toPlane } from '../../../shared/math/mercator-plane.js';
|
|
16
|
+
import { coordinatesOf } from '../../../shared/utils/coordinates.js';
|
|
16
17
|
import { getCircleRadius, getCreatedZoom, getImageProperties, } from '../../../shared/utils/property.js';
|
|
17
18
|
import { getBoundingBox } from '../../../store/spatial/index.js';
|
|
18
19
|
/**
|
|
@@ -45,7 +46,7 @@ export function computeBoundingBox(feature, extensions) {
|
|
|
45
46
|
return customCalculator(feature, extensions.getTileSize());
|
|
46
47
|
}
|
|
47
48
|
if (feature.type === 'Point') {
|
|
48
|
-
const coord = feature
|
|
49
|
+
const coord = coordinatesOf(feature);
|
|
49
50
|
return {
|
|
50
51
|
topLeft: coord,
|
|
51
52
|
topRight: coord,
|
|
@@ -80,7 +81,7 @@ export function computeBoundingBox(feature, extensions) {
|
|
|
80
81
|
* The frame of a Circle: the extent of the geodesic circle as it is drawn, around its center
|
|
81
82
|
*/
|
|
82
83
|
function computeCircleBoundingBox(feature) {
|
|
83
|
-
const center = feature
|
|
84
|
+
const center = coordinatesOf(feature);
|
|
84
85
|
const radiusMeters = getCircleRadius(feature);
|
|
85
86
|
const extent = radiusMeters && radiusMeters > 0 ? circleBoundingBox(center, radiusMeters) : null;
|
|
86
87
|
if (!extent) {
|
|
@@ -108,13 +109,12 @@ function computeCircleBoundingBox(feature) {
|
|
|
108
109
|
* (the same method as computeQuadVertices in quad-shader.ts).
|
|
109
110
|
*/
|
|
110
111
|
function computeOrientedBoundingBox(feature) {
|
|
111
|
-
const coord = feature
|
|
112
|
+
const coord = coordinatesOf(feature);
|
|
112
113
|
const [lng, lat] = coord;
|
|
113
114
|
const tileSize = 512;
|
|
114
115
|
const props = getImageProperties(feature);
|
|
115
|
-
const
|
|
116
|
-
const
|
|
117
|
-
const imageHeight = style?.height || props.imageHeight || 100;
|
|
116
|
+
const imageWidth = props.imageWidth || 100;
|
|
117
|
+
const imageHeight = props.imageHeight || 100;
|
|
118
118
|
const scale = props.scale ?? 1;
|
|
119
119
|
// getImageProperties().createdZoom returns 0 when it is missing, so ?? does not work.
|
|
120
120
|
// getCreatedZoom(number|undefined) is used so that 14 is the default when it is missing.
|