@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,708 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
5
|
+
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");
|
|
6
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
9
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
10
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
11
|
+
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");
|
|
12
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
13
|
+
};
|
|
14
|
+
var _MemoryDocumentStore_instances, _MemoryDocumentStore_features, _MemoryDocumentStore_layers, _MemoryDocumentStore_groups, _MemoryDocumentStore_layerOrder, _MemoryDocumentStore_metadata, _MemoryDocumentStore_layerOrderIndex, _MemoryDocumentStore_groupFeatureIndex, _MemoryDocumentStore_pendingFeaturePlacement, _MemoryDocumentStore_pendingGroupPlacement, _MemoryDocumentStore_operationDepth, _MemoryDocumentStore_freshLayers, _MemoryDocumentStore_freshGroups, _MemoryDocumentStore_bus, _MemoryDocumentStore_fileStore, _MemoryDocumentStore_createGroup, _MemoryDocumentStore_mutateLayerOrder, _MemoryDocumentStore_mutateGroupFeatureIds, _MemoryDocumentStore_writableLayer, _MemoryDocumentStore_writableGroup, _MemoryDocumentStore_freezeFresh, _MemoryDocumentStore_layerOrderSet, _MemoryDocumentStore_groupFeatureSet, _MemoryDocumentStore_withinOperation, _MemoryDocumentStore_scheduleGroupPlacement, _MemoryDocumentStore_settlePlacements, _MemoryDocumentStore_isListedInAnyLayer, _MemoryDocumentStore_assertLayerExists, _MemoryDocumentStore_addToContainer, _MemoryDocumentStore_removeFromContainer, _MemoryDocumentStore_addItemToLayerOrder, _MemoryDocumentStore_removeItemFromLayerOrder, _MemoryDocumentStore_addFeatureToGroupOrder, _MemoryDocumentStore_removeFeatureFromGroupOrder;
|
|
15
|
+
/**
|
|
16
|
+
* MemoryStore
|
|
17
|
+
*
|
|
18
|
+
* The in-memory Store: a DrawStore over a MemoryDocumentStore.
|
|
19
|
+
*
|
|
20
|
+
* MemoryDocumentStore is the in-memory implementation of the DocumentStore contract.
|
|
21
|
+
* Keeping Feature / Layer / Group consistent (cascading updates on deletion, cascading
|
|
22
|
+
* updates when groupId changes, etc.) is the responsibility of this file. Transactions and
|
|
23
|
+
* listeners are delegated to memory/change-bus.ts and File CRUD to memory/file-store.ts.
|
|
24
|
+
*
|
|
25
|
+
* What it returns is frozen and never changed afterwards: a feature is stored as a frozen
|
|
26
|
+
* copy of what it was given, and a layer or a group whose order changes is replaced by a
|
|
27
|
+
* copy (copied once per notification, so that a bulk import stays linear) and frozen when
|
|
28
|
+
* the notification goes out.
|
|
29
|
+
*/
|
|
30
|
+
import { DrawStore } from './draw-store.js';
|
|
31
|
+
import { ChangeBus } from './memory/change-bus.js';
|
|
32
|
+
import { FileStore } from './memory/file-store.js';
|
|
33
|
+
import { frozenCopy, frozenFeature } from './memory/frozen.js';
|
|
34
|
+
/** Creates an empty in-memory Store */
|
|
35
|
+
export const MemoryStore = class extends DrawStore {
|
|
36
|
+
constructor() {
|
|
37
|
+
super(new MemoryDocumentStore());
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* The in-memory DocumentStore
|
|
42
|
+
*
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export class MemoryDocumentStore {
|
|
46
|
+
constructor() {
|
|
47
|
+
_MemoryDocumentStore_instances.add(this);
|
|
48
|
+
_MemoryDocumentStore_features.set(this, new Map());
|
|
49
|
+
_MemoryDocumentStore_layers.set(this, new Map());
|
|
50
|
+
_MemoryDocumentStore_groups.set(this, new Map());
|
|
51
|
+
_MemoryDocumentStore_layerOrder.set(this, []);
|
|
52
|
+
_MemoryDocumentStore_metadata.set(this, {});
|
|
53
|
+
/**
|
|
54
|
+
* The content set of layer.order (layer ID -> the set of IDs listed in order).
|
|
55
|
+
*
|
|
56
|
+
* It is an index whose only purpose is to make membership tests O(1), and it always keeps
|
|
57
|
+
* the same content as `#layers.get(id).order` (an invariant). Because membership used to be
|
|
58
|
+
* tested with `layer.order.includes()`, inserting N entries at once into a layer whose order
|
|
59
|
+
* was already populated cost O(N^2) in total (the main cause of draw.load going quadratic).
|
|
60
|
+
*
|
|
61
|
+
* The order arrays the store returns are frozen, so the outside cannot rewrite them behind
|
|
62
|
+
* this index.
|
|
63
|
+
*/
|
|
64
|
+
_MemoryDocumentStore_layerOrderIndex.set(this, new Map());
|
|
65
|
+
/** The content set of group.featureIds. The group version of #layerOrderIndex (same invariant) */
|
|
66
|
+
_MemoryDocumentStore_groupFeatureIndex.set(this, new Map());
|
|
67
|
+
/**
|
|
68
|
+
* Placements settled at the end of the outermost store operation (see #withinOperation).
|
|
69
|
+
*
|
|
70
|
+
* When a change of layerId / groupId makes a feature standalone, or a group is created that
|
|
71
|
+
* no layer lists, the store must list it somewhere so that it stays reachable. Callers
|
|
72
|
+
* inside a transaction often place the item themselves right after (at a chosen index), so
|
|
73
|
+
* listing it at once would duplicate it. The store therefore only records the item here
|
|
74
|
+
* and lists it at the end of the operation when nobody has listed it by then.
|
|
75
|
+
*/
|
|
76
|
+
_MemoryDocumentStore_pendingFeaturePlacement.set(this, new Set());
|
|
77
|
+
_MemoryDocumentStore_pendingGroupPlacement.set(this, new Map());
|
|
78
|
+
_MemoryDocumentStore_operationDepth.set(this, 0);
|
|
79
|
+
/**
|
|
80
|
+
* Layers and groups whose stored object was copied during the current notification. Their
|
|
81
|
+
* order / featureIds may still be changed in place until the notification goes out, when
|
|
82
|
+
* they are frozen (#freezeFresh).
|
|
83
|
+
*/
|
|
84
|
+
_MemoryDocumentStore_freshLayers.set(this, new Set());
|
|
85
|
+
_MemoryDocumentStore_freshGroups.set(this, new Set());
|
|
86
|
+
_MemoryDocumentStore_bus.set(this, new ChangeBus(() => __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_freezeFresh).call(this)));
|
|
87
|
+
_MemoryDocumentStore_fileStore.set(this, new FileStore());
|
|
88
|
+
}
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// Feature
|
|
91
|
+
// ============================================================================
|
|
92
|
+
getFeature(id) {
|
|
93
|
+
return __classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").get(id);
|
|
94
|
+
}
|
|
95
|
+
getAllFeatures() {
|
|
96
|
+
return Array.from(__classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").values());
|
|
97
|
+
}
|
|
98
|
+
createFeature(feature) {
|
|
99
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").has(feature.id)) {
|
|
100
|
+
throw new Error(`Feature with id "${feature.id}" already exists`);
|
|
101
|
+
}
|
|
102
|
+
// A feature must be reachable from exactly one container (its group, or else its layer).
|
|
103
|
+
// A reference to a container that does not exist would leave it stored but never drawn,
|
|
104
|
+
// hit or exported in order, so it is rejected before anything is written.
|
|
105
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_assertLayerExists).call(this, feature.layerId);
|
|
106
|
+
if (feature.groupId && !__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").has(feature.groupId)) {
|
|
107
|
+
throw new Error(`Group with id "${feature.groupId}" not found`);
|
|
108
|
+
}
|
|
109
|
+
const stored = frozenFeature(undefined, feature);
|
|
110
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").set(stored.id, stored);
|
|
111
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_addToContainer).call(this, stored);
|
|
112
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({ features: { created: [stored] } });
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Updates a feature
|
|
116
|
+
*
|
|
117
|
+
* options.isIntermediate has no effect on the application of the update (an intermediate
|
|
118
|
+
* state is applied as usual). Only when it is set is it passed through to
|
|
119
|
+
* StateChanges.features.updated, so that the receiver can tell an intermediate update from
|
|
120
|
+
* a final one.
|
|
121
|
+
*
|
|
122
|
+
* When layerId or groupId changes the container of the feature (its group, or else its
|
|
123
|
+
* layer), the feature leaves the order of the old container at once. It joins the group at
|
|
124
|
+
* the tail at once; it joins the order of its layer at the tail at the end of the
|
|
125
|
+
* operation, unless the caller has listed it by then. A layerId that does not exist is
|
|
126
|
+
* rejected. A groupId whose group does not exist yet
|
|
127
|
+
* is accepted, because replaying recorded changes can set groupId before the group is
|
|
128
|
+
* created again (createGroup then lists the feature from its featureIds).
|
|
129
|
+
*/
|
|
130
|
+
updateFeature(id, updates, options) {
|
|
131
|
+
const previous = __classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").get(id);
|
|
132
|
+
if (!previous) {
|
|
133
|
+
throw new Error(`Feature with id "${id}" not found`);
|
|
134
|
+
}
|
|
135
|
+
if ('layerId' in updates && updates.layerId !== previous.layerId) {
|
|
136
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_assertLayerExists).call(this, updates.layerId);
|
|
137
|
+
}
|
|
138
|
+
const updated = frozenFeature(previous, { ...updates, id });
|
|
139
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_withinOperation).call(this, () => {
|
|
140
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").set(id, updated);
|
|
141
|
+
if (containerKey(previous) !== containerKey(updated)) {
|
|
142
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_removeFromContainer).call(this, previous);
|
|
143
|
+
if (updated.groupId) {
|
|
144
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_addFeatureToGroupOrder).call(this, id, updated.groupId);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_pendingFeaturePlacement, "f").add(id);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({
|
|
152
|
+
features: {
|
|
153
|
+
updated: [
|
|
154
|
+
{
|
|
155
|
+
id,
|
|
156
|
+
feature: updated,
|
|
157
|
+
previous,
|
|
158
|
+
// Add the key only for an intermediate state (a final update has no such key)
|
|
159
|
+
...(options?.isIntermediate ? { isIntermediate: true } : {}),
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
deleteFeature(id) {
|
|
166
|
+
const feature = __classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").get(id);
|
|
167
|
+
if (!feature) {
|
|
168
|
+
throw new Error(`Feature with id "${id}" not found`);
|
|
169
|
+
}
|
|
170
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").delete(id);
|
|
171
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_removeItemFromLayerOrder).call(this, id, feature.layerId);
|
|
172
|
+
if (feature.groupId) {
|
|
173
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_removeFeatureFromGroupOrder).call(this, id, feature.groupId);
|
|
174
|
+
}
|
|
175
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({ features: { deleted: [feature] } });
|
|
176
|
+
}
|
|
177
|
+
getOrderedFeatures() {
|
|
178
|
+
const result = [];
|
|
179
|
+
for (const layerId of __classPrivateFieldGet(this, _MemoryDocumentStore_layerOrder, "f")) {
|
|
180
|
+
const layer = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(layerId);
|
|
181
|
+
if (!layer?.visible)
|
|
182
|
+
continue;
|
|
183
|
+
for (const itemId of layer.order) {
|
|
184
|
+
const group = __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(itemId);
|
|
185
|
+
if (group) {
|
|
186
|
+
if (!group.visible)
|
|
187
|
+
continue;
|
|
188
|
+
for (const featureId of group.featureIds) {
|
|
189
|
+
const feature = __classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").get(featureId);
|
|
190
|
+
if (feature?.visible)
|
|
191
|
+
result.push(feature);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
const feature = __classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").get(itemId);
|
|
196
|
+
if (feature?.visible)
|
|
197
|
+
result.push(feature);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
// ============================================================================
|
|
204
|
+
// Layer
|
|
205
|
+
// ============================================================================
|
|
206
|
+
getLayer(id) {
|
|
207
|
+
return __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(id);
|
|
208
|
+
}
|
|
209
|
+
getAllLayers() {
|
|
210
|
+
return Array.from(__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").values());
|
|
211
|
+
}
|
|
212
|
+
createLayer(layer) {
|
|
213
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").has(layer.id)) {
|
|
214
|
+
throw new Error(`Layer with id "${layer.id}" already exists`);
|
|
215
|
+
}
|
|
216
|
+
// The order stays open for the members created in the same notification
|
|
217
|
+
const stored = { ...frozenFields(layer), order: [...layer.order] };
|
|
218
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").set(layer.id, stored);
|
|
219
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f").add(layer.id);
|
|
220
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrderIndex, "f").set(layer.id, new Set(layer.order));
|
|
221
|
+
// An id the application already placed on the stacking order keeps its position
|
|
222
|
+
if (!__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrder, "f").includes(layer.id))
|
|
223
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrder, "f").push(layer.id);
|
|
224
|
+
// The created entry is the layer as it was created (the stored one may still gain members
|
|
225
|
+
// in the same notification)
|
|
226
|
+
const created = Object.freeze({ ...stored, order: Object.freeze([...stored.order]) });
|
|
227
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({ layers: { created: [created] } });
|
|
228
|
+
}
|
|
229
|
+
updateLayer(id, updates) {
|
|
230
|
+
const previous = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(id);
|
|
231
|
+
if (!previous) {
|
|
232
|
+
throw new Error(`Layer with id "${id}" not found`);
|
|
233
|
+
}
|
|
234
|
+
const updated = {
|
|
235
|
+
...previous,
|
|
236
|
+
...frozenFields(updates),
|
|
237
|
+
id,
|
|
238
|
+
order: [...(updates.order ?? previous.order)],
|
|
239
|
+
};
|
|
240
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f").has(id))
|
|
241
|
+
Object.freeze(Object.freeze(previous).order);
|
|
242
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").set(id, updated);
|
|
243
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f").add(id);
|
|
244
|
+
// Rebuild the index only when order has been replaced (if it is left as is, it is the same
|
|
245
|
+
// array as previous.order, so the index also stays valid).
|
|
246
|
+
if (updates.order)
|
|
247
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrderIndex, "f").set(id, new Set(updated.order));
|
|
248
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({ layers: { updated: [{ id, layer: updated, previous }] } });
|
|
249
|
+
}
|
|
250
|
+
deleteLayer(id) {
|
|
251
|
+
const layer = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(id);
|
|
252
|
+
if (!layer) {
|
|
253
|
+
throw new Error(`Layer with id "${id}" not found`);
|
|
254
|
+
}
|
|
255
|
+
// Delete the features and groups in the layer
|
|
256
|
+
for (const itemId of [...layer.order]) {
|
|
257
|
+
const group = __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(itemId);
|
|
258
|
+
if (group) {
|
|
259
|
+
for (const featureId of [...group.featureIds]) {
|
|
260
|
+
this.deleteFeature(featureId);
|
|
261
|
+
}
|
|
262
|
+
// An empty group is deleted automatically the moment the last feature in the group is
|
|
263
|
+
// removed, so delete it explicitly only when it still remains.
|
|
264
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").has(itemId)) {
|
|
265
|
+
this.deleteGroup(itemId);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else if (__classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").has(itemId)) {
|
|
269
|
+
this.deleteFeature(itemId);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// The last state of the layer (its order has emptied as its members left)
|
|
273
|
+
const deleted = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(id) ?? layer;
|
|
274
|
+
Object.freeze(Object.freeze(deleted).order);
|
|
275
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f").delete(id);
|
|
276
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").delete(id);
|
|
277
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrderIndex, "f").delete(id);
|
|
278
|
+
const idx = __classPrivateFieldGet(this, _MemoryDocumentStore_layerOrder, "f").indexOf(id);
|
|
279
|
+
if (idx !== -1)
|
|
280
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrder, "f").splice(idx, 1);
|
|
281
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({ layers: { deleted: [deleted] } });
|
|
282
|
+
}
|
|
283
|
+
getLayerOrder() {
|
|
284
|
+
// Returning the internal array as is would let the outside rewrite it and break the SSoT,
|
|
285
|
+
// so a defensive copy is returned (consistent with getSelection / getMetadata).
|
|
286
|
+
return [...__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrder, "f")];
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Replaces the stacking order (see {@link DocumentStore.setLayerOrder})
|
|
290
|
+
*
|
|
291
|
+
* The entries are not only layer IDs: the entries of the application
|
|
292
|
+
* (datasets, separators) are kept as they are. Only what cannot be an entry is dropped:
|
|
293
|
+
* a value that is not a non-empty string, and a repeated entry after its first position.
|
|
294
|
+
*
|
|
295
|
+
* The membership index within a layer (#layerOrderIndex) is an index over the layer.order of
|
|
296
|
+
* each layer, which is a different thing from this sequence, so it is not touched.
|
|
297
|
+
*/
|
|
298
|
+
setLayerOrder(order) {
|
|
299
|
+
const previous = [...__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrder, "f")];
|
|
300
|
+
__classPrivateFieldSet(this, _MemoryDocumentStore_layerOrder, [...new Set(order.filter((id) => typeof id === 'string' && id !== ''))], "f");
|
|
301
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({
|
|
302
|
+
layers: { orderChanged: { order: [...__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrder, "f")], previous } },
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
reorderInLayer(itemId, layerId, newIndex) {
|
|
306
|
+
const current = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(layerId);
|
|
307
|
+
if (!current) {
|
|
308
|
+
throw new Error(`Layer with id "${layerId}" not found`);
|
|
309
|
+
}
|
|
310
|
+
const currentIndex = current.order.indexOf(itemId);
|
|
311
|
+
if (currentIndex === -1) {
|
|
312
|
+
throw new Error(`Item "${itemId}" not found in layer "${layerId}"`);
|
|
313
|
+
}
|
|
314
|
+
const previousOrder = [...current.order];
|
|
315
|
+
const layer = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_writableLayer).call(this, current);
|
|
316
|
+
layer.order.splice(currentIndex, 1);
|
|
317
|
+
layer.order.splice(newIndex, 0, itemId);
|
|
318
|
+
// An update of this layer already stacked in the notification carries the new object
|
|
319
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").hasPendingLayerUpdate(layerId))
|
|
320
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").mergeLayerUpdate(layer, undefined);
|
|
321
|
+
// Emit the dedicated layerReorder (not layers.updated)
|
|
322
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({
|
|
323
|
+
layerReorder: { layerId, order: [...layer.order], previous: previousOrder },
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
reorderInGroup(featureId, groupId, newIndex) {
|
|
327
|
+
const current = __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(groupId);
|
|
328
|
+
if (!current) {
|
|
329
|
+
throw new Error(`Group with id "${groupId}" not found`);
|
|
330
|
+
}
|
|
331
|
+
const currentIndex = current.featureIds.indexOf(featureId);
|
|
332
|
+
if (currentIndex === -1) {
|
|
333
|
+
throw new Error(`Feature "${featureId}" not found in group "${groupId}"`);
|
|
334
|
+
}
|
|
335
|
+
const previousFeatureIds = [...current.featureIds];
|
|
336
|
+
const group = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_writableGroup).call(this, current);
|
|
337
|
+
group.featureIds.splice(currentIndex, 1);
|
|
338
|
+
group.featureIds.splice(newIndex, 0, featureId);
|
|
339
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").hasPendingGroupUpdate(groupId))
|
|
340
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").mergeGroupUpdate(group, undefined);
|
|
341
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({
|
|
342
|
+
groupReorder: { groupId, featureIds: [...group.featureIds], previous: previousFeatureIds },
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
// ============================================================================
|
|
346
|
+
// Group
|
|
347
|
+
// ============================================================================
|
|
348
|
+
getGroup(id) {
|
|
349
|
+
return __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(id);
|
|
350
|
+
}
|
|
351
|
+
getAllGroups() {
|
|
352
|
+
return Array.from(__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").values());
|
|
353
|
+
}
|
|
354
|
+
createGroup(group) {
|
|
355
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").has(group.id)) {
|
|
356
|
+
throw new Error(`Group with id "${group.id}" already exists`);
|
|
357
|
+
}
|
|
358
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_withinOperation).call(this, () => __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_createGroup).call(this, group));
|
|
359
|
+
}
|
|
360
|
+
updateGroup(id, updates) {
|
|
361
|
+
const previous = __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(id);
|
|
362
|
+
if (!previous) {
|
|
363
|
+
throw new Error(`Group with id "${id}" not found`);
|
|
364
|
+
}
|
|
365
|
+
const updated = {
|
|
366
|
+
...previous,
|
|
367
|
+
...frozenFields(updates),
|
|
368
|
+
id,
|
|
369
|
+
featureIds: [...(updates.featureIds ?? previous.featureIds)],
|
|
370
|
+
};
|
|
371
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f").has(id))
|
|
372
|
+
Object.freeze(Object.freeze(previous).featureIds);
|
|
373
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").set(id, updated);
|
|
374
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f").add(id);
|
|
375
|
+
// Rebuild the index only when featureIds has been replaced (same reason as updateLayer).
|
|
376
|
+
if (updates.featureIds)
|
|
377
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_groupFeatureIndex, "f").set(id, new Set(updated.featureIds));
|
|
378
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({ groups: { updated: [{ id, group: updated, previous }] } });
|
|
379
|
+
}
|
|
380
|
+
deleteGroup(id) {
|
|
381
|
+
const group = __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(id);
|
|
382
|
+
if (!group) {
|
|
383
|
+
throw new Error(`Group with id "${id}" not found`);
|
|
384
|
+
}
|
|
385
|
+
// Delete the group itself first. This prevents #removeFeatureFromGroupOrder from
|
|
386
|
+
// recursively invoking the automatic deletion of an empty group while the groupId of the
|
|
387
|
+
// members is cleared (it returns early because the group is already gone).
|
|
388
|
+
Object.freeze(Object.freeze(group).featureIds);
|
|
389
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f").delete(id);
|
|
390
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").delete(id);
|
|
391
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_groupFeatureIndex, "f").delete(id);
|
|
392
|
+
// Put the members where the group was in the order of its layer, so that they stay
|
|
393
|
+
// reachable after the group is gone. A member whose layerId names another layer is left
|
|
394
|
+
// to the cascade of updateFeature below, which appends it to its own layer.
|
|
395
|
+
for (const layer of [...__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").values()]) {
|
|
396
|
+
const index = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_layerOrderSet).call(this, layer);
|
|
397
|
+
if (!index.has(id))
|
|
398
|
+
continue;
|
|
399
|
+
const idx = layer.order.indexOf(id);
|
|
400
|
+
if (idx === -1)
|
|
401
|
+
continue;
|
|
402
|
+
const members = group.featureIds.filter((fid) => __classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").get(fid)?.layerId === layer.id && !index.has(fid));
|
|
403
|
+
if (members.length === 0)
|
|
404
|
+
continue;
|
|
405
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_mutateLayerOrder).call(this, layer, (order) => {
|
|
406
|
+
order.splice(idx, 0, ...members);
|
|
407
|
+
});
|
|
408
|
+
for (const fid of members)
|
|
409
|
+
index.add(fid);
|
|
410
|
+
}
|
|
411
|
+
// Remove groupId from the features in the group
|
|
412
|
+
// updateFeature modifies group.featureIds, so iterate over a copy of the array
|
|
413
|
+
for (const featureId of [...group.featureIds]) {
|
|
414
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").has(featureId)) {
|
|
415
|
+
this.updateFeature(featureId, { groupId: undefined });
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// Remove the group ID from the order of every layer (the index skips layers that do not
|
|
419
|
+
// hold it in O(1))
|
|
420
|
+
for (const layer of [...__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").values()]) {
|
|
421
|
+
const index = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_layerOrderSet).call(this, layer);
|
|
422
|
+
if (!index.has(id))
|
|
423
|
+
continue;
|
|
424
|
+
const idx = layer.order.indexOf(id);
|
|
425
|
+
if (idx === -1)
|
|
426
|
+
continue;
|
|
427
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_mutateLayerOrder).call(this, layer, (order) => {
|
|
428
|
+
order.splice(idx, 1);
|
|
429
|
+
});
|
|
430
|
+
index.delete(id);
|
|
431
|
+
}
|
|
432
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({ groups: { deleted: [group] } });
|
|
433
|
+
}
|
|
434
|
+
// ============================================================================
|
|
435
|
+
// File (delegated to FileStore)
|
|
436
|
+
// ============================================================================
|
|
437
|
+
createFile(file) {
|
|
438
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_fileStore, "f").create(file);
|
|
439
|
+
}
|
|
440
|
+
getFile(id) {
|
|
441
|
+
return __classPrivateFieldGet(this, _MemoryDocumentStore_fileStore, "f").get(id);
|
|
442
|
+
}
|
|
443
|
+
getAllFiles() {
|
|
444
|
+
return __classPrivateFieldGet(this, _MemoryDocumentStore_fileStore, "f").getAll();
|
|
445
|
+
}
|
|
446
|
+
deleteFile(id) {
|
|
447
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_fileStore, "f").delete(id);
|
|
448
|
+
}
|
|
449
|
+
// ============================================================================
|
|
450
|
+
// Metadata
|
|
451
|
+
// ============================================================================
|
|
452
|
+
getMetadata() {
|
|
453
|
+
return { ...__classPrivateFieldGet(this, _MemoryDocumentStore_metadata, "f") };
|
|
454
|
+
}
|
|
455
|
+
setMetadata(metadata) {
|
|
456
|
+
const previous = { ...__classPrivateFieldGet(this, _MemoryDocumentStore_metadata, "f") };
|
|
457
|
+
__classPrivateFieldSet(this, _MemoryDocumentStore_metadata, { ...__classPrivateFieldGet(this, _MemoryDocumentStore_metadata, "f"), ...frozenFields(metadata) }, "f");
|
|
458
|
+
// Delete the keys whose value is undefined
|
|
459
|
+
for (const key of Object.keys(__classPrivateFieldGet(this, _MemoryDocumentStore_metadata, "f"))) {
|
|
460
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_metadata, "f")[key] === undefined) {
|
|
461
|
+
delete __classPrivateFieldGet(this, _MemoryDocumentStore_metadata, "f")[key];
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({ metadata: { metadata: { ...__classPrivateFieldGet(this, _MemoryDocumentStore_metadata, "f") }, previous } });
|
|
465
|
+
}
|
|
466
|
+
// ============================================================================
|
|
467
|
+
// Subscribe / Transaction (delegated to ChangeBus)
|
|
468
|
+
// ============================================================================
|
|
469
|
+
subscribe(listener) {
|
|
470
|
+
return __classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").subscribe(listener);
|
|
471
|
+
}
|
|
472
|
+
transact(fn, source = 'local') {
|
|
473
|
+
return __classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").transact(() => __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_withinOperation).call(this, fn), source);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
_MemoryDocumentStore_features = new WeakMap(), _MemoryDocumentStore_layers = new WeakMap(), _MemoryDocumentStore_groups = new WeakMap(), _MemoryDocumentStore_layerOrder = new WeakMap(), _MemoryDocumentStore_metadata = new WeakMap(), _MemoryDocumentStore_layerOrderIndex = new WeakMap(), _MemoryDocumentStore_groupFeatureIndex = new WeakMap(), _MemoryDocumentStore_pendingFeaturePlacement = new WeakMap(), _MemoryDocumentStore_pendingGroupPlacement = new WeakMap(), _MemoryDocumentStore_operationDepth = new WeakMap(), _MemoryDocumentStore_freshLayers = new WeakMap(), _MemoryDocumentStore_freshGroups = new WeakMap(), _MemoryDocumentStore_bus = new WeakMap(), _MemoryDocumentStore_fileStore = new WeakMap(), _MemoryDocumentStore_instances = new WeakSet(), _MemoryDocumentStore_createGroup = function _MemoryDocumentStore_createGroup(group) {
|
|
477
|
+
const featureIdsCopy = [...group.featureIds];
|
|
478
|
+
const stored = { ...frozenFields(group), featureIds: [...featureIdsCopy] };
|
|
479
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").set(group.id, stored);
|
|
480
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f").add(group.id);
|
|
481
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_groupFeatureIndex, "f").set(group.id, new Set(featureIdsCopy));
|
|
482
|
+
// The members leave the order of their layer below (their container becomes the group),
|
|
483
|
+
// so a group that no layer lists takes the place of its first member at the end of the
|
|
484
|
+
// operation. A caller that lists the group itself (at the position it chose) wins.
|
|
485
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_scheduleGroupPlacement).call(this, group.id, featureIdsCopy);
|
|
486
|
+
// Set groupId on the features in the group
|
|
487
|
+
for (const featureId of featureIdsCopy) {
|
|
488
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").has(featureId)) {
|
|
489
|
+
this.updateFeature(featureId, { groupId: group.id });
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").merge({
|
|
493
|
+
groups: {
|
|
494
|
+
created: [Object.freeze({ ...stored, featureIds: Object.freeze(featureIdsCopy) })],
|
|
495
|
+
},
|
|
496
|
+
});
|
|
497
|
+
}, _MemoryDocumentStore_mutateLayerOrder = function _MemoryDocumentStore_mutateLayerOrder(current, mutate) {
|
|
498
|
+
const hadUpdate = __classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").hasPendingLayerUpdate(current.id);
|
|
499
|
+
const fresh = __classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f").has(current.id);
|
|
500
|
+
const previous = hadUpdate
|
|
501
|
+
? undefined
|
|
502
|
+
: fresh
|
|
503
|
+
? { ...current, order: [...current.order] }
|
|
504
|
+
: current;
|
|
505
|
+
const layer = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_writableLayer).call(this, current);
|
|
506
|
+
mutate(layer.order);
|
|
507
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").mergeLayerUpdate(layer, previous);
|
|
508
|
+
}, _MemoryDocumentStore_mutateGroupFeatureIds = function _MemoryDocumentStore_mutateGroupFeatureIds(current, mutate) {
|
|
509
|
+
const hadUpdate = __classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").hasPendingGroupUpdate(current.id);
|
|
510
|
+
const fresh = __classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f").has(current.id);
|
|
511
|
+
const previous = hadUpdate
|
|
512
|
+
? undefined
|
|
513
|
+
: fresh
|
|
514
|
+
? { ...current, featureIds: [...current.featureIds] }
|
|
515
|
+
: current;
|
|
516
|
+
const group = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_writableGroup).call(this, current);
|
|
517
|
+
mutate(group.featureIds);
|
|
518
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_bus, "f").mergeGroupUpdate(group, previous);
|
|
519
|
+
}, _MemoryDocumentStore_writableLayer = function _MemoryDocumentStore_writableLayer(current) {
|
|
520
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f").has(current.id))
|
|
521
|
+
return current;
|
|
522
|
+
const layer = { ...current, order: [...current.order] };
|
|
523
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").set(layer.id, layer);
|
|
524
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f").add(layer.id);
|
|
525
|
+
return layer;
|
|
526
|
+
}, _MemoryDocumentStore_writableGroup = function _MemoryDocumentStore_writableGroup(current) {
|
|
527
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f").has(current.id))
|
|
528
|
+
return current;
|
|
529
|
+
const group = { ...current, featureIds: [...current.featureIds] };
|
|
530
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").set(group.id, group);
|
|
531
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f").add(group.id);
|
|
532
|
+
return group;
|
|
533
|
+
}, _MemoryDocumentStore_freezeFresh = function _MemoryDocumentStore_freezeFresh() {
|
|
534
|
+
for (const id of __classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f")) {
|
|
535
|
+
const layer = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(id);
|
|
536
|
+
if (layer)
|
|
537
|
+
Object.freeze(Object.freeze(layer).order);
|
|
538
|
+
}
|
|
539
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshLayers, "f").clear();
|
|
540
|
+
for (const id of __classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f")) {
|
|
541
|
+
const group = __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(id);
|
|
542
|
+
if (group)
|
|
543
|
+
Object.freeze(Object.freeze(group).featureIds);
|
|
544
|
+
}
|
|
545
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_freshGroups, "f").clear();
|
|
546
|
+
}, _MemoryDocumentStore_layerOrderSet = function _MemoryDocumentStore_layerOrderSet(layer) {
|
|
547
|
+
let index = __classPrivateFieldGet(this, _MemoryDocumentStore_layerOrderIndex, "f").get(layer.id);
|
|
548
|
+
if (!index) {
|
|
549
|
+
index = new Set(layer.order);
|
|
550
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_layerOrderIndex, "f").set(layer.id, index);
|
|
551
|
+
}
|
|
552
|
+
return index;
|
|
553
|
+
}, _MemoryDocumentStore_groupFeatureSet = function _MemoryDocumentStore_groupFeatureSet(group) {
|
|
554
|
+
let index = __classPrivateFieldGet(this, _MemoryDocumentStore_groupFeatureIndex, "f").get(group.id);
|
|
555
|
+
if (!index) {
|
|
556
|
+
index = new Set(group.featureIds);
|
|
557
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_groupFeatureIndex, "f").set(group.id, index);
|
|
558
|
+
}
|
|
559
|
+
return index;
|
|
560
|
+
}, _MemoryDocumentStore_withinOperation = function _MemoryDocumentStore_withinOperation(fn) {
|
|
561
|
+
var _a, _b;
|
|
562
|
+
__classPrivateFieldSet(this, _MemoryDocumentStore_operationDepth, (_a = __classPrivateFieldGet(this, _MemoryDocumentStore_operationDepth, "f"), _a++, _a), "f");
|
|
563
|
+
try {
|
|
564
|
+
return fn();
|
|
565
|
+
}
|
|
566
|
+
finally {
|
|
567
|
+
__classPrivateFieldSet(this, _MemoryDocumentStore_operationDepth, (_b = __classPrivateFieldGet(this, _MemoryDocumentStore_operationDepth, "f"), _b--, _b), "f");
|
|
568
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_operationDepth, "f") === 0)
|
|
569
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_settlePlacements).call(this);
|
|
570
|
+
}
|
|
571
|
+
}, _MemoryDocumentStore_scheduleGroupPlacement = function _MemoryDocumentStore_scheduleGroupPlacement(groupId, featureIds) {
|
|
572
|
+
const first = featureIds
|
|
573
|
+
.map((fid) => __classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").get(fid))
|
|
574
|
+
.find((f) => f !== undefined);
|
|
575
|
+
const layer = first && __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(first.layerId);
|
|
576
|
+
if (!first || !layer)
|
|
577
|
+
return;
|
|
578
|
+
const idx = layer.order.indexOf(first.id);
|
|
579
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_pendingGroupPlacement, "f").set(groupId, {
|
|
580
|
+
layerId: layer.id,
|
|
581
|
+
index: idx === -1 ? layer.order.length : idx,
|
|
582
|
+
});
|
|
583
|
+
}, _MemoryDocumentStore_settlePlacements = function _MemoryDocumentStore_settlePlacements() {
|
|
584
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_pendingGroupPlacement, "f").size === 0 && __classPrivateFieldGet(this, _MemoryDocumentStore_pendingFeaturePlacement, "f").size === 0) {
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
const groups = [...__classPrivateFieldGet(this, _MemoryDocumentStore_pendingGroupPlacement, "f")];
|
|
588
|
+
const features = [...__classPrivateFieldGet(this, _MemoryDocumentStore_pendingFeaturePlacement, "f")];
|
|
589
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_pendingGroupPlacement, "f").clear();
|
|
590
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_pendingFeaturePlacement, "f").clear();
|
|
591
|
+
for (const [groupId, { layerId, index }] of groups) {
|
|
592
|
+
if (!__classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").has(groupId) || __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_isListedInAnyLayer).call(this, groupId))
|
|
593
|
+
continue;
|
|
594
|
+
const layer = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(layerId);
|
|
595
|
+
if (!layer)
|
|
596
|
+
continue;
|
|
597
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_mutateLayerOrder).call(this, layer, (order) => {
|
|
598
|
+
order.splice(Math.min(index, order.length), 0, groupId);
|
|
599
|
+
});
|
|
600
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_layerOrderSet).call(this, layer).add(groupId);
|
|
601
|
+
}
|
|
602
|
+
for (const id of features) {
|
|
603
|
+
const feature = __classPrivateFieldGet(this, _MemoryDocumentStore_features, "f").get(id);
|
|
604
|
+
if (!feature || feature.groupId)
|
|
605
|
+
continue;
|
|
606
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_addItemToLayerOrder).call(this, id, feature.layerId);
|
|
607
|
+
}
|
|
608
|
+
}, _MemoryDocumentStore_isListedInAnyLayer = function _MemoryDocumentStore_isListedInAnyLayer(itemId) {
|
|
609
|
+
for (const layer of __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").values()) {
|
|
610
|
+
if (__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_layerOrderSet).call(this, layer).has(itemId))
|
|
611
|
+
return true;
|
|
612
|
+
}
|
|
613
|
+
return false;
|
|
614
|
+
}, _MemoryDocumentStore_assertLayerExists = function _MemoryDocumentStore_assertLayerExists(layerId) {
|
|
615
|
+
if (layerId === undefined || !__classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").has(layerId)) {
|
|
616
|
+
throw new Error(`Layer with id "${layerId}" not found`);
|
|
617
|
+
}
|
|
618
|
+
}, _MemoryDocumentStore_addToContainer = function _MemoryDocumentStore_addToContainer(feature) {
|
|
619
|
+
if (feature.groupId) {
|
|
620
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_addFeatureToGroupOrder).call(this, feature.id, feature.groupId);
|
|
621
|
+
}
|
|
622
|
+
else {
|
|
623
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_addItemToLayerOrder).call(this, feature.id, feature.layerId);
|
|
624
|
+
}
|
|
625
|
+
}, _MemoryDocumentStore_removeFromContainer = function _MemoryDocumentStore_removeFromContainer(feature) {
|
|
626
|
+
if (feature.groupId) {
|
|
627
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_removeFeatureFromGroupOrder).call(this, feature.id, feature.groupId);
|
|
628
|
+
}
|
|
629
|
+
else {
|
|
630
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_removeItemFromLayerOrder).call(this, feature.id, feature.layerId);
|
|
631
|
+
}
|
|
632
|
+
}, _MemoryDocumentStore_addItemToLayerOrder = function _MemoryDocumentStore_addItemToLayerOrder(itemId, layerId) {
|
|
633
|
+
const layer = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(layerId);
|
|
634
|
+
if (!layer)
|
|
635
|
+
return;
|
|
636
|
+
const index = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_layerOrderSet).call(this, layer);
|
|
637
|
+
if (index.has(itemId))
|
|
638
|
+
return;
|
|
639
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_mutateLayerOrder).call(this, layer, (order) => {
|
|
640
|
+
order.push(itemId);
|
|
641
|
+
});
|
|
642
|
+
index.add(itemId);
|
|
643
|
+
}, _MemoryDocumentStore_removeItemFromLayerOrder = function _MemoryDocumentStore_removeItemFromLayerOrder(itemId, layerId) {
|
|
644
|
+
const layer = __classPrivateFieldGet(this, _MemoryDocumentStore_layers, "f").get(layerId);
|
|
645
|
+
if (!layer)
|
|
646
|
+
return;
|
|
647
|
+
// Most IDs, such as features belonging to a group, are not listed in order, so they are
|
|
648
|
+
// rejected by the index before the traversal (indexOf itself is needed to locate the
|
|
649
|
+
// splice position).
|
|
650
|
+
const index = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_layerOrderSet).call(this, layer);
|
|
651
|
+
if (!index.has(itemId))
|
|
652
|
+
return;
|
|
653
|
+
const idx = layer.order.indexOf(itemId);
|
|
654
|
+
if (idx === -1)
|
|
655
|
+
return;
|
|
656
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_mutateLayerOrder).call(this, layer, (order) => {
|
|
657
|
+
order.splice(idx, 1);
|
|
658
|
+
});
|
|
659
|
+
index.delete(itemId);
|
|
660
|
+
}, _MemoryDocumentStore_addFeatureToGroupOrder = function _MemoryDocumentStore_addFeatureToGroupOrder(featureId, groupId) {
|
|
661
|
+
const group = __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(groupId);
|
|
662
|
+
if (!group)
|
|
663
|
+
return;
|
|
664
|
+
const index = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_groupFeatureSet).call(this, group);
|
|
665
|
+
if (index.has(featureId))
|
|
666
|
+
return;
|
|
667
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_mutateGroupFeatureIds).call(this, group, (featureIds) => {
|
|
668
|
+
featureIds.push(featureId);
|
|
669
|
+
});
|
|
670
|
+
index.add(featureId);
|
|
671
|
+
}, _MemoryDocumentStore_removeFeatureFromGroupOrder = function _MemoryDocumentStore_removeFeatureFromGroupOrder(featureId, groupId) {
|
|
672
|
+
const group = __classPrivateFieldGet(this, _MemoryDocumentStore_groups, "f").get(groupId);
|
|
673
|
+
if (!group)
|
|
674
|
+
return;
|
|
675
|
+
const index = __classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_groupFeatureSet).call(this, group);
|
|
676
|
+
if (!index.has(featureId))
|
|
677
|
+
return;
|
|
678
|
+
const idx = group.featureIds.indexOf(featureId);
|
|
679
|
+
if (idx === -1)
|
|
680
|
+
return;
|
|
681
|
+
__classPrivateFieldGet(this, _MemoryDocumentStore_instances, "m", _MemoryDocumentStore_mutateGroupFeatureIds).call(this, group, (featureIds) => {
|
|
682
|
+
featureIds.splice(idx, 1);
|
|
683
|
+
});
|
|
684
|
+
index.delete(featureId);
|
|
685
|
+
// A group that has become empty is deleted automatically (the standard behavior of
|
|
686
|
+
// canvas-style tools). A group is a container of elements, and an empty group only
|
|
687
|
+
// clutters the layer tree.
|
|
688
|
+
if (index.size === 0) {
|
|
689
|
+
this.deleteGroup(groupId);
|
|
690
|
+
}
|
|
691
|
+
};
|
|
692
|
+
/**
|
|
693
|
+
* Identifies the container that lists a feature: its group when it has one, otherwise its
|
|
694
|
+
* layer. A feature is listed in exactly this container.
|
|
695
|
+
*/
|
|
696
|
+
function containerKey(feature) {
|
|
697
|
+
return feature.groupId ? `group:${feature.groupId}` : `layer:${feature.layerId}`;
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* A shallow copy whose object and array fields are frozen copies (the fields of a layer,
|
|
701
|
+
* a group or the metadata other than the order they keep)
|
|
702
|
+
*/
|
|
703
|
+
function frozenFields(value) {
|
|
704
|
+
const copy = { ...value };
|
|
705
|
+
for (const key of Object.keys(copy))
|
|
706
|
+
copy[key] = frozenCopy(copy[key]);
|
|
707
|
+
return copy;
|
|
708
|
+
}
|