@vcmap/ui 6.2.0-rc.1 → 6.2.0-rc.3

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.
Files changed (193) hide show
  1. package/build/build.js +52 -7
  2. package/build/postInstall.js +32 -0
  3. package/config/dev.config.json +40 -0
  4. package/config/pano.config.json +420 -0
  5. package/config/projects.config.json +5 -0
  6. package/dist/assets/cesium/Workers/{chunk-P6TRGU3S.js → chunk-2PFJ45KC.js} +2 -2
  7. package/dist/assets/cesium/Workers/{chunk-7ZZ5LMZY.js → chunk-35ALNMG5.js} +15 -15
  8. package/dist/assets/cesium/Workers/{chunk-7YIOHQWH.js → chunk-35EJBV7X.js} +13 -13
  9. package/dist/assets/cesium/Workers/{chunk-EJVGYGLF.js → chunk-3E3OH65K.js} +7 -7
  10. package/dist/assets/cesium/Workers/{chunk-JBSKHTNX.js → chunk-4FHUY275.js} +4 -4
  11. package/dist/assets/cesium/Workers/{chunk-Z2QP3CXW.js → chunk-565T3GIE.js} +2 -2
  12. package/dist/assets/cesium/Workers/{chunk-IZGUQO6Q.js → chunk-5LGDCKCZ.js} +13 -13
  13. package/dist/assets/cesium/Workers/{chunk-3IFRSGEY.js → chunk-6JXJYBWN.js} +9 -9
  14. package/dist/assets/cesium/Workers/{chunk-WGDFYAGC.js → chunk-6RAEC3AW.js} +4 -4
  15. package/dist/assets/cesium/Workers/{chunk-44QAAS4P.js → chunk-6Z67VIOY.js} +7 -7
  16. package/dist/assets/cesium/Workers/{chunk-NGZJIN5Z.js → chunk-ADDGROZ6.js} +4 -4
  17. package/dist/assets/cesium/Workers/{chunk-GBT7MJ6X.js → chunk-ASYGMBRG.js} +1 -1
  18. package/dist/assets/cesium/Workers/{chunk-C4WPMOKT.js → chunk-BABDQOWA.js} +5 -5
  19. package/dist/assets/cesium/Workers/{chunk-IBRIWOCM.js → chunk-BQHHGIFB.js} +13 -13
  20. package/dist/assets/cesium/Workers/{chunk-LLAF3CPH.js → chunk-C33B4KHN.js} +2 -2
  21. package/dist/assets/cesium/Workers/{chunk-JXVLNVXC.js → chunk-CMCR2ZK4.js} +7 -7
  22. package/dist/assets/cesium/Workers/{chunk-3HQMMUPU.js → chunk-EGGJIATZ.js} +1 -1
  23. package/dist/assets/cesium/Workers/{chunk-RJM36CNY.js → chunk-EWS5LXAB.js} +6 -6
  24. package/dist/assets/cesium/Workers/{chunk-OPP2SKMA.js → chunk-FDXPBTSX.js} +12 -12
  25. package/dist/assets/cesium/Workers/{chunk-QN6TBED4.js → chunk-FIFQP4YX.js} +11 -11
  26. package/dist/assets/cesium/Workers/{chunk-JISPSEF3.js → chunk-HOGDZ2EB.js} +4 -4
  27. package/dist/assets/cesium/Workers/{chunk-2PTKXHJB.js → chunk-I4NB77NH.js} +10 -10
  28. package/dist/assets/cesium/Workers/{chunk-QQOZO7KO.js → chunk-JX4A2BCF.js} +7 -7
  29. package/dist/assets/cesium/Workers/{chunk-XIUSRWL6.js → chunk-K6PDUSH6.js} +5 -5
  30. package/dist/assets/cesium/Workers/{chunk-KHZNBFOH.js → chunk-KFHZFU5O.js} +7 -7
  31. package/dist/assets/cesium/Workers/{chunk-U5HSOKPQ.js → chunk-KYGXRFA6.js} +1 -1
  32. package/dist/assets/cesium/Workers/{chunk-56EDBCGT.js → chunk-LNWNAP2C.js} +10 -10
  33. package/dist/assets/cesium/Workers/{chunk-YCDZX5LS.js → chunk-LWN2B3KW.js} +1 -1
  34. package/dist/assets/cesium/Workers/{chunk-TI3TRKIC.js → chunk-LXLABO2L.js} +10 -10
  35. package/dist/assets/cesium/Workers/{chunk-C3EQ27WF.js → chunk-MB6B2UUL.js} +6 -6
  36. package/dist/assets/cesium/Workers/{chunk-57H6I3SV.js → chunk-MZSRINXK.js} +5 -5
  37. package/dist/assets/cesium/Workers/{chunk-ZVUUPJEM.js → chunk-NBI3GZSK.js} +17 -17
  38. package/dist/assets/cesium/Workers/{chunk-O72GZTSE.js → chunk-NUAXNUP5.js} +2 -2
  39. package/dist/assets/cesium/Workers/{chunk-M24KHENR.js → chunk-PNZR4RLL.js} +2 -2
  40. package/dist/assets/cesium/Workers/{chunk-HJMNR3GC.js → chunk-Q4K22DSJ.js} +11 -11
  41. package/dist/assets/cesium/Workers/{chunk-2LOWCAMW.js → chunk-Q4OS4EFN.js} +13 -13
  42. package/dist/assets/cesium/Workers/{chunk-TK5IIG2F.js → chunk-QLIMO7TQ.js} +4 -4
  43. package/dist/assets/cesium/Workers/{chunk-EDLRS3AW.js → chunk-RQ4F6YFU.js} +6 -6
  44. package/dist/assets/cesium/Workers/{chunk-JSQJDZI4.js → chunk-SB67D3JL.js} +6 -6
  45. package/dist/assets/cesium/Workers/{chunk-RTJKHZWU.js → chunk-SS6WRJ5J.js} +6 -6
  46. package/dist/assets/cesium/Workers/{chunk-L5GODJAR.js → chunk-TC4NTWIJ.js} +14 -14
  47. package/dist/assets/cesium/Workers/{chunk-IZJ42N4W.js → chunk-TKNA6WSZ.js} +17 -17
  48. package/dist/assets/cesium/Workers/{chunk-HP5XLODI.js → chunk-VQYEP77L.js} +6 -6
  49. package/dist/assets/cesium/Workers/{chunk-YSIJTJ7N.js → chunk-WKS5H3VW.js} +5 -5
  50. package/dist/assets/cesium/Workers/{chunk-XWOUPGUF.js → chunk-WPGX7DEA.js} +1 -1
  51. package/dist/assets/cesium/Workers/{chunk-6SQMLVGV.js → chunk-X3EPFVG3.js} +7 -7
  52. package/dist/assets/cesium/Workers/{chunk-NDDI2LWR.js → chunk-XH7MSR3A.js} +6 -6
  53. package/dist/assets/cesium/Workers/{chunk-FFLMY4TE.js → chunk-YDEBBUNQ.js} +5 -5
  54. package/dist/assets/cesium/Workers/{chunk-YK3QIKY7.js → chunk-YSVI7YNN.js} +9 -9
  55. package/dist/assets/cesium/Workers/{chunk-BVKITG4N.js → chunk-YVAS5WPH.js} +7 -7
  56. package/dist/assets/cesium/Workers/{chunk-X7IQYYHF.js → chunk-Z4QVAZM6.js} +2 -2
  57. package/dist/assets/cesium/Workers/{chunk-LJ2JQHJT.js → chunk-ZXOK77EW.js} +7 -7
  58. package/dist/assets/cesium/Workers/combineGeometry.js +22 -22
  59. package/dist/assets/cesium/Workers/createBoxGeometry.js +16 -16
  60. package/dist/assets/cesium/Workers/createBoxOutlineGeometry.js +14 -14
  61. package/dist/assets/cesium/Workers/createCircleGeometry.js +24 -24
  62. package/dist/assets/cesium/Workers/createCircleOutlineGeometry.js +17 -17
  63. package/dist/assets/cesium/Workers/createCoplanarPolygonGeometry.js +31 -31
  64. package/dist/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +29 -29
  65. package/dist/assets/cesium/Workers/createCorridorGeometry.js +27 -27
  66. package/dist/assets/cesium/Workers/createCorridorOutlineGeometry.js +26 -26
  67. package/dist/assets/cesium/Workers/createCylinderGeometry.js +18 -18
  68. package/dist/assets/cesium/Workers/createCylinderOutlineGeometry.js +16 -16
  69. package/dist/assets/cesium/Workers/createEllipseGeometry.js +24 -24
  70. package/dist/assets/cesium/Workers/createEllipseOutlineGeometry.js +17 -17
  71. package/dist/assets/cesium/Workers/createEllipsoidGeometry.js +17 -17
  72. package/dist/assets/cesium/Workers/createEllipsoidOutlineGeometry.js +16 -16
  73. package/dist/assets/cesium/Workers/createFrustumGeometry.js +16 -16
  74. package/dist/assets/cesium/Workers/createFrustumOutlineGeometry.js +16 -16
  75. package/dist/assets/cesium/Workers/createGeometry.js +22 -22
  76. package/dist/assets/cesium/Workers/createGroundPolylineGeometry.js +20 -20
  77. package/dist/assets/cesium/Workers/createPlaneGeometry.js +14 -14
  78. package/dist/assets/cesium/Workers/createPlaneOutlineGeometry.js +13 -13
  79. package/dist/assets/cesium/Workers/createPolygonGeometry.js +30 -30
  80. package/dist/assets/cesium/Workers/createPolygonOutlineGeometry.js +28 -28
  81. package/dist/assets/cesium/Workers/createPolylineGeometry.js +23 -23
  82. package/dist/assets/cesium/Workers/createPolylineVolumeGeometry.js +29 -29
  83. package/dist/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js +25 -25
  84. package/dist/assets/cesium/Workers/createRectangleGeometry.js +25 -25
  85. package/dist/assets/cesium/Workers/createRectangleOutlineGeometry.js +18 -18
  86. package/dist/assets/cesium/Workers/createSimplePolylineGeometry.js +21 -21
  87. package/dist/assets/cesium/Workers/createSphereGeometry.js +17 -17
  88. package/dist/assets/cesium/Workers/createSphereOutlineGeometry.js +16 -16
  89. package/dist/assets/cesium/Workers/createTaskProcessorWorker.js +3 -3
  90. package/dist/assets/cesium/Workers/createVectorTileClampedPolylines.js +13 -13
  91. package/dist/assets/cesium/Workers/createVectorTileGeometries.js +22 -22
  92. package/dist/assets/cesium/Workers/createVectorTilePoints.js +12 -12
  93. package/dist/assets/cesium/Workers/createVectorTilePolygons.js +20 -20
  94. package/dist/assets/cesium/Workers/createVectorTilePolylines.js +13 -13
  95. package/dist/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +20 -20
  96. package/dist/assets/cesium/Workers/createVerticesFromHeightmap.js +20 -20
  97. package/dist/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +17 -17
  98. package/dist/assets/cesium/Workers/createWallGeometry.js +22 -22
  99. package/dist/assets/cesium/Workers/createWallOutlineGeometry.js +21 -21
  100. package/dist/assets/cesium/Workers/decodeDraco.js +11 -11
  101. package/dist/assets/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  102. package/dist/assets/cesium/Workers/decodeI3S.js +10 -10
  103. package/dist/assets/cesium/Workers/transcodeKTX2.js +7 -7
  104. package/dist/assets/cesium/Workers/transferTypedArrayTest.js +1 -1
  105. package/dist/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js +20 -20
  106. package/dist/assets/{cesium-ac6c193a.js → cesium-7d4ab914.js} +44609 -44606
  107. package/dist/assets/cesium.js +1 -1
  108. package/dist/assets/core-deeb2b8d.js +34569 -0
  109. package/dist/assets/core-workers/panoramaImageWorker.js +1 -0
  110. package/dist/assets/core-workers/panoramaImageWorker.js-f8148bc6.js +34 -0
  111. package/dist/assets/core.js +1 -1
  112. package/dist/assets/{ol-94c57f2e.js → ol-8db5c824.js} +1 -1
  113. package/dist/assets/ol.js +1 -1
  114. package/dist/assets/start.js +3 -1
  115. package/dist/assets/ui-62439099.css +1 -0
  116. package/dist/assets/{ui-4f308e45.js → ui-62439099.js} +9581 -8853
  117. package/dist/assets/ui.js +1 -1
  118. package/dist/assets/vue.js +1 -1
  119. package/dist/assets/{vuetify-99195777.js → vuetify-439ba6d5.js} +1 -1
  120. package/dist/assets/vuetify.js +1 -1
  121. package/index.d.ts +14 -4
  122. package/index.js +8 -6
  123. package/package.json +5 -4
  124. package/plugins/@vcmap-show-case/panorama-inspector/package.json +10 -0
  125. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaDebugInfo.vue +86 -0
  126. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaDebugTools.vue +259 -0
  127. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaInspector.vue +31 -0
  128. package/plugins/@vcmap-show-case/panorama-inspector/src/api.js +161 -0
  129. package/plugins/@vcmap-show-case/panorama-inspector/src/index.js +57 -0
  130. package/plugins/@vcmap-show-case/panorama-inspector/src/showClickInteraction.js +20 -0
  131. package/plugins/package.json +1 -1
  132. package/src/actions/actionHelper.d.ts +16 -11
  133. package/src/actions/actionHelper.js +190 -87
  134. package/src/actions/flightActions.d.ts +10 -0
  135. package/src/actions/flightActions.js +109 -13
  136. package/src/application/VcsApp.vue +11 -0
  137. package/src/application/VcsApp.vue.d.ts +4 -0
  138. package/src/application/VcsContainer.vue.d.ts +4 -0
  139. package/src/application/VcsMainMap.vue +40 -2
  140. package/src/application/VcsMainMap.vue.d.ts +4 -0
  141. package/src/application/VcsMap.vue +0 -9
  142. package/src/application/VcsNavbar.vue +2 -1
  143. package/src/callback/activateMapCallback.d.ts +30 -0
  144. package/src/callback/activateMapCallback.js +63 -0
  145. package/src/callback/activateOverviewMapCallback.d.ts +7 -0
  146. package/src/callback/activateOverviewMapCallback.js +26 -0
  147. package/src/callback/deactivateOverviewMapCallback.d.ts +7 -0
  148. package/src/callback/deactivateOverviewMapCallback.js +20 -0
  149. package/src/components/flight/VcsFlightAnchorsComponent.vue +1 -0
  150. package/src/components/flight/VcsFlightPlayer.vue +31 -17
  151. package/src/components/flight/VcsFlightPlayer.vue.d.ts +1 -0
  152. package/src/components/lists/VcsGroupedList.vue +10 -2
  153. package/src/components/lists/VcsTreeNode.vue +3 -0
  154. package/src/components/plugins/VcsLoadingOverlay.vue +138 -0
  155. package/src/components/plugins/VcsLoadingOverlay.vue.d.ts +2 -0
  156. package/src/components/plugins/VcsWorkspaceWrapper.vue +104 -0
  157. package/src/components/plugins/VcsWorkspaceWrapper.vue.d.ts +82 -0
  158. package/src/components/section/VcsExpansionPanel.vue +13 -3
  159. package/src/components/vector-properties/VcsFeatureEditingWindow.vue +20 -1
  160. package/src/components/vector-properties/VcsFeatureEditingWindow.vue.d.ts +11 -0
  161. package/src/components/vector-properties/VcsFeatureInputEditor.vue +166 -0
  162. package/src/components/vector-properties/VcsFeatureInputEditor.vue.d.ts +17 -0
  163. package/src/components/vector-properties/VcsVectorPropertiesComponent.vue.d.ts +1 -1
  164. package/src/contentTree/LayerSwap.vue +15 -6
  165. package/src/contentTree/contentTreeCollection.js +2 -2
  166. package/src/contentTree/contentTreeItem.d.ts +2 -2
  167. package/src/contentTree/wmsGroupContentTreeItem.js +10 -3
  168. package/src/featureInfo/featureInfo.js +6 -25
  169. package/src/featureInfo/iframeWmsFeatureInfoView.d.ts +10 -0
  170. package/src/featureInfo/iframeWmsFeatureInfoView.js +42 -0
  171. package/src/i18n/de.d.ts +25 -7
  172. package/src/i18n/de.js +14 -0
  173. package/src/i18n/en.d.ts +25 -7
  174. package/src/i18n/en.js +14 -0
  175. package/src/legend/VcsLegend.vue +5 -1
  176. package/src/navigation/MapNavigation.vue +82 -45
  177. package/src/navigation/MapNavigation.vue.d.ts +3 -34
  178. package/src/navigation/TiltSlider.vue +10 -2
  179. package/src/navigation/TiltSlider.vue.d.ts +20 -0
  180. package/src/navigation/VcsCompass.vue +3 -1
  181. package/src/navigation/overviewMap.d.ts +23 -8
  182. package/src/navigation/overviewMap.js +82 -60
  183. package/src/search/ResultsComponent.vue +8 -1
  184. package/src/search/SearchComponent.vue +3 -17
  185. package/src/search/SearchComponent.vue.d.ts +1 -2
  186. package/src/search/search.d.ts +13 -0
  187. package/src/search/search.js +21 -1
  188. package/src/uiConfig.d.ts +9 -0
  189. package/src/uiConfig.js +1 -0
  190. package/dist/assets/core-de8e51b5.js +0 -26236
  191. package/dist/assets/ui-4f308e45.css +0 -1
  192. /package/dist/assets/{vue-62303c82.js → vue-1b861f55.js} +0 -0
  193. /package/dist/assets/{vuetify-99195777.css → vuetify-439ba6d5.css} +0 -0
@@ -0,0 +1,161 @@
1
+ import {
2
+ GeometryInstance,
3
+ Material,
4
+ MaterialAppearance,
5
+ Matrix4,
6
+ Primitive,
7
+ SphereGeometry,
8
+ Color,
9
+ Cartesian3,
10
+ Globe,
11
+ ImageryLayer as CesiumImageryLayer,
12
+ OpenStreetMapImageryProvider,
13
+ } from '@vcmap-cesium/engine';
14
+ import {
15
+ mercatorToCartesian,
16
+ PanoramaMap,
17
+ PanoramaDatasetLayer,
18
+ } from '@vcmap/core';
19
+ import { reactive, ref, computed, watch } from 'vue';
20
+
21
+ /**
22
+ * @typedef {Object} ClickedPrimitive
23
+ * @property {boolean} show
24
+ * @property {Cartesian3} position
25
+ * @property {() => void} destroy
26
+ */
27
+
28
+ /**
29
+ * @param {import("@vcmap/core").PanoramaMap} map
30
+ * @param {ShowClickInteraction} clickedInteraction
31
+ * @returns {ClickedPrimitive}
32
+ */
33
+ export function setupClickedPrimitive(map, clickedInteraction) {
34
+ const position = new Cartesian3();
35
+ const appearance = new MaterialAppearance({
36
+ flat: true,
37
+ material: Material.fromType('Color', { color: Color.ORANGERED }),
38
+ });
39
+ const primitive = new Primitive({
40
+ geometryInstances: [
41
+ new GeometryInstance({
42
+ geometry: new SphereGeometry({
43
+ radius: 0.2,
44
+ }),
45
+ }),
46
+ ],
47
+ appearance,
48
+ depthFailAppearance: new MaterialAppearance({
49
+ translucent: true,
50
+ material: Material.fromType('Color', {
51
+ color: Color.LIMEGREEN.withAlpha(0.6),
52
+ }),
53
+ }),
54
+ asynchronous: false,
55
+ show: false,
56
+ modelMatrix: Matrix4.IDENTITY,
57
+ });
58
+
59
+ map.getCesiumWidget().scene.primitives.add(primitive);
60
+ clickedInteraction.clicked.addEventListener((event) => {
61
+ mercatorToCartesian(event.position, position);
62
+ primitive.modelMatrix = Matrix4.fromTranslation(position);
63
+ });
64
+
65
+ return {
66
+ get show() {
67
+ return primitive.show;
68
+ },
69
+ set show(value) {
70
+ primitive.show = value;
71
+ },
72
+ get position() {
73
+ return position;
74
+ },
75
+ destroy() {
76
+ map.getCesiumWidget().scene.primitives.remove(primitive);
77
+ },
78
+ };
79
+ }
80
+
81
+ /**
82
+ * @param {import("@vcmap/core").VcsApp} app
83
+ * @returns {{ action: import("@vcmap/ui").Action, destroy: () => void }}
84
+ */
85
+ export function createOsmGlobeAction(app) {
86
+ /** @type {import("@vcmap/core").PanoramaMap} */
87
+ const map = app.maps.getByType(PanoramaMap.className)[0];
88
+
89
+ const action = reactive({
90
+ name: 'OSM Globe',
91
+ icon: 'mdi-earth',
92
+ title: 'Open Street Map Globe',
93
+ active: false,
94
+ callback() {
95
+ if (action.active) {
96
+ map.getCesiumWidget().scene.globe = undefined;
97
+ action.active = false;
98
+ } else {
99
+ const { scene } = map.getCesiumWidget();
100
+ scene.globe = new Globe();
101
+ scene.imageryLayers.add(
102
+ new CesiumImageryLayer(
103
+ new OpenStreetMapImageryProvider({ maximumLevel: 18 }),
104
+ ),
105
+ );
106
+ action.active = true;
107
+ }
108
+ },
109
+ });
110
+
111
+ return {
112
+ action,
113
+ destroy: () => {
114
+ if (map.initialized) {
115
+ map.getCesiumWidget().scene.globe = undefined;
116
+ }
117
+ },
118
+ };
119
+ }
120
+
121
+ /**
122
+ * @param {import("@vcmap/core").VcsApp} app
123
+ * @returns {{action: import("@vcmap/ui").VcsAction, destroy(): void}}
124
+ */
125
+ export function createMapMarkerAction(app) {
126
+ const hideFootprint = ref(false);
127
+
128
+ const hideFootprintWatcher = watch(hideFootprint, () => {
129
+ for (const layer of app.layers) {
130
+ if (layer instanceof PanoramaDatasetLayer) {
131
+ layer.hideInPanorama = hideFootprint.value;
132
+ }
133
+ }
134
+ });
135
+
136
+ const layerAdded = app.layers.added.addEventListener((layer) => {
137
+ if (layer instanceof PanoramaDatasetLayer) {
138
+ layer.hideInPanorama = hideFootprint.value;
139
+ }
140
+ });
141
+
142
+ const action = reactive({
143
+ name: 'Hide Footprint',
144
+ icon: computed(() => {
145
+ return hideFootprint.value ? 'mdi-map-marker-off' : 'mdi-map-marker';
146
+ }),
147
+ title: 'Hide Footprint',
148
+ active: computed(() => hideFootprint.value),
149
+ callback() {
150
+ hideFootprint.value = !hideFootprint.value;
151
+ },
152
+ });
153
+
154
+ return {
155
+ action,
156
+ destroy() {
157
+ hideFootprintWatcher();
158
+ layerAdded();
159
+ },
160
+ };
161
+ }
@@ -0,0 +1,57 @@
1
+ import { ButtonLocation, createToggleAction, WindowSlot } from '@vcmap/ui';
2
+ import { name, version, mapVersion } from '../package.json';
3
+ import PanoramaInspector from './PanoramaInspector.vue';
4
+ import ShowClickInteraction from './showClickInteraction.js';
5
+
6
+ export default function panoramaInspector() {
7
+ let destroy;
8
+ let clickedInteraction;
9
+ let removeInteraction;
10
+ let clickedPrimitive;
11
+
12
+ return {
13
+ name,
14
+ version,
15
+ mapVersion,
16
+ get clickedInteraction() {
17
+ return clickedInteraction;
18
+ },
19
+ get clickedPrimitive() {
20
+ return clickedPrimitive;
21
+ },
22
+ async initialize(app) {
23
+ const { action, destroy: destroyAction } = createToggleAction(
24
+ {
25
+ name: 'Panorama Inspector',
26
+ },
27
+ {
28
+ id: 'panorama-inspector',
29
+ state: {
30
+ headerTitle: 'panoramaInspector.title',
31
+ },
32
+ component: PanoramaInspector,
33
+ slot: WindowSlot.DYNAMIC_RIGHT,
34
+ },
35
+ app.windowManager,
36
+ name,
37
+ );
38
+ app.navbarManager.add(
39
+ { id: 'panorama-inspector', action },
40
+ name,
41
+ ButtonLocation.MENU,
42
+ );
43
+ clickedInteraction = new ShowClickInteraction();
44
+ removeInteraction =
45
+ app.maps.eventHandler.addPersistentInteraction(clickedInteraction);
46
+ destroy = destroyAction;
47
+ },
48
+ destroy() {
49
+ destroy?.();
50
+ removeInteraction?.();
51
+ clickedInteraction?.destroy();
52
+ clickedInteraction = undefined;
53
+ clickedPrimitive?.destroy();
54
+ clickedPrimitive = undefined;
55
+ },
56
+ };
57
+ }
@@ -0,0 +1,20 @@
1
+ import { AbstractInteraction, EventType, VcsEvent } from '@vcmap/core';
2
+
3
+ export default class ShowClickInteraction extends AbstractInteraction {
4
+ constructor() {
5
+ super(EventType.CLICK);
6
+
7
+ this.clicked = new VcsEvent();
8
+ }
9
+
10
+ pipe(event) {
11
+ if (
12
+ event.map.className === 'PanoramaMap' &&
13
+ !event.map.getCesiumWidget().scene.screenSpaceCameraController
14
+ .enableInputs
15
+ ) {
16
+ this.clicked.raiseEvent(event);
17
+ }
18
+ return Promise.resolve(event);
19
+ }
20
+ }
@@ -20,7 +20,7 @@
20
20
  "@vcmap/cesium-filters": "^2.0.0",
21
21
  "@vcmap/search-nominatim": "^2.0.0",
22
22
  "@vcmap/create-link": "^3.0.0",
23
- "@vcmap/module-selector": "^2.0.0",
23
+ "@vcmap/module-selector": "^3.0.0",
24
24
  "@vcmap/line-of-sight": "^1.0.0",
25
25
  "@vcmap/layer-slider": "^2.0.0",
26
26
  "@vcmap/vcs-solar-balloon": "^2.0.0",
@@ -54,17 +54,6 @@ export function createSearchButtonAction(app: import("../vcsUiApp.js").default):
54
54
  searchAction: import("vue").Ref<import("vue").UnwrapRef<VcsAction> | null>;
55
55
  destroy: () => void;
56
56
  };
57
- /**
58
- * Creates an action which will toggle the overview map (opening & closing the window and activating/ deactivating the overview map).
59
- * @param {import("../navigation/overviewMap.js").default} overviewMap
60
- * @param {import("../manager/window/windowManager.js").WindowComponentOptions} windowComponent
61
- * @param {import("../manager/window/windowManager.js").default} windowManager
62
- * @returns {{action: VcsAction, destroy: function(): void}}
63
- */
64
- export function createOverviewMapAction(overviewMap: import("../navigation/overviewMap.js").default, windowComponent: import("../manager/window/windowManager.js").WindowComponentOptions, windowManager: import("../manager/window/windowManager.js").default): {
65
- action: VcsAction;
66
- destroy: () => void;
67
- };
68
57
  /**
69
58
  * Creates a header less window which will close if anything outside of the window is clicked. The window will open
70
59
  * at the clicked position (the actions position) by default, unless the window component already has a position set.
@@ -113,6 +102,22 @@ export function createZoomToFeatureAction(actionOptions: ActionOptions, feature:
113
102
  * @param {PointerEvent} [p]
114
103
  */
115
104
  export function callSafeAction(action: VcsAction, p?: PointerEvent | undefined): void;
105
+ /**
106
+ * Adds a loading overlay to the application.
107
+ * @param {import("../vcsUiApp.js").default} app
108
+ * @param {string|symbol} owner The owner of the loading overlay.
109
+ * @param {string} id The ID of the loading overlay.
110
+ * @param {{progress?:import('vue').Ref<number>|undefined, title?:string, text?:string, cancel?:Function, maxWidth?:number|string, persistent?:boolean}} [options] The options for the loading overlay, passed as props.
111
+ * @returns {Function} A function to remove the loading overlay.
112
+ */
113
+ export function addLoadingOverlay(app: import("../vcsUiApp.js").default, owner: string | symbol, id: string, options?: {
114
+ progress?: import('vue').Ref<number> | undefined;
115
+ title?: string | undefined;
116
+ text?: string | undefined;
117
+ cancel?: Function | undefined;
118
+ maxWidth?: string | number | undefined;
119
+ persistent?: boolean | undefined;
120
+ } | undefined): Function;
116
121
  export const searchComponentId: "searchId";
117
122
  export type ActionOptions = Omit<VcsAction, 'callback'>;
118
123
  export type ActionCallback = (p?: PointerEvent) => (void | Promise<void>);
@@ -6,6 +6,7 @@ import {
6
6
  Extent,
7
7
  MapCollection,
8
8
  mercatorProjection,
9
+ PanoramaMap,
9
10
  Viewpoint,
10
11
  } from '@vcmap/core';
11
12
  import { Feature } from 'ol';
@@ -18,6 +19,7 @@ import {
18
19
  getTargetSize,
19
20
  } from '../manager/window/windowHelper.js';
20
21
  import SearchComponent from '../search/SearchComponent.vue';
22
+ import VcsLoadingOverlay from '../components/plugins/VcsLoadingOverlay.vue';
21
23
 
22
24
  /**
23
25
  * @typedef {Omit<VcsAction, 'callback'>} ActionOptions
@@ -56,6 +58,64 @@ export function getActionFromOptions(options) {
56
58
  return options;
57
59
  }
58
60
 
61
+ /**
62
+ * @param {import("@vcmap/core").PanoramaMap} map
63
+ * @param {import("../actions/actionHelper.js").VcsAction} action
64
+ * @returns {() => void}
65
+ */
66
+ function setupDisablePanorama(map, action) {
67
+ const datasetListeners = new Map();
68
+
69
+ action.disabled = true;
70
+ const setupDataset = (dataset) => {
71
+ datasetListeners.get(dataset.name)?.();
72
+ if (dataset.active) {
73
+ action.disabled = false;
74
+ }
75
+
76
+ const listener = dataset.stateChanged.addEventListener(() => {
77
+ if (!dataset.active) {
78
+ action.disabled = ![...map.layerCollection].find(
79
+ (d) => d.active && d.className === 'PanoramaDatasetLayer',
80
+ );
81
+ } else if (dataset.active) {
82
+ action.disabled = false;
83
+ }
84
+ });
85
+
86
+ datasetListeners.set(dataset.name, () => {
87
+ listener();
88
+ action.disabled = ![...map.layerCollection].find(
89
+ (d) => d.active && d.className === 'PanoramaDatasetLayer',
90
+ );
91
+ });
92
+ };
93
+
94
+ let datasetCollectionListeners = [];
95
+ const setupDatasets = () => {
96
+ datasetCollectionListeners.forEach((cb) => cb());
97
+ datasetListeners.forEach((cb) => cb());
98
+ datasetListeners.clear();
99
+
100
+ [...map.layerCollection].forEach(setupDataset);
101
+
102
+ datasetCollectionListeners = [
103
+ map.layerCollection.added.addEventListener(setupDataset),
104
+ map.layerCollection.removed.addEventListener((removedDataset) => {
105
+ datasetListeners.get(removedDataset.name)?.();
106
+ datasetListeners.delete(removedDataset.name);
107
+ }),
108
+ ];
109
+ };
110
+ setupDatasets();
111
+
112
+ return () => {
113
+ datasetCollectionListeners.forEach((cb) => cb());
114
+ datasetListeners.forEach((cb) => cb());
115
+ datasetListeners.clear();
116
+ };
117
+ }
118
+
59
119
  /**
60
120
  * @param {ActionOptions} actionOptions
61
121
  * @param {string} mapName
@@ -79,11 +139,23 @@ export function createMapButtonAction(actionOptions, mapName, maps) {
79
139
  maps.setActiveMap(mapName);
80
140
  },
81
141
  });
82
- const destroyListener = maps.mapActivated.addEventListener((map) => {
83
- action.active = map?.name === mapName;
142
+
143
+ const map = maps.getByKey(mapName);
144
+ let datasetListener;
145
+ if (map instanceof PanoramaMap) {
146
+ datasetListener = setupDisablePanorama(map, action);
147
+ }
148
+ const destroyListener = maps.mapActivated.addEventListener((activatedMap) => {
149
+ action.active = activatedMap?.name === mapName;
84
150
  });
85
151
 
86
- return { action, destroy: destroyListener };
152
+ return {
153
+ action,
154
+ destroy() {
155
+ datasetListener?.();
156
+ destroyListener();
157
+ },
158
+ };
87
159
  }
88
160
 
89
161
  /**
@@ -145,6 +217,64 @@ export function createToggleAction(
145
217
 
146
218
  export const searchComponentId = 'searchId';
147
219
 
220
+ /**
221
+ * @param {import("../vcsUiApp.js").default} app
222
+ * @returns {{action: import("vue").UnwrapRef<VcsAction>, destroy: function():void}}
223
+ */
224
+ function createSearchAction(app) {
225
+ const windowComponent = {
226
+ id: searchComponentId,
227
+ component: SearchComponent,
228
+ position: { width: 440 },
229
+ state: { hideHeader: true },
230
+ slot: WindowSlot.DYNAMIC_RIGHT,
231
+ };
232
+ const action = reactive({
233
+ name: 'search.title',
234
+ icon: '$vcsSearch',
235
+ title: 'search.tooltip',
236
+ active: false,
237
+ background: false,
238
+ callback() {
239
+ if (this.active && !this.background) {
240
+ app.windowManager.remove(searchComponentId);
241
+ this.active = false;
242
+ app.search.clearSearch();
243
+ } else {
244
+ app.windowManager.add(windowComponent, vcsAppSymbol);
245
+ }
246
+ },
247
+ });
248
+ const addedListener = app.windowManager.added.addEventListener(({ id }) => {
249
+ if (id === searchComponentId) {
250
+ action.active = true;
251
+ action.background = false;
252
+ }
253
+ });
254
+ const removedListener = app.windowManager.removed.addEventListener(
255
+ ({ id }) => {
256
+ if (id === searchComponentId) {
257
+ if (app.search.currentResults.value.length) {
258
+ action.active = true;
259
+ action.background = true;
260
+ } else {
261
+ action.active = false;
262
+ action.background = false;
263
+ app.search.clearSearch();
264
+ }
265
+ }
266
+ },
267
+ );
268
+
269
+ return {
270
+ action,
271
+ destroy: () => {
272
+ addedListener();
273
+ removedListener();
274
+ },
275
+ };
276
+ }
277
+
148
278
  /**
149
279
  * Creates a toggle button for the search tool, which is only available, if at least one search implementation is registered.
150
280
  * @param {import("../vcsUiApp.js").default} app
@@ -156,38 +286,21 @@ export function createSearchButtonAction(app) {
156
286
  const uiConfig = app.uiConfig.config;
157
287
 
158
288
  const determineAction = () => {
159
- if (app.windowManager.has(searchComponentId)) {
160
- app.windowManager.remove(searchComponentId);
161
- }
162
289
  if (
163
290
  !uiConfig.hideSearch &&
164
291
  app.search.size > 0 &&
165
292
  searchAction.value === null
166
293
  ) {
167
- const action = createToggleAction(
168
- {
169
- name: 'search.title',
170
- icon: '$vcsSearch',
171
- title: 'search.tooltip',
172
- },
173
- {
174
- id: searchComponentId,
175
- component: SearchComponent,
176
- state: { hideHeader: true },
177
- slot: WindowSlot.DYNAMIC_RIGHT,
178
- position: {
179
- width: 440,
180
- },
181
- },
182
- app.windowManager,
183
- vcsAppSymbol,
184
- );
185
- destroyAction = action.destroy;
186
- searchAction.value = reactive(action.action);
294
+ const { action, destroy } = createSearchAction(app);
295
+ destroyAction = destroy;
296
+ searchAction.value = action;
187
297
  } else if (
188
298
  (uiConfig.hideSearch || app.search.size === 0) &&
189
299
  searchAction.value !== null
190
300
  ) {
301
+ if (app.windowManager.has(searchComponentId)) {
302
+ app.windowManager.remove(searchComponentId);
303
+ }
191
304
  destroyAction();
192
305
  destroyAction = () => {};
193
306
  searchAction.value = null;
@@ -210,57 +323,6 @@ export function createSearchButtonAction(app) {
210
323
  return { searchAction, destroy };
211
324
  }
212
325
 
213
- /**
214
- * Creates an action which will toggle the overview map (opening & closing the window and activating/ deactivating the overview map).
215
- * @param {import("../navigation/overviewMap.js").default} overviewMap
216
- * @param {import("../manager/window/windowManager.js").WindowComponentOptions} windowComponent
217
- * @param {import("../manager/window/windowManager.js").default} windowManager
218
- * @returns {{action: VcsAction, destroy: function(): void}}
219
- */
220
- export function createOverviewMapAction(
221
- overviewMap,
222
- windowComponent,
223
- windowManager,
224
- ) {
225
- const { action, destroy } = createToggleAction(
226
- {
227
- name: 'overviewMapToggle',
228
- icon: '$vcsMap',
229
- title: 'navigation.overviewMapTooltip',
230
- },
231
- windowComponent,
232
- windowManager,
233
- vcsAppSymbol,
234
- );
235
-
236
- const listeners = [
237
- windowManager.added.addEventListener(({ id }) => {
238
- if (id === windowComponent.id) {
239
- overviewMap.activate().catch((e) => {
240
- getLogger('createOverviewMapAction').error(
241
- 'failed to activate overview map',
242
- e,
243
- );
244
- windowManager.remove(windowComponent.id);
245
- });
246
- }
247
- }),
248
- windowManager.removed.addEventListener(({ id }) => {
249
- if (id === windowComponent.id) {
250
- overviewMap.deactivate();
251
- }
252
- }),
253
- ];
254
-
255
- const destroyAction = () => {
256
- destroy();
257
- listeners.forEach((cb) => {
258
- cb();
259
- });
260
- };
261
- return { action, destroy: destroyAction };
262
- }
263
-
264
326
  /**
265
327
  * Creates a header less window which will close if anything outside of the window is clicked. The window will open
266
328
  * at the clicked position (the actions position) by default, unless the window component already has a position set.
@@ -306,10 +368,7 @@ export function createModalAction(actionOptions, modalComponent, app, owner) {
306
368
  width,
307
369
  height,
308
370
  );
309
- const position = {
310
- ...fittedPosition,
311
- ...windowPositionOptions,
312
- };
371
+ const position = { ...fittedPosition, ...windowPositionOptions };
313
372
  const targetSize = getTargetSize(app.maps.target);
314
373
  if (contentHeight) {
315
374
  if (position.bottom) {
@@ -339,12 +398,7 @@ export function createModalAction(actionOptions, modalComponent, app, owner) {
339
398
  clickedWindowPosition = { x: event.x, y: event.y };
340
399
  const state = { ...modalComponent?.state, hideHeader: true };
341
400
  app.windowManager.add(
342
- {
343
- position: getPositionOptions(),
344
- ...component,
345
- id,
346
- state,
347
- },
401
+ { position: getPositionOptions(), ...component, id, state },
348
402
  owner,
349
403
  );
350
404
  document.addEventListener('mousedown', handleMouseDown);
@@ -526,3 +580,52 @@ export function callSafeAction(action, p) {
526
580
  logError(e);
527
581
  }
528
582
  }
583
+
584
+ /**
585
+ * Adds a loading overlay to the application.
586
+ * @param {import("../vcsUiApp.js").default} app
587
+ * @param {string|symbol} owner The owner of the loading overlay.
588
+ * @param {string} id The ID of the loading overlay.
589
+ * @param {{progress?:import('vue').Ref<number>|undefined, title?:string, text?:string, cancel?:Function, maxWidth?:number|string, persistent?:boolean}} [options] The options for the loading overlay, passed as props.
590
+ * @returns {Function} A function to remove the loading overlay.
591
+ */
592
+ export function addLoadingOverlay(app, owner, id, options) {
593
+ check(owner, oneOf(String, Symbol));
594
+ check(id, String);
595
+ check(options?.progress?.value, optional(Number));
596
+ check(
597
+ options,
598
+ optional({
599
+ title: optional(String),
600
+ text: optional(String),
601
+ cancel: optional(Function),
602
+ maxWidth: optional(oneOf(Number, String)),
603
+ persistent: optional(Boolean),
604
+ }),
605
+ );
606
+
607
+ const removeWindow = () => {
608
+ if (app.windowManager.has(id)) {
609
+ app.windowManager.remove(id);
610
+ }
611
+ };
612
+
613
+ app.windowManager.add(
614
+ {
615
+ component: VcsLoadingOverlay,
616
+ id,
617
+ state: { hideHeader: true, styles: { display: 'none !important' } },
618
+ props: {
619
+ ...options,
620
+ cancellable: !!options.cancel,
621
+ onCancel: () => {
622
+ options?.cancel?.();
623
+ removeWindow();
624
+ },
625
+ },
626
+ },
627
+ owner,
628
+ );
629
+
630
+ return removeWindow;
631
+ }
@@ -69,6 +69,16 @@ export function createFlightVisualizationAction(app: import("../vcsUiApp.js").de
69
69
  action: import("./actionHelper.js").VcsAction;
70
70
  destroy: () => void;
71
71
  }>;
72
+ /**
73
+ *
74
+ * @param {import("../vcsUiApp.js").default} app
75
+ * @param {import("@vcmap/core").FlightInstance} instance
76
+ * @returns {{actions: import("./actionHelper.js").VcsAction[], destroy: function(): void}}
77
+ */
78
+ export function createFlightMovieActions(app: import("../vcsUiApp.js").default, instance: import("@vcmap/core").FlightInstance): {
79
+ actions: import("./actionHelper.js").VcsAction[];
80
+ destroy: () => void;
81
+ };
72
82
  /**
73
83
  *
74
84
  * @param {import("@vcmap/core").FlightInstance} instance