@sakuzu/maplibre-gl-draw 1.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 +43 -0
- package/LICENSE +661 -0
- package/README.ja.md +248 -0
- package/README.md +255 -0
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/api/api.d.ts +1259 -0
- package/dist/api/api.js +86 -0
- package/dist/api/context.d.ts +173 -0
- package/dist/api/context.js +193 -0
- package/dist/api/display-api.d.ts +1 -0
- package/dist/api/display-api.js +23 -0
- package/dist/api/event-api.d.ts +13 -0
- package/dist/api/event-api.js +17 -0
- package/dist/api/extension-api.d.ts +46 -0
- package/dist/api/extension-api.js +85 -0
- package/dist/api/feature-api.d.ts +11 -0
- package/dist/api/feature-api.js +101 -0
- package/dist/api/geometry/apply.d.ts +51 -0
- package/dist/api/geometry/apply.js +114 -0
- package/dist/api/geometry/boolean.d.ts +28 -0
- package/dist/api/geometry/boolean.js +65 -0
- package/dist/api/geometry/buffer.d.ts +11 -0
- package/dist/api/geometry/buffer.js +105 -0
- package/dist/api/geometry/split.d.ts +16 -0
- package/dist/api/geometry/split.js +75 -0
- package/dist/api/geometry/targets.d.ts +76 -0
- package/dist/api/geometry/targets.js +158 -0
- package/dist/api/geometry/types.d.ts +31 -0
- package/dist/api/geometry/types.js +3 -0
- package/dist/api/geometry-operations.d.ts +162 -0
- package/dist/api/geometry-operations.js +94 -0
- package/dist/api/group-api.d.ts +10 -0
- package/dist/api/group-api.js +78 -0
- package/dist/api/import-export/constants.d.ts +29 -0
- package/dist/api/import-export/constants.js +40 -0
- package/dist/api/import-export/embedded-file.d.ts +13 -0
- package/dist/api/import-export/embedded-file.js +31 -0
- package/dist/api/import-export/file-name.d.ts +10 -0
- package/dist/api/import-export/file-name.js +20 -0
- package/dist/api/import-export/format-detection.d.ts +12 -0
- package/dist/api/import-export/format-detection.js +29 -0
- package/dist/api/import-export/geojson-export.d.ts +19 -0
- package/dist/api/import-export/geojson-export.js +262 -0
- package/dist/api/import-export/geojson-import.d.ts +34 -0
- package/dist/api/import-export/geojson-import.js +538 -0
- package/dist/api/import-export/geometry-validation.d.ts +20 -0
- package/dist/api/import-export/geometry-validation.js +107 -0
- package/dist/api/import-export/image-import.d.ts +12 -0
- package/dist/api/import-export/image-import.js +53 -0
- package/dist/api/import-export/index.d.ts +9 -0
- package/dist/api/import-export/index.js +107 -0
- package/dist/api/import-export/native-format.d.ts +15 -0
- package/dist/api/import-export/native-format.js +126 -0
- package/dist/api/import-export/native-validation.d.ts +28 -0
- package/dist/api/import-export/native-validation.js +212 -0
- package/dist/api/import-export/own-property.d.ts +10 -0
- package/dist/api/import-export/own-property.js +19 -0
- package/dist/api/import-export/style-validation.d.ts +27 -0
- package/dist/api/import-export/style-validation.js +49 -0
- package/dist/api/import-export/types.d.ts +26 -0
- package/dist/api/import-export/types.js +3 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.js +3 -0
- package/dist/api/input-api.d.ts +158 -0
- package/dist/api/input-api.js +144 -0
- package/dist/api/instance-api.d.ts +38 -0
- package/dist/api/instance-api.js +136 -0
- package/dist/api/layer-api.d.ts +12 -0
- package/dist/api/layer-api.js +62 -0
- package/dist/api/selection-api.d.ts +7 -0
- package/dist/api/selection-api.js +78 -0
- package/dist/api/snapping-api.d.ts +125 -0
- package/dist/api/snapping-api.js +50 -0
- package/dist/api/topology-api.d.ts +30 -0
- package/dist/api/topology-api.js +16 -0
- package/dist/api/tracing-api.d.ts +31 -0
- package/dist/api/tracing-api.js +16 -0
- package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
- package/dist/dispatcher/hit-test/box-strategies.js +275 -0
- package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
- package/dist/dispatcher/hit-test/box-strategy.js +37 -0
- package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
- package/dist/dispatcher/hit-test/globe-shape.js +70 -0
- package/dist/dispatcher/hit-test/index.d.ts +14 -0
- package/dist/dispatcher/hit-test/index.js +9 -0
- package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
- package/dist/dispatcher/hit-test/local-frame.js +112 -0
- package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
- package/dist/dispatcher/hit-test/segment-grid.js +79 -0
- package/dist/dispatcher/hit-test/service.d.ts +120 -0
- package/dist/dispatcher/hit-test/service.js +333 -0
- package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
- package/dist/dispatcher/hit-test/strategies/base.js +66 -0
- package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
- package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
- package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
- package/dist/dispatcher/hit-test/strategies/image.js +115 -0
- package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
- package/dist/dispatcher/hit-test/strategies/index.js +10 -0
- package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
- package/dist/dispatcher/hit-test/strategies/line.js +30 -0
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
- package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
- package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
- package/dist/dispatcher/hit-test/strategies/point.js +29 -0
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
- package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
- package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
- package/dist/dispatcher/hit-test/topmost.js +157 -0
- package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
- package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
- package/dist/dispatcher/index.d.ts +15 -0
- package/dist/dispatcher/index.js +3 -0
- package/dist/dispatcher/input-router.d.ts +1 -0
- package/dist/dispatcher/input-router.js +288 -0
- package/dist/dispatcher/normalizer.d.ts +1 -0
- package/dist/dispatcher/normalizer.js +513 -0
- package/dist/dispatcher/types.d.ts +144 -0
- package/dist/dispatcher/types.js +15 -0
- package/dist/display/chunk-set.d.ts +24 -0
- package/dist/display/chunk-set.js +533 -0
- package/dist/display/chunk.d.ts +1 -0
- package/dist/display/chunk.js +104 -0
- package/dist/display/columnar/index.d.ts +12 -0
- package/dist/display/columnar/index.js +13 -0
- package/dist/display/columnar/prepare.d.ts +42 -0
- package/dist/display/columnar/prepare.js +116 -0
- package/dist/display/columnar/source.d.ts +1 -0
- package/dist/display/columnar/source.js +531 -0
- package/dist/display/columnar/table.d.ts +1 -0
- package/dist/display/columnar/table.js +471 -0
- package/dist/display/columnar/types.d.ts +223 -0
- package/dist/display/columnar/types.js +3 -0
- package/dist/display/dataset.d.ts +2 -0
- package/dist/display/dataset.js +891 -0
- package/dist/display/index.d.ts +13 -0
- package/dist/display/index.js +3 -0
- package/dist/display/interaction.d.ts +1 -0
- package/dist/display/interaction.js +90 -0
- package/dist/display/manager.d.ts +1 -0
- package/dist/display/manager.js +440 -0
- package/dist/display/packed-rtree.d.ts +1 -0
- package/dist/display/packed-rtree.js +244 -0
- package/dist/display/partition.d.ts +1 -0
- package/dist/display/partition.js +226 -0
- package/dist/display/provider.d.ts +1 -0
- package/dist/display/provider.js +342 -0
- package/dist/display/retained.d.ts +40 -0
- package/dist/display/retained.js +898 -0
- package/dist/display/selection.d.ts +13 -0
- package/dist/display/selection.js +226 -0
- package/dist/display/source.d.ts +1 -0
- package/dist/display/source.js +119 -0
- package/dist/display/spatial.d.ts +1 -0
- package/dist/display/spatial.js +71 -0
- package/dist/display/style.d.ts +1 -0
- package/dist/display/style.js +126 -0
- package/dist/display/thinning.d.ts +65 -0
- package/dist/display/thinning.js +910 -0
- package/dist/display/triangulation.d.ts +1 -0
- package/dist/display/triangulation.js +0 -0
- package/dist/display/types.d.ts +561 -0
- package/dist/display/types.js +43 -0
- package/dist/extension/feature-handler.d.ts +182 -0
- package/dist/extension/feature-handler.js +3 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +3 -0
- package/dist/extension/renderers.d.ts +208 -0
- package/dist/extension/renderers.js +3 -0
- package/dist/geometry/angle.d.ts +47 -0
- package/dist/geometry/angle.js +44 -0
- package/dist/geometry/bbox.d.ts +48 -0
- package/dist/geometry/bbox.js +83 -0
- package/dist/geometry/boolean.d.ts +162 -0
- package/dist/geometry/boolean.js +331 -0
- package/dist/geometry/buffer.d.ts +72 -0
- package/dist/geometry/buffer.js +218 -0
- package/dist/geometry/circle.d.ts +55 -0
- package/dist/geometry/circle.js +107 -0
- package/dist/geometry/coords.d.ts +97 -0
- package/dist/geometry/coords.js +149 -0
- package/dist/geometry/distance.d.ts +79 -0
- package/dist/geometry/distance.js +111 -0
- package/dist/geometry/errors.d.ts +74 -0
- package/dist/geometry/errors.js +104 -0
- package/dist/geometry/index.d.ts +28 -0
- package/dist/geometry/index.js +38 -0
- package/dist/geometry/measure.d.ts +81 -0
- package/dist/geometry/measure.js +236 -0
- package/dist/geometry/predicates.d.ts +62 -0
- package/dist/geometry/predicates.js +132 -0
- package/dist/geometry/simplify.d.ts +74 -0
- package/dist/geometry/simplify.js +159 -0
- package/dist/geometry/split.d.ts +68 -0
- package/dist/geometry/split.js +430 -0
- package/dist/geometry/types.d.ts +95 -0
- package/dist/geometry/types.js +3 -0
- package/dist/geometry/units.d.ts +35 -0
- package/dist/geometry/units.js +41 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +20 -0
- package/dist/maplibre-gl-draw.d.ts +47 -0
- package/dist/maplibre-gl-draw.js +407 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.js +36 -0
- package/dist/modes/cursor.d.ts +1 -0
- package/dist/modes/cursor.js +72 -0
- package/dist/modes/draw/circle.d.ts +1 -0
- package/dist/modes/draw/circle.js +222 -0
- package/dist/modes/draw/commit-layer.d.ts +26 -0
- package/dist/modes/draw/commit-layer.js +31 -0
- package/dist/modes/draw/freehand.d.ts +1 -0
- package/dist/modes/draw/freehand.js +264 -0
- package/dist/modes/draw/image.d.ts +1 -0
- package/dist/modes/draw/image.js +60 -0
- package/dist/modes/draw/index.d.ts +9 -0
- package/dist/modes/draw/index.js +11 -0
- package/dist/modes/draw/line.d.ts +1 -0
- package/dist/modes/draw/line.js +363 -0
- package/dist/modes/draw/point.d.ts +1 -0
- package/dist/modes/draw/point.js +87 -0
- package/dist/modes/draw/polygon.d.ts +1 -0
- package/dist/modes/draw/polygon.js +378 -0
- package/dist/modes/draw/trace-support.d.ts +79 -0
- package/dist/modes/draw/trace-support.js +161 -0
- package/dist/modes/handler.d.ts +285 -0
- package/dist/modes/handler.js +3 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/manager.d.ts +15 -0
- package/dist/modes/manager.js +196 -0
- package/dist/modes/select/box-selection.d.ts +52 -0
- package/dist/modes/select/box-selection.js +140 -0
- package/dist/modes/select/click-handler.d.ts +32 -0
- package/dist/modes/select/click-handler.js +166 -0
- package/dist/modes/select/cursor-handler.d.ts +15 -0
- package/dist/modes/select/cursor-handler.js +59 -0
- package/dist/modes/select/drag/auxiliary.d.ts +26 -0
- package/dist/modes/select/drag/auxiliary.js +56 -0
- package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
- package/dist/modes/select/drag/intermediate-writes.js +171 -0
- package/dist/modes/select/drag/move.d.ts +24 -0
- package/dist/modes/select/drag/move.js +59 -0
- package/dist/modes/select/drag/operation.d.ts +30 -0
- package/dist/modes/select/drag/operation.js +18 -0
- package/dist/modes/select/drag/radius.d.ts +15 -0
- package/dist/modes/select/drag/radius.js +49 -0
- package/dist/modes/select/drag/transform.d.ts +17 -0
- package/dist/modes/select/drag/transform.js +155 -0
- package/dist/modes/select/drag/vertex.d.ts +17 -0
- package/dist/modes/select/drag/vertex.js +163 -0
- package/dist/modes/select/drag-handler.d.ts +1 -0
- package/dist/modes/select/drag-handler.js +254 -0
- package/dist/modes/select/hit-helpers.d.ts +40 -0
- package/dist/modes/select/hit-helpers.js +51 -0
- package/dist/modes/select/mode.d.ts +1 -0
- package/dist/modes/select/mode.js +397 -0
- package/dist/modes/select/shortcut-handler.d.ts +40 -0
- package/dist/modes/select/shortcut-handler.js +128 -0
- package/dist/operations/index.d.ts +9 -0
- package/dist/operations/index.js +3 -0
- package/dist/operations/layer-operations.d.ts +1 -0
- package/dist/operations/layer-operations.js +350 -0
- package/dist/operations/resize.d.ts +71 -0
- package/dist/operations/resize.js +252 -0
- package/dist/operations/rotate.d.ts +17 -0
- package/dist/operations/rotate.js +166 -0
- package/dist/operations/selection-operations.d.ts +20 -0
- package/dist/operations/selection-operations.js +159 -0
- package/dist/operations/shared-vertex.d.ts +1 -0
- package/dist/operations/shared-vertex.js +210 -0
- package/dist/operations/trace-graph.d.ts +96 -0
- package/dist/operations/trace-graph.js +283 -0
- package/dist/operations/vertex.d.ts +1 -0
- package/dist/operations/vertex.js +538 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/mutation-hooks.d.ts +28 -0
- package/dist/plugins/mutation-hooks.js +84 -0
- package/dist/plugins/plugin-context.d.ts +1 -0
- package/dist/plugins/plugin-context.js +367 -0
- package/dist/plugins/plugin-manager.d.ts +103 -0
- package/dist/plugins/plugin-manager.js +316 -0
- package/dist/plugins/plugin.d.ts +529 -0
- package/dist/plugins/plugin.js +3 -0
- package/dist/shared/config/constants.d.ts +66 -0
- package/dist/shared/config/constants.js +60 -0
- package/dist/shared/config/feature-style.d.ts +155 -0
- package/dist/shared/config/feature-style.js +154 -0
- package/dist/shared/config/index.d.ts +17 -0
- package/dist/shared/config/index.js +8 -0
- package/dist/shared/config/rendering.d.ts +107 -0
- package/dist/shared/config/rendering.js +33 -0
- package/dist/shared/config/selection-highlight.d.ts +29 -0
- package/dist/shared/config/selection-highlight.js +35 -0
- package/dist/shared/config/selection.d.ts +273 -0
- package/dist/shared/config/selection.js +266 -0
- package/dist/shared/config/topology.d.ts +33 -0
- package/dist/shared/config/topology.js +17 -0
- package/dist/shared/config/trace.d.ts +40 -0
- package/dist/shared/config/trace.js +17 -0
- package/dist/shared/math/angle.d.ts +21 -0
- package/dist/shared/math/angle.js +34 -0
- package/dist/shared/math/circle.d.ts +6 -0
- package/dist/shared/math/circle.js +10 -0
- package/dist/shared/math/constants.d.ts +48 -0
- package/dist/shared/math/constants.js +59 -0
- package/dist/shared/math/distance.d.ts +78 -0
- package/dist/shared/math/distance.js +147 -0
- package/dist/shared/math/globe-subdivision.d.ts +62 -0
- package/dist/shared/math/globe-subdivision.js +99 -0
- package/dist/shared/math/index.d.ts +17 -0
- package/dist/shared/math/index.js +21 -0
- package/dist/shared/math/intersection.d.ts +63 -0
- package/dist/shared/math/intersection.js +236 -0
- package/dist/shared/math/longitude.d.ts +20 -0
- package/dist/shared/math/longitude.js +31 -0
- package/dist/shared/math/mercator-plane.d.ts +27 -0
- package/dist/shared/math/mercator-plane.js +26 -0
- package/dist/shared/math/obb.d.ts +65 -0
- package/dist/shared/math/obb.js +107 -0
- package/dist/shared/math/rotation.d.ts +93 -0
- package/dist/shared/math/rotation.js +186 -0
- package/dist/shared/math/segment-grid.d.ts +69 -0
- package/dist/shared/math/segment-grid.js +159 -0
- package/dist/shared/math/transform.d.ts +140 -0
- package/dist/shared/math/transform.js +189 -0
- package/dist/shared/types/events.d.ts +128 -0
- package/dist/shared/types/events.js +3 -0
- package/dist/shared/types/model.d.ts +950 -0
- package/dist/shared/types/model.js +3 -0
- package/dist/shared/types/selection-box.d.ts +23 -0
- package/dist/shared/types/selection-box.js +3 -0
- package/dist/shared/types/style.d.ts +68 -0
- package/dist/shared/types/style.js +3 -0
- package/dist/shared/utils/color.d.ts +49 -0
- package/dist/shared/utils/color.js +180 -0
- package/dist/shared/utils/coordinates.d.ts +52 -0
- package/dist/shared/utils/coordinates.js +75 -0
- package/dist/shared/utils/embedded-image.d.ts +34 -0
- package/dist/shared/utils/embedded-image.js +161 -0
- package/dist/shared/utils/event-emitter.d.ts +262 -0
- package/dist/shared/utils/event-emitter.js +44 -0
- package/dist/shared/utils/feature-bbox.d.ts +8 -0
- package/dist/shared/utils/feature-bbox.js +207 -0
- package/dist/shared/utils/feature-segments.d.ts +23 -0
- package/dist/shared/utils/feature-segments.js +179 -0
- package/dist/shared/utils/id.d.ts +1 -0
- package/dist/shared/utils/id.js +35 -0
- package/dist/shared/utils/image.d.ts +34 -0
- package/dist/shared/utils/image.js +106 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +24 -0
- package/dist/shared/utils/map.d.ts +26 -0
- package/dist/shared/utils/map.js +35 -0
- package/dist/shared/utils/name-generator.d.ts +197 -0
- package/dist/shared/utils/name-generator.js +337 -0
- package/dist/shared/utils/pixel-ratio.d.ts +111 -0
- package/dist/shared/utils/pixel-ratio.js +85 -0
- package/dist/shared/utils/property.d.ts +88 -0
- package/dist/shared/utils/property.js +140 -0
- package/dist/shared/utils/vertex-ref.d.ts +23 -0
- package/dist/shared/utils/vertex-ref.js +20 -0
- package/dist/snapping/custom-targets.d.ts +1 -0
- package/dist/snapping/custom-targets.js +21 -0
- package/dist/snapping/geometry.d.ts +1 -0
- package/dist/snapping/geometry.js +61 -0
- package/dist/snapping/index.d.ts +14 -0
- package/dist/snapping/index.js +4 -0
- package/dist/snapping/indicator.d.ts +19 -0
- package/dist/snapping/indicator.js +145 -0
- package/dist/snapping/providers/display.d.ts +72 -0
- package/dist/snapping/providers/display.js +268 -0
- package/dist/snapping/providers/guide.d.ts +69 -0
- package/dist/snapping/providers/guide.js +187 -0
- package/dist/snapping/providers/intersection.d.ts +1 -0
- package/dist/snapping/providers/intersection.js +92 -0
- package/dist/snapping/providers/shared.d.ts +39 -0
- package/dist/snapping/providers/shared.js +146 -0
- package/dist/snapping/providers/store.d.ts +1 -0
- package/dist/snapping/providers/store.js +132 -0
- package/dist/snapping/service.d.ts +1 -0
- package/dist/snapping/service.js +272 -0
- package/dist/snapping/types.d.ts +267 -0
- package/dist/snapping/types.js +66 -0
- package/dist/store/change-merger.d.ts +1 -0
- package/dist/store/change-merger.js +102 -0
- package/dist/store/draw-store.d.ts +1 -0
- package/dist/store/draw-store.js +396 -0
- package/dist/store/event-bridge.d.ts +1 -0
- package/dist/store/event-bridge.js +161 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.js +4 -0
- package/dist/store/local-visibility.d.ts +21 -0
- package/dist/store/local-visibility.js +27 -0
- package/dist/store/lock.d.ts +67 -0
- package/dist/store/lock.js +54 -0
- package/dist/store/memory/change-bus.d.ts +60 -0
- package/dist/store/memory/change-bus.js +232 -0
- package/dist/store/memory/file-store.d.ts +15 -0
- package/dist/store/memory/file-store.js +33 -0
- package/dist/store/memory/frozen.d.ts +21 -0
- package/dist/store/memory/frozen.js +51 -0
- package/dist/store/memory/ui-state.d.ts +51 -0
- package/dist/store/memory/ui-state.js +223 -0
- package/dist/store/memory.d.ts +26 -0
- package/dist/store/memory.js +708 -0
- package/dist/store/spatial/index.d.ts +6 -0
- package/dist/store/spatial/index.js +4 -0
- package/dist/store/spatial/spatial-index.d.ts +90 -0
- package/dist/store/spatial/spatial-index.js +148 -0
- package/dist/store/spatial/store-spatial-index.d.ts +60 -0
- package/dist/store/spatial/store-spatial-index.js +125 -0
- package/dist/store/store.d.ts +417 -0
- package/dist/store/store.js +3 -0
- package/dist/store/types.d.ts +8 -0
- package/dist/store/types.js +3 -0
- package/dist/store/writable-layer.d.ts +35 -0
- package/dist/store/writable-layer.js +20 -0
- package/dist/view/cache/buffer.d.ts +28 -0
- package/dist/view/cache/buffer.js +176 -0
- package/dist/view/cache/earcut.d.ts +1 -0
- package/dist/view/cache/earcut.js +122 -0
- package/dist/view/cache/style-rule.d.ts +1 -0
- package/dist/view/cache/style-rule.js +97 -0
- package/dist/view/cache/terrain-fill.d.ts +30 -0
- package/dist/view/cache/terrain-fill.js +60 -0
- package/dist/view/cache/texture.d.ts +14 -0
- package/dist/view/cache/texture.js +292 -0
- package/dist/view/coordinator.d.ts +27 -0
- package/dist/view/coordinator.js +72 -0
- package/dist/view/feature-companion.d.ts +173 -0
- package/dist/view/feature-companion.js +108 -0
- package/dist/view/globe-subdivision.d.ts +78 -0
- package/dist/view/globe-subdivision.js +128 -0
- package/dist/view/index.d.ts +47 -0
- package/dist/view/index.js +20 -0
- package/dist/view/layer/attach.d.ts +20 -0
- package/dist/view/layer/attach.js +47 -0
- package/dist/view/layer/blend.d.ts +57 -0
- package/dist/view/layer/blend.js +14 -0
- package/dist/view/layer/custom-layer.d.ts +1 -0
- package/dist/view/layer/custom-layer.js +509 -0
- package/dist/view/layer/depth-state.d.ts +14 -0
- package/dist/view/layer/depth-state.js +44 -0
- package/dist/view/layer/display-list.d.ts +1 -0
- package/dist/view/layer/display-list.js +111 -0
- package/dist/view/layer/drape-planner.d.ts +139 -0
- package/dist/view/layer/drape-planner.js +726 -0
- package/dist/view/layer/frame-render.d.ts +57 -0
- package/dist/view/layer/frame-render.js +209 -0
- package/dist/view/layer/frame-state.d.ts +147 -0
- package/dist/view/layer/frame-state.js +484 -0
- package/dist/view/layer/gl-state.d.ts +77 -0
- package/dist/view/layer/gl-state.js +132 -0
- package/dist/view/layer/index.d.ts +6 -0
- package/dist/view/layer/index.js +5 -0
- package/dist/view/layer/render-scope.d.ts +30 -0
- package/dist/view/layer/render-scope.js +28 -0
- package/dist/view/layer/render.d.ts +87 -0
- package/dist/view/layer/render.js +187 -0
- package/dist/view/layer/renderers.d.ts +81 -0
- package/dist/view/layer/renderers.js +142 -0
- package/dist/view/layer/slot-manager.d.ts +26 -0
- package/dist/view/layer/slot-manager.js +133 -0
- package/dist/view/layer/slots.d.ts +33 -0
- package/dist/view/layer/slots.js +50 -0
- package/dist/view/layer/store-retained-bbox.d.ts +36 -0
- package/dist/view/layer/store-retained-bbox.js +188 -0
- package/dist/view/layer/store-retained-chunk.d.ts +97 -0
- package/dist/view/layer/store-retained-chunk.js +94 -0
- package/dist/view/layer/store-retained-classify.d.ts +34 -0
- package/dist/view/layer/store-retained-classify.js +88 -0
- package/dist/view/layer/store-retained-collect.d.ts +24 -0
- package/dist/view/layer/store-retained-collect.js +121 -0
- package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
- package/dist/view/layer/store-retained-coord-patch.js +168 -0
- package/dist/view/layer/store-retained-immediate.d.ts +63 -0
- package/dist/view/layer/store-retained-immediate.js +49 -0
- package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
- package/dist/view/layer/store-retained-invalidation.js +192 -0
- package/dist/view/layer/store-retained.d.ts +198 -0
- package/dist/view/layer/store-retained.js +430 -0
- package/dist/view/layer/terrain-resolver.d.ts +1 -0
- package/dist/view/layer/terrain-resolver.js +174 -0
- package/dist/view/renderers/batch-manager.d.ts +61 -0
- package/dist/view/renderers/batch-manager.js +718 -0
- package/dist/view/renderers/draw-factors.d.ts +60 -0
- package/dist/view/renderers/draw-factors.js +35 -0
- package/dist/view/renderers/drawer.d.ts +1 -0
- package/dist/view/renderers/drawer.js +346 -0
- package/dist/view/renderers/image.d.ts +1 -0
- package/dist/view/renderers/image.js +255 -0
- package/dist/view/renderers/line/dash.d.ts +31 -0
- package/dist/view/renderers/line/dash.js +152 -0
- package/dist/view/renderers/line/line-geometry.d.ts +39 -0
- package/dist/view/renderers/line/line-geometry.js +460 -0
- package/dist/view/renderers/line/line-gl.d.ts +1 -0
- package/dist/view/renderers/line/line-gl.js +236 -0
- package/dist/view/renderers/line/line-shader.d.ts +1 -0
- package/dist/view/renderers/line/line-shader.js +364 -0
- package/dist/view/renderers/line/line-types.d.ts +43 -0
- package/dist/view/renderers/line/line-types.js +3 -0
- package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
- package/dist/view/renderers/line/line-uniforms.js +390 -0
- package/dist/view/renderers/line/sdf-line.d.ts +92 -0
- package/dist/view/renderers/line/sdf-line.js +567 -0
- package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
- package/dist/view/renderers/point/billboard-depth.js +56 -0
- package/dist/view/renderers/point/point-instance.d.ts +124 -0
- package/dist/view/renderers/point/point-instance.js +738 -0
- package/dist/view/renderers/point/point-sdf.d.ts +58 -0
- package/dist/view/renderers/point/point-sdf.js +170 -0
- package/dist/view/renderers/point/point-shape.d.ts +99 -0
- package/dist/view/renderers/point/point-shape.js +504 -0
- package/dist/view/renderers/point/point-style.d.ts +1 -0
- package/dist/view/renderers/point/point-style.js +46 -0
- package/dist/view/renderers/polygon/batch.d.ts +26 -0
- package/dist/view/renderers/polygon/batch.js +336 -0
- package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
- package/dist/view/renderers/polygon/earcut-input.js +55 -0
- package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
- package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
- package/dist/view/renderers/polygon/fill.d.ts +74 -0
- package/dist/view/renderers/polygon/fill.js +251 -0
- package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
- package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
- package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
- package/dist/view/renderers/polygon/terrain-cull.js +14 -0
- package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
- package/dist/view/renderers/polygon/triangulator.js +3 -0
- package/dist/view/renderers/retained.d.ts +43 -0
- package/dist/view/renderers/retained.js +3 -0
- package/dist/view/renderers/stroke.d.ts +121 -0
- package/dist/view/renderers/stroke.js +621 -0
- package/dist/view/shaders/frame.d.ts +8 -0
- package/dist/view/shaders/frame.js +37 -0
- package/dist/view/shaders/helpers.d.ts +238 -0
- package/dist/view/shaders/helpers.js +611 -0
- package/dist/view/shaders/initializer.d.ts +27 -0
- package/dist/view/shaders/initializer.js +125 -0
- package/dist/view/shaders/projection.d.ts +123 -0
- package/dist/view/shaders/projection.js +299 -0
- package/dist/view/shaders/quad-grid.d.ts +77 -0
- package/dist/view/shaders/quad-grid.js +128 -0
- package/dist/view/shaders/quad.d.ts +189 -0
- package/dist/view/shaders/quad.js +582 -0
- package/dist/view/shaders/retained-origin.d.ts +50 -0
- package/dist/view/shaders/retained-origin.js +67 -0
- package/dist/view/shaders/terrain-shade.d.ts +23 -0
- package/dist/view/shaders/terrain-shade.js +93 -0
- package/dist/view/style-rule.d.ts +166 -0
- package/dist/view/style-rule.js +300 -0
- package/dist/view/terrain/anchor.d.ts +135 -0
- package/dist/view/terrain/anchor.js +226 -0
- package/dist/view/terrain/context.d.ts +132 -0
- package/dist/view/terrain/context.js +437 -0
- package/dist/view/terrain/dem-atlas.d.ts +97 -0
- package/dist/view/terrain/dem-atlas.js +534 -0
- package/dist/view/terrain/detect.d.ts +126 -0
- package/dist/view/terrain/detect.js +198 -0
- package/dist/view/terrain/drape/bin-store.d.ts +179 -0
- package/dist/view/terrain/drape/bin-store.js +529 -0
- package/dist/view/terrain/drape/binning.d.ts +259 -0
- package/dist/view/terrain/drape/binning.js +604 -0
- package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
- package/dist/view/terrain/drape/edge-constrain.js +175 -0
- package/dist/view/terrain/drape/geometry.d.ts +95 -0
- package/dist/view/terrain/drape/geometry.js +260 -0
- package/dist/view/terrain/drape/mesh.d.ts +50 -0
- package/dist/view/terrain/drape/mesh.js +86 -0
- package/dist/view/terrain/drape/pass.d.ts +122 -0
- package/dist/view/terrain/drape/pass.js +379 -0
- package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
- package/dist/view/terrain/drape/quad-glyphs.js +117 -0
- package/dist/view/terrain/drape/quad.d.ts +249 -0
- package/dist/view/terrain/drape/quad.js +835 -0
- package/dist/view/terrain/drape/renderer.d.ts +184 -0
- package/dist/view/terrain/drape/renderer.js +706 -0
- package/dist/view/terrain/drape/shared.d.ts +80 -0
- package/dist/view/terrain/drape/shared.js +173 -0
- package/dist/view/terrain/drape/stitch.d.ts +155 -0
- package/dist/view/terrain/drape/stitch.js +228 -0
- package/dist/view/terrain/ground.d.ts +72 -0
- package/dist/view/terrain/ground.js +151 -0
- package/dist/view/terrain/metrics.d.ts +180 -0
- package/dist/view/terrain/metrics.js +231 -0
- package/dist/view/terrain/occlusion.d.ts +11 -0
- package/dist/view/terrain/occlusion.js +129 -0
- package/dist/view/terrain/polygon.d.ts +86 -0
- package/dist/view/terrain/polygon.js +301 -0
- package/dist/view/terrain/shade.d.ts +48 -0
- package/dist/view/terrain/shade.js +45 -0
- package/dist/view/terrain/state.d.ts +99 -0
- package/dist/view/terrain/state.js +186 -0
- package/dist/view/terrain/tessellation.d.ts +265 -0
- package/dist/view/terrain/tessellation.js +924 -0
- package/dist/view/terrain/tiling.d.ts +56 -0
- package/dist/view/terrain/tiling.js +155 -0
- package/dist/view/terrain/upstream-terrain.d.ts +82 -0
- package/dist/view/terrain/upstream-terrain.js +116 -0
- package/dist/view/ui/auxiliary-handles.d.ts +151 -0
- package/dist/view/ui/auxiliary-handles.js +22 -0
- package/dist/view/ui/bounds.d.ts +53 -0
- package/dist/view/ui/bounds.js +149 -0
- package/dist/view/ui/box-selection.d.ts +1 -0
- package/dist/view/ui/box-selection.js +83 -0
- package/dist/view/ui/handle-test.d.ts +1 -0
- package/dist/view/ui/handle-test.js +437 -0
- package/dist/view/ui/handle-thinning.d.ts +122 -0
- package/dist/view/ui/handle-thinning.js +430 -0
- package/dist/view/ui/handles.d.ts +25 -0
- package/dist/view/ui/handles.js +673 -0
- package/dist/view/ui/helper.d.ts +19 -0
- package/dist/view/ui/helper.js +76 -0
- package/dist/view/ui/index.d.ts +15 -0
- package/dist/view/ui/index.js +15 -0
- package/dist/view/ui/selection-scope.d.ts +25 -0
- package/dist/view/ui/selection-scope.js +34 -0
- package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
- package/dist/view/ui/selection-ui/bounding-box.js +240 -0
- package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
- package/dist/view/ui/selection-ui/extension-registry.js +78 -0
- package/dist/view/ui/selection-ui/index.d.ts +12 -0
- package/dist/view/ui/selection-ui/index.js +12 -0
- package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
- package/dist/view/ui/selection-ui/renderer.js +227 -0
- package/dist/view/ui/selection-ui/types.d.ts +55 -0
- package/dist/view/ui/selection-ui/types.js +3 -0
- package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
- package/dist/view/ui/selection-ui-drawer.js +329 -0
- package/dist/view/ui/tentative.d.ts +1 -0
- package/dist/view/ui/tentative.js +320 -0
- package/dist/view/viewport.d.ts +119 -0
- package/dist/view/viewport.js +254 -0
- package/package.json +113 -0
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
4
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
5
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
6
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
7
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
8
|
+
};
|
|
9
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
10
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
11
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
12
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
13
|
+
};
|
|
14
|
+
var _SelectMode_context, _SelectMode_dragHandler, _SelectMode_config;
|
|
15
|
+
import { DEFAULT_SELECTION_CONFIG } from '../../shared/config/selection.js';
|
|
16
|
+
import { createCoordinateTransform } from '../../shared/math/index.js';
|
|
17
|
+
import { getDisplayFeatures } from '../../store/local-visibility.js';
|
|
18
|
+
import { computeCombinedGeoBoundingBox, isPointInGeoBoundingBox } from '../../view/ui/bounds.js';
|
|
19
|
+
import { hitTestGlobalAuxiliaryHandles, hitTestHandles } from '../../view/ui/handle-test.js';
|
|
20
|
+
import { computeSelectionBoundingBox, getSelectedFeatureIds, getSelectedFeatures, } from '../../view/ui/helper.js';
|
|
21
|
+
import { queryFeaturesInBox } from './box-selection.js';
|
|
22
|
+
import { handleSelectClick, handleSelectDoubleClick } from './click-handler.js';
|
|
23
|
+
import { updateCursorForSelection } from './cursor-handler.js';
|
|
24
|
+
import { SelectModeDragHandler } from './drag-handler.js';
|
|
25
|
+
import { getAdditionalResizeHandlesCallback, getAuxiliaryHandlesCallback, getGlobalAuxiliaryHandlesCallback, } from './hit-helpers.js';
|
|
26
|
+
import { handleDeleteShortcut, handleEscapeShortcut, handleGroupShortcut, handleNudgeShortcut, handleUngroupShortcut, } from './shortcut-handler.js';
|
|
27
|
+
/**
|
|
28
|
+
* Whether the selection is a feature selection of exactly these IDs, in this order
|
|
29
|
+
*/
|
|
30
|
+
function selectsExactly(selection, ids) {
|
|
31
|
+
if (ids.length === 0)
|
|
32
|
+
return selection.type === null && selection.ids.length === 0;
|
|
33
|
+
return (selection.type === 'feature' &&
|
|
34
|
+
selection.ids.length === ids.length &&
|
|
35
|
+
selection.ids.every((id, i) => id === ids[i]));
|
|
36
|
+
}
|
|
37
|
+
/** @internal */
|
|
38
|
+
export class SelectMode {
|
|
39
|
+
constructor() {
|
|
40
|
+
Object.defineProperty(this, "modeName", {
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: true,
|
|
43
|
+
writable: true,
|
|
44
|
+
value: 'select'
|
|
45
|
+
});
|
|
46
|
+
_SelectMode_context.set(this, void 0);
|
|
47
|
+
_SelectMode_dragHandler.set(this, new SelectModeDragHandler());
|
|
48
|
+
_SelectMode_config.set(this, DEFAULT_SELECTION_CONFIG);
|
|
49
|
+
}
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// Lifecycle
|
|
52
|
+
// ============================================================================
|
|
53
|
+
onStart(context) {
|
|
54
|
+
__classPrivateFieldSet(this, _SelectMode_context, context, "f");
|
|
55
|
+
context.map.getCanvas().style.cursor = 'default';
|
|
56
|
+
// If there are features awaiting editing, notify plugins and clear the editing state
|
|
57
|
+
const editingIds = context.store.getEditingIds();
|
|
58
|
+
if (editingIds.length > 0) {
|
|
59
|
+
for (const id of editingIds) {
|
|
60
|
+
const feature = context.store.getFeature(id);
|
|
61
|
+
if (feature) {
|
|
62
|
+
context.pluginManager?.notifyFeatureCreated(feature.id, feature.type);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
context.store.endEditing([...editingIds]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
onStop() {
|
|
69
|
+
const { store, map, pluginManager } = __classPrivateFieldGet(this, _SelectMode_context, "f");
|
|
70
|
+
pluginManager?.finishPluginInteraction();
|
|
71
|
+
__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").reset(store);
|
|
72
|
+
if (store.getBoxSelection())
|
|
73
|
+
store.setBoxSelection(null);
|
|
74
|
+
if (store.getSelectedVertices())
|
|
75
|
+
store.setSelectedVertices(null);
|
|
76
|
+
if (!map.dragPan.isEnabled())
|
|
77
|
+
map.dragPan.enable();
|
|
78
|
+
// Clear the selection when switching modes (not notified as a change)
|
|
79
|
+
store.transact(() => {
|
|
80
|
+
store.setSelection(null, []);
|
|
81
|
+
}, 'silent');
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Called after a state change from the outside (a change applied from outside the mode).
|
|
85
|
+
* Resets the mode's internal state to keep it consistent.
|
|
86
|
+
*/
|
|
87
|
+
onExternalStateChange() {
|
|
88
|
+
const { store } = __classPrivateFieldGet(this, _SelectMode_context, "f");
|
|
89
|
+
__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").reset(store);
|
|
90
|
+
// The selection and the vertex selection follow the change by themselves (the Store
|
|
91
|
+
// drops what was deleted or hidden and the vertices whose coordinates changed)
|
|
92
|
+
if (store.getDragState())
|
|
93
|
+
store.setDragState(null);
|
|
94
|
+
if (store.getBoxSelection())
|
|
95
|
+
store.setBoxSelection(null);
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// Mouse: down / up
|
|
99
|
+
// ============================================================================
|
|
100
|
+
/**
|
|
101
|
+
* Disable dragPan when a handle or a feature is hit on mouse down.
|
|
102
|
+
* @returns true when there was a hit (the event is consumed)
|
|
103
|
+
*/
|
|
104
|
+
onMouseDown(event) {
|
|
105
|
+
const { pluginManager, map, store } = __classPrivateFieldGet(this, _SelectMode_context, "f");
|
|
106
|
+
// During a plugin interaction: consume clicks inside the container
|
|
107
|
+
if (pluginManager?.isPluginInteracting()) {
|
|
108
|
+
const container = pluginManager.getPluginInteractionContainer();
|
|
109
|
+
if (container) {
|
|
110
|
+
const target = event.originalEvent.target;
|
|
111
|
+
if (container.contains(target))
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Shift+drag = start of a box selection: return false to avoid stopPropagation
|
|
116
|
+
if (event.modifiers.shift) {
|
|
117
|
+
map.dragPan.disable();
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
// While the interaction lock is on, dragPan is not disabled even on a
|
|
121
|
+
// handle / feature hit, and the drag is passed straight through to the map pan. While
|
|
122
|
+
// locked, moving / resizing / rotating / vertex editing are forbidden (drag-handler does not
|
|
123
|
+
// start them because of isInteractionBlocked), so this prevents the defect where dragging
|
|
124
|
+
// from on top of a feature kills the pan alone. Returning true here would make InputRouter
|
|
125
|
+
// call preventDefault and stop MapLibre's pan along with it, so false is always returned to
|
|
126
|
+
// let the event pass through. Selection by click is handled separately by
|
|
127
|
+
// onClick, so it is unaffected. Shift box selection is already handled above.
|
|
128
|
+
if (store.isInteractionLocked())
|
|
129
|
+
return false;
|
|
130
|
+
const orderedFeatures = getDisplayFeatures(store);
|
|
131
|
+
const selectedFeatures = getSelectedFeatures(store);
|
|
132
|
+
const transform = createCoordinateTransform(map);
|
|
133
|
+
// Test against the handles of the selected features / inside their bbox
|
|
134
|
+
if (selectedFeatures.length > 0) {
|
|
135
|
+
const bbox = computeSelectionBoundingBox(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope.extensions);
|
|
136
|
+
if (bbox) {
|
|
137
|
+
const zoom = map.getZoom();
|
|
138
|
+
const getAdditionalHandles = getAdditionalResizeHandlesCallback(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope);
|
|
139
|
+
const getAuxiliaryHandles = getAuxiliaryHandlesCallback(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope);
|
|
140
|
+
const handleHit = hitTestHandles(event.point, selectedFeatures, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), zoom, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope, getAdditionalHandles, getAuxiliaryHandles);
|
|
141
|
+
if (handleHit) {
|
|
142
|
+
map.dragPan.disable();
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const geoBbox = computeCombinedGeoBoundingBox(selectedFeatures, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope.extensions);
|
|
147
|
+
if (geoBbox) {
|
|
148
|
+
const geoLngLat = transform.unproject(event.point);
|
|
149
|
+
const geoPoint = [geoLngLat.lng, geoLngLat.lat];
|
|
150
|
+
if (isPointInGeoBoundingBox(geoPoint, geoBbox)) {
|
|
151
|
+
map.dragPan.disable();
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Selection-independent auxiliary handles (an extension implementation's focus, etc.). They
|
|
157
|
+
// appear even when the selection is empty, so they are taken after the selection handle test
|
|
158
|
+
// and before the feature hit test. They cannot be grabbed while readOnly (this prevents
|
|
159
|
+
// dragPan alone from dying even though no drag starts).
|
|
160
|
+
if (!store.isReadOnly()) {
|
|
161
|
+
const globalHit = hitTestGlobalAuxiliaryHandles(event.point, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), map.getZoom(), getGlobalAuxiliaryHandlesCallback(__classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope));
|
|
162
|
+
if (globalHit) {
|
|
163
|
+
map.dragPan.disable();
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Feature hit test (unified z traversal)
|
|
168
|
+
// Nothing is grabbed when a dataset is in the foreground. dragPan is also
|
|
169
|
+
// left alive so that the map can be panned even from on top of the data.
|
|
170
|
+
const top = __classPrivateFieldGet(this, _SelectMode_context, "f").hitTestTopmost(event.point, { orderedFeatures });
|
|
171
|
+
if (top?.kind === 'store') {
|
|
172
|
+
map.dragPan.disable();
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
onMouseUp() {
|
|
178
|
+
if (!__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive()) {
|
|
179
|
+
__classPrivateFieldGet(this, _SelectMode_context, "f").map.dragPan.enable();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// ============================================================================
|
|
183
|
+
// Click / DoubleClick
|
|
184
|
+
// ============================================================================
|
|
185
|
+
onClick(event) {
|
|
186
|
+
if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive())
|
|
187
|
+
return;
|
|
188
|
+
handleSelectClick(event, __classPrivateFieldGet(this, _SelectMode_context, "f"), __classPrivateFieldGet(this, _SelectMode_config, "f"));
|
|
189
|
+
}
|
|
190
|
+
onDoubleClick(event) {
|
|
191
|
+
handleSelectDoubleClick(event, __classPrivateFieldGet(this, _SelectMode_context, "f"));
|
|
192
|
+
}
|
|
193
|
+
// ============================================================================
|
|
194
|
+
// Drag
|
|
195
|
+
// ============================================================================
|
|
196
|
+
onDragStart(event) {
|
|
197
|
+
if (__classPrivateFieldGet(this, _SelectMode_context, "f").pluginManager?.isPluginInteracting())
|
|
198
|
+
return;
|
|
199
|
+
const { store, map } = __classPrivateFieldGet(this, _SelectMode_context, "f");
|
|
200
|
+
// Group / layer selections are also resolved to their members (so dragging the selection box
|
|
201
|
+
// moves a group as one).
|
|
202
|
+
const selectedIds = getSelectedFeatureIds(store);
|
|
203
|
+
const transform = createCoordinateTransform(map);
|
|
204
|
+
const dragStartPoint = event.dragStartPoint ?? event.point;
|
|
205
|
+
// Shift+drag = box selection
|
|
206
|
+
if (event.modifiers.shift) {
|
|
207
|
+
const geoLngLat = map.unproject([dragStartPoint.x, dragStartPoint.y]);
|
|
208
|
+
const startPoint = [geoLngLat.lng, geoLngLat.lat];
|
|
209
|
+
store.setBoxSelection({
|
|
210
|
+
startPoint,
|
|
211
|
+
endPoint: startPoint,
|
|
212
|
+
previousSelection: [...selectedIds],
|
|
213
|
+
});
|
|
214
|
+
map.dragPan.disable();
|
|
215
|
+
map.triggerRepaint();
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
// While the interaction lock is on, the drag is passed straight through to
|
|
219
|
+
// the map pan. Neither the selection is changed nor a drag operation started (paired with
|
|
220
|
+
// onMouseDown not disabling dragPan; starting a move selection here would select a feature
|
|
221
|
+
// during a pan). Shift box selection is already handled above, so it is preserved.
|
|
222
|
+
if (store.isInteractionLocked())
|
|
223
|
+
return;
|
|
224
|
+
// A handle hit on the selected features -> start the corresponding drag operation
|
|
225
|
+
if (selectedIds.length > 0) {
|
|
226
|
+
const selectedFeatures = getSelectedFeatures(store);
|
|
227
|
+
if (selectedFeatures.length > 0) {
|
|
228
|
+
const bbox = computeSelectionBoundingBox(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope.extensions);
|
|
229
|
+
if (bbox) {
|
|
230
|
+
const zoom = map.getZoom();
|
|
231
|
+
const getAdditionalHandles = getAdditionalResizeHandlesCallback(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope);
|
|
232
|
+
const getAuxiliaryHandles = getAuxiliaryHandlesCallback(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope);
|
|
233
|
+
const handleHit = hitTestHandles(dragStartPoint, selectedFeatures, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), zoom, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope, getAdditionalHandles, getAuxiliaryHandles);
|
|
234
|
+
if (handleHit) {
|
|
235
|
+
__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").startDrag(handleHit, event, __classPrivateFieldGet(this, _SelectMode_context, "f"), bbox);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Selection-independent auxiliary handles (an extension implementation's focus, etc.). When
|
|
242
|
+
// no selection handle was hit, they are taken before grabbing a feature. Whether delegation
|
|
243
|
+
// is accepted and the readOnly test are decided by drag-handler.
|
|
244
|
+
const globalHit = hitTestGlobalAuxiliaryHandles(dragStartPoint, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), map.getZoom(), getGlobalAuxiliaryHandlesCallback(__classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope));
|
|
245
|
+
if (globalHit) {
|
|
246
|
+
__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").startDrag(globalHit, event, __classPrivateFieldGet(this, _SelectMode_context, "f"), null);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
// When no handle was hit: select the feature -> move operation
|
|
250
|
+
// When a dataset is in the foreground, nothing is grabbed and no drag is
|
|
251
|
+
// started (dragPan is alive, so it becomes a map pan).
|
|
252
|
+
const orderedFeatures = getDisplayFeatures(store);
|
|
253
|
+
const top = __classPrivateFieldGet(this, _SelectMode_context, "f").hitTestTopmost(dragStartPoint, { orderedFeatures });
|
|
254
|
+
if (top?.kind !== 'store')
|
|
255
|
+
return;
|
|
256
|
+
const hitFeatureId = top.feature.id;
|
|
257
|
+
if (!selectedIds.includes(hitFeatureId)) {
|
|
258
|
+
const filtered = __classPrivateFieldGet(this, _SelectMode_context, "f").pluginManager?.filterSelectionCandidates([hitFeatureId]) ?? [
|
|
259
|
+
hitFeatureId,
|
|
260
|
+
];
|
|
261
|
+
if (filtered.length === 0)
|
|
262
|
+
return;
|
|
263
|
+
store.setSelection('feature', filtered);
|
|
264
|
+
}
|
|
265
|
+
const newSelectedFeatures = getSelectedFeatures(store);
|
|
266
|
+
const bbox = computeSelectionBoundingBox(newSelectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope.extensions);
|
|
267
|
+
const moveHit = { type: 'move' };
|
|
268
|
+
__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").startDrag(moveHit, event, __classPrivateFieldGet(this, _SelectMode_context, "f"), bbox);
|
|
269
|
+
}
|
|
270
|
+
onDragMove(event) {
|
|
271
|
+
const { store, map, pluginManager } = __classPrivateFieldGet(this, _SelectMode_context, "f");
|
|
272
|
+
const boxSelection = store.getBoxSelection();
|
|
273
|
+
// Update the box selection
|
|
274
|
+
if (boxSelection) {
|
|
275
|
+
const geoLngLat = map.unproject([event.point.x, event.point.y]);
|
|
276
|
+
const endPoint = [geoLngLat.lng, geoLngLat.lat];
|
|
277
|
+
const updatedBoxSelection = { ...boxSelection, endPoint };
|
|
278
|
+
store.setBoxSelection(updatedBoxSelection);
|
|
279
|
+
// Live selection preview (a frame that selects the same features changes nothing)
|
|
280
|
+
const hitIds = queryFeaturesInBox(updatedBoxSelection, __classPrivateFieldGet(this, _SelectMode_context, "f"));
|
|
281
|
+
const filtered = hitIds.length > 0 ? (pluginManager?.filterSelectionCandidates(hitIds) ?? hitIds) : hitIds;
|
|
282
|
+
if (!selectsExactly(store.getSelection(), filtered)) {
|
|
283
|
+
if (filtered.length === 0) {
|
|
284
|
+
store.setSelection(null, []);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
store.setSelection('feature', filtered);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive()) {
|
|
293
|
+
__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").updateDrag(event, __classPrivateFieldGet(this, _SelectMode_context, "f"));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
onDragEnd(event) {
|
|
297
|
+
const { store, map, pluginManager } = __classPrivateFieldGet(this, _SelectMode_context, "f");
|
|
298
|
+
const boxSelection = store.getBoxSelection();
|
|
299
|
+
// Commit the box selection
|
|
300
|
+
if (boxSelection) {
|
|
301
|
+
const hitIds = queryFeaturesInBox(boxSelection, __classPrivateFieldGet(this, _SelectMode_context, "f"));
|
|
302
|
+
const filtered = hitIds.length > 0 ? (pluginManager?.filterSelectionCandidates(hitIds) ?? hitIds) : hitIds;
|
|
303
|
+
if (filtered.length === 0) {
|
|
304
|
+
store.setSelection(null, []);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
store.setSelection('feature', filtered);
|
|
308
|
+
}
|
|
309
|
+
store.setBoxSelection(null);
|
|
310
|
+
map.dragPan.enable();
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive()) {
|
|
314
|
+
__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").endDrag(__classPrivateFieldGet(this, _SelectMode_context, "f"), event);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* The press ended without a release (a second finger, or the browser cancelled the touch)
|
|
319
|
+
*
|
|
320
|
+
* Nothing is committed: a box selection returns to the selection it started from, a drag
|
|
321
|
+
* operation is abandoned, and the pan goes back to MapLibre (which also covers a press that
|
|
322
|
+
* disabled it in onMouseDown and never became a drag).
|
|
323
|
+
*/
|
|
324
|
+
onDragCancel() {
|
|
325
|
+
const { store, map } = __classPrivateFieldGet(this, _SelectMode_context, "f");
|
|
326
|
+
const boxSelection = store.getBoxSelection();
|
|
327
|
+
if (boxSelection) {
|
|
328
|
+
if (boxSelection.previousSelection.length === 0) {
|
|
329
|
+
store.setSelection(null, []);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
store.setSelection('feature', [...boxSelection.previousSelection]);
|
|
333
|
+
}
|
|
334
|
+
store.setBoxSelection(null);
|
|
335
|
+
}
|
|
336
|
+
if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive()) {
|
|
337
|
+
__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").reset(store);
|
|
338
|
+
}
|
|
339
|
+
if (store.getDragState())
|
|
340
|
+
store.setDragState(null);
|
|
341
|
+
if (!map.dragPan.isEnabled())
|
|
342
|
+
map.dragPan.enable();
|
|
343
|
+
}
|
|
344
|
+
// ============================================================================
|
|
345
|
+
// Keyboard / MouseMove
|
|
346
|
+
// ============================================================================
|
|
347
|
+
onKeyDown(event) {
|
|
348
|
+
const { pluginManager, store } = __classPrivateFieldGet(this, _SelectMode_context, "f");
|
|
349
|
+
// Skip destructive key operations during a plugin interaction
|
|
350
|
+
if (pluginManager?.isPluginInteracting()) {
|
|
351
|
+
if (event.key === 'Escape') {
|
|
352
|
+
pluginManager.cancelPluginInteraction();
|
|
353
|
+
}
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
// Escape during a drag cancels the drag (the InputNormalizer already turns a real
|
|
357
|
+
// Escape into dragcancel; this covers synthetic input)
|
|
358
|
+
if (event.key === 'Escape' && (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive() || store.getBoxSelection())) {
|
|
359
|
+
this.onDragCancel();
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
// Arrow keys: move the selection by a few pixels. A used key is not also a map pan
|
|
363
|
+
if (handleNudgeShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"), event.key, event.modifiers)) {
|
|
364
|
+
event.originalEvent.preventDefault();
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const isMetaOrCtrl = event.modifiers.meta || event.modifiers.ctrl;
|
|
368
|
+
// Cmd+G / Ctrl+G: group
|
|
369
|
+
if (event.key.toLowerCase() === 'g' && isMetaOrCtrl && !event.modifiers.shift) {
|
|
370
|
+
event.originalEvent.preventDefault();
|
|
371
|
+
handleGroupShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"));
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
// Shift+Cmd+G / Shift+Ctrl+G: ungroup
|
|
375
|
+
if (event.key.toLowerCase() === 'g' && isMetaOrCtrl && event.modifiers.shift) {
|
|
376
|
+
event.originalEvent.preventDefault();
|
|
377
|
+
handleUngroupShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"));
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
// Delete / Backspace: delete the selection
|
|
381
|
+
if (event.key === 'Delete' || event.key === 'Backspace') {
|
|
382
|
+
handleDeleteShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"));
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
// Escape: cancel the box selection / clear the selection
|
|
386
|
+
if (event.key === 'Escape') {
|
|
387
|
+
handleEscapeShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"));
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
onMouseMove(event) {
|
|
391
|
+
if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive() || __classPrivateFieldGet(this, _SelectMode_context, "f").pluginManager?.isPluginInteracting()) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
updateCursorForSelection(event, __classPrivateFieldGet(this, _SelectMode_context, "f"), __classPrivateFieldGet(this, _SelectMode_config, "f"));
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
_SelectMode_context = new WeakMap(), _SelectMode_dragHandler = new WeakMap(), _SelectMode_config = new WeakMap();
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ModeContext } from '../handler.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handling of the group shortcut (Cmd+G / Ctrl+G).
|
|
4
|
+
*
|
|
5
|
+
* The behavior is identical to the API's groupSelection (the key, the menu and the API place the
|
|
6
|
+
* new group at the same position).
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleGroupShortcut(context: ModeContext): void;
|
|
9
|
+
/**
|
|
10
|
+
* Handling of the ungroup shortcut (Shift+Cmd+G / Shift+Ctrl+G).
|
|
11
|
+
*
|
|
12
|
+
* The behavior is identical to the API's ungroupSelection (keeping the key, the menu and the API
|
|
13
|
+
* consistent): a group selection is dissolved, and for a member feature selection only that
|
|
14
|
+
* member leaves.
|
|
15
|
+
*/
|
|
16
|
+
export declare function handleUngroupShortcut(context: ModeContext): void;
|
|
17
|
+
/**
|
|
18
|
+
* Handling of the Delete / Backspace key: deletes what is selected, exactly like
|
|
19
|
+
* `draw.deleteSelection()` (vertices, features, groups or layers; locked items are kept).
|
|
20
|
+
*/
|
|
21
|
+
export declare function handleDeleteShortcut(context: ModeContext): void;
|
|
22
|
+
/**
|
|
23
|
+
* Handling of the arrow keys: moves the selected features by a few pixels on the screen
|
|
24
|
+
*
|
|
25
|
+
* One key press is one committed change (one notification). Like a drag, nothing moves while
|
|
26
|
+
* any selected feature is blocked (read-only, the interaction lock or a lock of its own).
|
|
27
|
+
*
|
|
28
|
+
* @returns whether the key was used (a selection was moved); otherwise the key is left to
|
|
29
|
+
* the map (MapLibre pans with it)
|
|
30
|
+
*/
|
|
31
|
+
export declare function handleNudgeShortcut(context: ModeContext, key: string, modifiers: {
|
|
32
|
+
shift: boolean;
|
|
33
|
+
ctrl: boolean;
|
|
34
|
+
alt: boolean;
|
|
35
|
+
meta: boolean;
|
|
36
|
+
}): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Handling of the Escape key
|
|
39
|
+
*/
|
|
40
|
+
export declare function handleEscapeShortcut(context: ModeContext): void;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Shortcut key handler
|
|
5
|
+
*
|
|
6
|
+
* Responsible for handling keyboard shortcuts in select mode
|
|
7
|
+
*/
|
|
8
|
+
import { groupSelection, ungroupSelection } from '../../operations/layer-operations.js';
|
|
9
|
+
import { deleteSelection } from '../../operations/selection-operations.js';
|
|
10
|
+
import { mapCoordinatesDeep } from '../../shared/utils/coordinates.js';
|
|
11
|
+
import { isInteractionBlocked } from '../../store/lock.js';
|
|
12
|
+
import { getSelectedFeatureIds } from '../../view/ui/helper.js';
|
|
13
|
+
/** The distance an arrow key moves the selection (pixels; with Shift, NUDGE_LARGE) */
|
|
14
|
+
const NUDGE_SMALL = 1;
|
|
15
|
+
const NUDGE_LARGE = 10;
|
|
16
|
+
/** Screen direction of each arrow key */
|
|
17
|
+
const ARROW_DIRECTIONS = {
|
|
18
|
+
ArrowLeft: [-1, 0],
|
|
19
|
+
ArrowRight: [1, 0],
|
|
20
|
+
ArrowUp: [0, -1],
|
|
21
|
+
ArrowDown: [0, 1],
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Handling of the group shortcut (Cmd+G / Ctrl+G).
|
|
25
|
+
*
|
|
26
|
+
* The behavior is identical to the API's groupSelection (the key, the menu and the API place the
|
|
27
|
+
* new group at the same position).
|
|
28
|
+
*/
|
|
29
|
+
export function handleGroupShortcut(context) {
|
|
30
|
+
const { store, autoNameGenerator, generateFeatureId } = context;
|
|
31
|
+
if (store.isReadOnly() || store.isInteractionLocked())
|
|
32
|
+
return;
|
|
33
|
+
groupSelection(store, generateFeatureId, autoNameGenerator);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Handling of the ungroup shortcut (Shift+Cmd+G / Shift+Ctrl+G).
|
|
37
|
+
*
|
|
38
|
+
* The behavior is identical to the API's ungroupSelection (keeping the key, the menu and the API
|
|
39
|
+
* consistent): a group selection is dissolved, and for a member feature selection only that
|
|
40
|
+
* member leaves.
|
|
41
|
+
*/
|
|
42
|
+
export function handleUngroupShortcut(context) {
|
|
43
|
+
const { store } = context;
|
|
44
|
+
if (store.isReadOnly() || store.isInteractionLocked())
|
|
45
|
+
return;
|
|
46
|
+
ungroupSelection(store);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Handling of the Delete / Backspace key: deletes what is selected, exactly like
|
|
50
|
+
* `draw.deleteSelection()` (vertices, features, groups or layers; locked items are kept).
|
|
51
|
+
*/
|
|
52
|
+
export function handleDeleteShortcut(context) {
|
|
53
|
+
deleteSelection(context.store);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Handling of the arrow keys: moves the selected features by a few pixels on the screen
|
|
57
|
+
*
|
|
58
|
+
* One key press is one committed change (one notification). Like a drag, nothing moves while
|
|
59
|
+
* any selected feature is blocked (read-only, the interaction lock or a lock of its own).
|
|
60
|
+
*
|
|
61
|
+
* @returns whether the key was used (a selection was moved); otherwise the key is left to
|
|
62
|
+
* the map (MapLibre pans with it)
|
|
63
|
+
*/
|
|
64
|
+
export function handleNudgeShortcut(context, key, modifiers) {
|
|
65
|
+
const direction = ARROW_DIRECTIONS[key];
|
|
66
|
+
if (!direction || modifiers.ctrl || modifiers.alt || modifiers.meta)
|
|
67
|
+
return false;
|
|
68
|
+
const { store, map } = context;
|
|
69
|
+
const features = getSelectedFeatureIds(store)
|
|
70
|
+
.map((id) => store.getFeature(id))
|
|
71
|
+
.filter((f) => f !== undefined);
|
|
72
|
+
if (features.length === 0)
|
|
73
|
+
return false;
|
|
74
|
+
if (features.some((f) => isInteractionBlocked(f, store)))
|
|
75
|
+
return false;
|
|
76
|
+
// One offset in degrees for every feature, taken at a point of the selection, so the
|
|
77
|
+
// features keep their relative placement (the same translation as a move drag)
|
|
78
|
+
const reference = firstCoordinate(features[0].coordinates);
|
|
79
|
+
if (!reference)
|
|
80
|
+
return false;
|
|
81
|
+
const step = modifiers.shift ? NUDGE_LARGE : NUDGE_SMALL;
|
|
82
|
+
const from = map.project(reference);
|
|
83
|
+
const to = map.unproject([from.x + direction[0] * step, from.y + direction[1] * step]);
|
|
84
|
+
const dx = to.lng - reference[0];
|
|
85
|
+
const dy = to.lat - reference[1];
|
|
86
|
+
store.transact(() => {
|
|
87
|
+
for (const feature of features) {
|
|
88
|
+
const coordinates = mapCoordinatesDeep(feature.coordinates, (c) => [c[0] + dx, c[1] + dy]);
|
|
89
|
+
store.updateFeature(feature.id, { coordinates });
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
function firstCoordinate(coordinates) {
|
|
95
|
+
let value = coordinates;
|
|
96
|
+
while (Array.isArray(value) && Array.isArray(value[0]))
|
|
97
|
+
value = value[0];
|
|
98
|
+
return Array.isArray(value) && typeof value[0] === 'number' ? value : null;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Handling of the Escape key
|
|
102
|
+
*/
|
|
103
|
+
export function handleEscapeShortcut(context) {
|
|
104
|
+
const { store, map } = context;
|
|
105
|
+
const boxSelection = store.getBoxSelection();
|
|
106
|
+
if (boxSelection) {
|
|
107
|
+
// Cancel when a box selection is in progress (restore the selection as it was when the drag
|
|
108
|
+
// started)
|
|
109
|
+
if (boxSelection.previousSelection.length === 0) {
|
|
110
|
+
store.setSelection(null, []);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
store.setSelection('feature', boxSelection.previousSelection);
|
|
114
|
+
}
|
|
115
|
+
store.setBoxSelection(null);
|
|
116
|
+
map.dragPan.enable();
|
|
117
|
+
map.triggerRepaint();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Clear the vertex selection when vertices are selected
|
|
121
|
+
const selectedVertices = store.getSelectedVertices();
|
|
122
|
+
if (selectedVertices) {
|
|
123
|
+
store.setSelectedVertices(null);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Clear the feature selection
|
|
127
|
+
store.setSelection(null, []);
|
|
128
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations module
|
|
3
|
+
*
|
|
4
|
+
* Only the symbols that src/index.ts publishes are listed here (see "The public
|
|
5
|
+
* surface" in CONTRIBUTING.md). Internal code imports from the defining file.
|
|
6
|
+
*/
|
|
7
|
+
export type { ResizeState } from './resize.js';
|
|
8
|
+
export type { TraceGraph, TraceGraphEdge, TraceGraphEndpoint, TraceGraphNode, } from './trace-graph.js';
|
|
9
|
+
export { buildTraceGraph, findTracePath } from './trace-graph.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|