@itwin/map-layers 4.0.0-dev.44 → 4.0.0-dev.47
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 +864 -864
- package/README.md +32 -32
- package/lib/cjs/MapLayerPreferences.d.ts +88 -88
- package/lib/cjs/MapLayerPreferences.js +311 -311
- package/lib/cjs/MapLayerPreferences.js.map +1 -1
- package/lib/cjs/map-layers.d.ts +6 -6
- package/lib/cjs/map-layers.js +22 -22
- package/lib/cjs/mapLayers.d.ts +26 -44
- package/lib/cjs/mapLayers.d.ts.map +1 -1
- package/lib/cjs/mapLayers.js +33 -61
- package/lib/cjs/mapLayers.js.map +1 -1
- package/lib/cjs/ui/FeatureInfoUiItemsProvider.d.ts +16 -11
- package/lib/cjs/ui/FeatureInfoUiItemsProvider.d.ts.map +1 -1
- package/lib/cjs/ui/FeatureInfoUiItemsProvider.js +46 -51
- package/lib/cjs/ui/FeatureInfoUiItemsProvider.js.map +1 -1
- package/lib/cjs/ui/Interfaces.d.ts +50 -50
- package/lib/cjs/ui/Interfaces.js +2 -2
- package/lib/cjs/ui/Interfaces.js.map +1 -1
- package/lib/cjs/ui/MapFeatureInfoTool.d.ts +13 -13
- package/lib/cjs/ui/MapFeatureInfoTool.js +50 -50
- package/lib/cjs/ui/MapFeatureInfoTool.js.map +1 -1
- package/lib/cjs/ui/MapLayersUiItemsProvider.d.ts +8 -8
- package/lib/cjs/ui/MapLayersUiItemsProvider.d.ts.map +1 -1
- package/lib/cjs/ui/MapLayersUiItemsProvider.js +35 -38
- package/lib/cjs/ui/MapLayersUiItemsProvider.js.map +1 -1
- package/lib/cjs/ui/widget/AttachLayerPopupButton.d.ts +13 -14
- package/lib/cjs/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
- package/lib/cjs/ui/widget/AttachLayerPopupButton.js +335 -335
- package/lib/cjs/ui/widget/BasemapPanel.d.ts +7 -8
- package/lib/cjs/ui/widget/BasemapPanel.d.ts.map +1 -1
- package/lib/cjs/ui/widget/BasemapPanel.js +156 -156
- package/lib/cjs/ui/widget/BasemapPanel.js.map +1 -1
- package/lib/cjs/ui/widget/BasemapPanel.scss +87 -87
- package/lib/cjs/ui/widget/ConfirmMessageDialog.d.ts +20 -21
- package/lib/cjs/ui/widget/ConfirmMessageDialog.d.ts.map +1 -1
- package/lib/cjs/ui/widget/ConfirmMessageDialog.js +22 -22
- package/lib/cjs/ui/widget/ConfirmMessageDialog.js.map +1 -1
- package/lib/cjs/ui/widget/FeatureInfoDataProvider.d.ts +40 -40
- package/lib/cjs/ui/widget/FeatureInfoDataProvider.js +138 -138
- package/lib/cjs/ui/widget/FeatureInfoDataProvider.js.map +1 -1
- package/lib/cjs/ui/widget/FeatureInfoWidget.d.ts +6 -7
- package/lib/cjs/ui/widget/FeatureInfoWidget.d.ts.map +1 -1
- package/lib/cjs/ui/widget/FeatureInfoWidget.js +65 -65
- package/lib/cjs/ui/widget/FeatureInfoWidget.js.map +1 -1
- package/lib/cjs/ui/widget/MapLayerDroppable.d.ts +18 -19
- package/lib/cjs/ui/widget/MapLayerDroppable.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapLayerDroppable.js +85 -85
- package/lib/cjs/ui/widget/MapLayerDroppable.js.map +1 -1
- package/lib/cjs/ui/widget/MapLayerManager.d.ts +26 -26
- package/lib/cjs/ui/widget/MapLayerManager.js +401 -401
- package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
- package/lib/cjs/ui/widget/MapLayerManager.scss +409 -409
- package/lib/cjs/ui/widget/MapLayerSettingsMenu.d.ts +11 -12
- package/lib/cjs/ui/widget/MapLayerSettingsMenu.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapLayerSettingsMenu.js +82 -82
- package/lib/cjs/ui/widget/MapLayerSettingsMenu.js.map +1 -1
- package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.d.ts +6 -7
- package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js +65 -65
- package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
- package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.scss +20 -20
- package/lib/cjs/ui/widget/MapLayersWidget.d.ts +10 -11
- package/lib/cjs/ui/widget/MapLayersWidget.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapLayersWidget.js +31 -31
- package/lib/cjs/ui/widget/MapLayersWidget.js.map +1 -1
- package/lib/cjs/ui/widget/MapManagerSettings.d.ts +2 -3
- package/lib/cjs/ui/widget/MapManagerSettings.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapManagerSettings.js +200 -200
- package/lib/cjs/ui/widget/MapManagerSettings.js.map +1 -1
- package/lib/cjs/ui/widget/MapManagerSettings.scss +29 -29
- package/lib/cjs/ui/widget/MapUrlDialog.d.ts +22 -23
- package/lib/cjs/ui/widget/MapUrlDialog.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapUrlDialog.js +530 -530
- package/lib/cjs/ui/widget/MapUrlDialog.js.map +1 -1
- package/lib/cjs/ui/widget/MapUrlDialog.scss +99 -100
- package/lib/cjs/ui/widget/SelectMapFormat.d.ts +17 -18
- package/lib/cjs/ui/widget/SelectMapFormat.d.ts.map +1 -1
- package/lib/cjs/ui/widget/SelectMapFormat.js +54 -54
- package/lib/cjs/ui/widget/SelectMapFormat.js.map +1 -1
- package/lib/cjs/ui/widget/SubLayersDataProvider.d.ts +18 -20
- package/lib/cjs/ui/widget/SubLayersDataProvider.d.ts.map +1 -1
- package/lib/cjs/ui/widget/SubLayersDataProvider.js +74 -75
- package/lib/cjs/ui/widget/SubLayersDataProvider.js.map +1 -1
- package/lib/cjs/ui/widget/SubLayersPopupButton.d.ts +9 -10
- package/lib/cjs/ui/widget/SubLayersPopupButton.d.ts.map +1 -1
- package/lib/cjs/ui/widget/SubLayersPopupButton.js +40 -40
- package/lib/cjs/ui/widget/SubLayersPopupButton.js.map +1 -1
- package/lib/cjs/ui/widget/SubLayersTree.d.ts +14 -15
- package/lib/cjs/ui/widget/SubLayersTree.d.ts.map +1 -1
- package/lib/cjs/ui/widget/SubLayersTree.js +413 -413
- package/lib/cjs/ui/widget/SubLayersTree.js.map +1 -1
- package/lib/cjs/ui/widget/SubLayersTree.scss +69 -69
- package/lib/cjs/ui/widget/TransparencyPopupButton.d.ts +13 -14
- package/lib/cjs/ui/widget/TransparencyPopupButton.d.ts.map +1 -1
- package/lib/cjs/ui/widget/TransparencyPopupButton.js +47 -47
- package/lib/cjs/ui/widget/TransparencyPopupButton.js.map +1 -1
- package/lib/cjs/ui/widget/TransparencyPopupButton.scss +35 -36
- package/lib/esm/MapLayerPreferences.d.ts +88 -88
- package/lib/esm/MapLayerPreferences.js +307 -307
- package/lib/esm/MapLayerPreferences.js.map +1 -1
- package/lib/esm/map-layers.d.ts +6 -6
- package/lib/esm/map-layers.js +10 -10
- package/lib/esm/mapLayers.d.ts +26 -44
- package/lib/esm/mapLayers.d.ts.map +1 -1
- package/lib/esm/mapLayers.js +29 -57
- package/lib/esm/mapLayers.js.map +1 -1
- package/lib/esm/ui/FeatureInfoUiItemsProvider.d.ts +16 -11
- package/lib/esm/ui/FeatureInfoUiItemsProvider.d.ts.map +1 -1
- package/lib/esm/ui/FeatureInfoUiItemsProvider.js +42 -47
- package/lib/esm/ui/FeatureInfoUiItemsProvider.js.map +1 -1
- package/lib/esm/ui/Interfaces.d.ts +50 -50
- package/lib/esm/ui/Interfaces.js +1 -1
- package/lib/esm/ui/Interfaces.js.map +1 -1
- package/lib/esm/ui/MapFeatureInfoTool.d.ts +13 -13
- package/lib/esm/ui/MapFeatureInfoTool.js +45 -45
- package/lib/esm/ui/MapFeatureInfoTool.js.map +1 -1
- package/lib/esm/ui/MapLayersUiItemsProvider.d.ts +8 -8
- package/lib/esm/ui/MapLayersUiItemsProvider.d.ts.map +1 -1
- package/lib/esm/ui/MapLayersUiItemsProvider.js +31 -34
- package/lib/esm/ui/MapLayersUiItemsProvider.js.map +1 -1
- package/lib/esm/ui/widget/AttachLayerPopupButton.d.ts +13 -14
- package/lib/esm/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
- package/lib/esm/ui/widget/AttachLayerPopupButton.js +331 -331
- package/lib/esm/ui/widget/BasemapPanel.d.ts +7 -8
- package/lib/esm/ui/widget/BasemapPanel.d.ts.map +1 -1
- package/lib/esm/ui/widget/BasemapPanel.js +152 -152
- package/lib/esm/ui/widget/BasemapPanel.js.map +1 -1
- package/lib/esm/ui/widget/BasemapPanel.scss +87 -87
- package/lib/esm/ui/widget/ConfirmMessageDialog.d.ts +20 -21
- package/lib/esm/ui/widget/ConfirmMessageDialog.d.ts.map +1 -1
- package/lib/esm/ui/widget/ConfirmMessageDialog.js +18 -18
- package/lib/esm/ui/widget/ConfirmMessageDialog.js.map +1 -1
- package/lib/esm/ui/widget/FeatureInfoDataProvider.d.ts +40 -40
- package/lib/esm/ui/widget/FeatureInfoDataProvider.js +134 -134
- package/lib/esm/ui/widget/FeatureInfoDataProvider.js.map +1 -1
- package/lib/esm/ui/widget/FeatureInfoWidget.d.ts +6 -7
- package/lib/esm/ui/widget/FeatureInfoWidget.d.ts.map +1 -1
- package/lib/esm/ui/widget/FeatureInfoWidget.js +61 -61
- package/lib/esm/ui/widget/FeatureInfoWidget.js.map +1 -1
- package/lib/esm/ui/widget/MapLayerDroppable.d.ts +18 -19
- package/lib/esm/ui/widget/MapLayerDroppable.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapLayerDroppable.js +81 -81
- package/lib/esm/ui/widget/MapLayerDroppable.js.map +1 -1
- package/lib/esm/ui/widget/MapLayerManager.d.ts +26 -26
- package/lib/esm/ui/widget/MapLayerManager.js +396 -396
- package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
- package/lib/esm/ui/widget/MapLayerManager.scss +409 -409
- package/lib/esm/ui/widget/MapLayerSettingsMenu.d.ts +11 -12
- package/lib/esm/ui/widget/MapLayerSettingsMenu.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapLayerSettingsMenu.js +78 -78
- package/lib/esm/ui/widget/MapLayerSettingsMenu.js.map +1 -1
- package/lib/esm/ui/widget/MapLayerSettingsPopupButton.d.ts +6 -7
- package/lib/esm/ui/widget/MapLayerSettingsPopupButton.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js +61 -61
- package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
- package/lib/esm/ui/widget/MapLayerSettingsPopupButton.scss +20 -20
- package/lib/esm/ui/widget/MapLayersWidget.d.ts +10 -11
- package/lib/esm/ui/widget/MapLayersWidget.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapLayersWidget.js +27 -27
- package/lib/esm/ui/widget/MapLayersWidget.js.map +1 -1
- package/lib/esm/ui/widget/MapManagerSettings.d.ts +2 -3
- package/lib/esm/ui/widget/MapManagerSettings.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapManagerSettings.js +196 -196
- package/lib/esm/ui/widget/MapManagerSettings.js.map +1 -1
- package/lib/esm/ui/widget/MapManagerSettings.scss +29 -29
- package/lib/esm/ui/widget/MapUrlDialog.d.ts +22 -23
- package/lib/esm/ui/widget/MapUrlDialog.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapUrlDialog.js +526 -526
- package/lib/esm/ui/widget/MapUrlDialog.js.map +1 -1
- package/lib/esm/ui/widget/MapUrlDialog.scss +99 -100
- package/lib/esm/ui/widget/SelectMapFormat.d.ts +17 -18
- package/lib/esm/ui/widget/SelectMapFormat.d.ts.map +1 -1
- package/lib/esm/ui/widget/SelectMapFormat.js +50 -50
- package/lib/esm/ui/widget/SelectMapFormat.js.map +1 -1
- package/lib/esm/ui/widget/SubLayersDataProvider.d.ts +18 -20
- package/lib/esm/ui/widget/SubLayersDataProvider.d.ts.map +1 -1
- package/lib/esm/ui/widget/SubLayersDataProvider.js +70 -71
- package/lib/esm/ui/widget/SubLayersDataProvider.js.map +1 -1
- package/lib/esm/ui/widget/SubLayersPopupButton.d.ts +9 -10
- package/lib/esm/ui/widget/SubLayersPopupButton.d.ts.map +1 -1
- package/lib/esm/ui/widget/SubLayersPopupButton.js +36 -36
- package/lib/esm/ui/widget/SubLayersPopupButton.js.map +1 -1
- package/lib/esm/ui/widget/SubLayersTree.d.ts +14 -15
- package/lib/esm/ui/widget/SubLayersTree.d.ts.map +1 -1
- package/lib/esm/ui/widget/SubLayersTree.js +408 -408
- package/lib/esm/ui/widget/SubLayersTree.js.map +1 -1
- package/lib/esm/ui/widget/SubLayersTree.scss +69 -69
- package/lib/esm/ui/widget/TransparencyPopupButton.d.ts +13 -14
- package/lib/esm/ui/widget/TransparencyPopupButton.d.ts.map +1 -1
- package/lib/esm/ui/widget/TransparencyPopupButton.js +43 -43
- package/lib/esm/ui/widget/TransparencyPopupButton.js.map +1 -1
- package/lib/esm/ui/widget/TransparencyPopupButton.scss +35 -36
- package/package.json +28 -34
|
@@ -1,402 +1,402 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
// cSpell:ignore droppable Sublayer Basemap
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.MapLayerManager = exports.useSourceMapContext = exports.SourceMapContext = void 0;
|
|
9
|
-
// the following quiet warning caused by react-beautiful-dnd package
|
|
10
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
11
|
-
const core_bentley_1 = require("@itwin/core-bentley");
|
|
12
|
-
const core_common_1 = require("@itwin/core-common");
|
|
13
|
-
const core_frontend_1 = require("@itwin/core-frontend");
|
|
14
|
-
const itwinui_react_1 = require("@itwin/itwinui-react");
|
|
15
|
-
const React = require("react");
|
|
16
|
-
const react_beautiful_dnd_1 = require("react-beautiful-dnd");
|
|
17
|
-
const MapLayerPreferences_1 = require("../../MapLayerPreferences");
|
|
18
|
-
const AttachLayerPopupButton_1 = require("./AttachLayerPopupButton");
|
|
19
|
-
const BasemapPanel_1 = require("./BasemapPanel");
|
|
20
|
-
const MapLayerDroppable_1 = require("./MapLayerDroppable");
|
|
21
|
-
require("./MapLayerManager.scss");
|
|
22
|
-
const MapLayerSettingsPopupButton_1 = require("./MapLayerSettingsPopupButton");
|
|
23
|
-
const mapLayers_1 = require("../../mapLayers");
|
|
24
|
-
/** @internal */
|
|
25
|
-
exports.SourceMapContext = React.createContext({
|
|
26
|
-
sources: [],
|
|
27
|
-
loadingSources: false,
|
|
28
|
-
bases: [],
|
|
29
|
-
refreshFromStyle: () => { },
|
|
30
|
-
});
|
|
31
|
-
/** @internal */
|
|
32
|
-
function useSourceMapContext() {
|
|
33
|
-
return React.useContext(exports.SourceMapContext);
|
|
34
|
-
}
|
|
35
|
-
exports.useSourceMapContext = useSourceMapContext;
|
|
36
|
-
function getSubLayerProps(subLayerSettings) {
|
|
37
|
-
return subLayerSettings.map((subLayer) => subLayer.toJSON());
|
|
38
|
-
}
|
|
39
|
-
function getMapLayerSettingsFromViewport(viewport, getBackgroundMap, populateSubLayers = true) {
|
|
40
|
-
const displayStyle = viewport.displayStyle;
|
|
41
|
-
if (!displayStyle)
|
|
42
|
-
return undefined;
|
|
43
|
-
const layers = new Array();
|
|
44
|
-
const displayStyleLayers = (getBackgroundMap ? displayStyle.backgroundMapLayers : displayStyle.overlayMapLayers);
|
|
45
|
-
for (let layerIndex = 0; layerIndex < displayStyleLayers.length; layerIndex++) {
|
|
46
|
-
const layerSettings = displayStyleLayers[layerIndex];
|
|
47
|
-
const isOverlay = !getBackgroundMap;
|
|
48
|
-
const layerProvider = viewport.getMapLayerImageryProvider(layerIndex, isOverlay);
|
|
49
|
-
const treeVisibility = viewport.getMapLayerScaleRangeVisibility(layerIndex, isOverlay);
|
|
50
|
-
const popSubLayers = populateSubLayers && (layerSettings instanceof core_common_1.ImageMapLayerSettings);
|
|
51
|
-
layers.push({
|
|
52
|
-
visible: layerSettings.visible,
|
|
53
|
-
treeVisibility,
|
|
54
|
-
name: layerSettings.name,
|
|
55
|
-
source: layerSettings.source,
|
|
56
|
-
transparency: layerSettings.transparency,
|
|
57
|
-
transparentBackground: layerSettings.transparentBackground,
|
|
58
|
-
subLayers: popSubLayers ? getSubLayerProps(layerSettings.subLayers) : undefined,
|
|
59
|
-
showSubLayers: false,
|
|
60
|
-
isOverlay,
|
|
61
|
-
layerIndex,
|
|
62
|
-
provider: layerProvider,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
// since we want to display higher level maps above lower maps in UI reverse their order here.
|
|
66
|
-
return layers.reverse();
|
|
67
|
-
}
|
|
68
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
69
|
-
function MapLayerManager(props) {
|
|
70
|
-
const [mapSources, setMapSources] = React.useState();
|
|
71
|
-
const [loadingSources, setLoadingSources] = React.useState(false);
|
|
72
|
-
const [baseSources, setBaseSources] = React.useState();
|
|
73
|
-
const [overlaysLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Widget.OverlayLayers"));
|
|
74
|
-
const [underlaysLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Widget.BackgroundLayers"));
|
|
75
|
-
const { activeViewport, mapLayerOptions } = props;
|
|
76
|
-
const hideExternalMapLayersSection = mapLayerOptions?.hideExternalMapLayers ? mapLayerOptions.hideExternalMapLayers : false;
|
|
77
|
-
const fetchPublicMapLayerSources = mapLayerOptions?.fetchPublicMapLayerSources ? mapLayerOptions.fetchPublicMapLayerSources : false;
|
|
78
|
-
// map layer settings from display style
|
|
79
|
-
const [backgroundMapLayers, setBackgroundMapLayers] = React.useState(getMapLayerSettingsFromViewport(activeViewport, true));
|
|
80
|
-
const [overlayMapLayers, setOverlayMapLayers] = React.useState(getMapLayerSettingsFromViewport(activeViewport, false));
|
|
81
|
-
const loadMapLayerSettingsFromViewport = React.useCallback((viewport) => {
|
|
82
|
-
setBackgroundMapLayers(getMapLayerSettingsFromViewport(viewport, true));
|
|
83
|
-
setOverlayMapLayers(getMapLayerSettingsFromViewport(viewport, false));
|
|
84
|
-
}, [setBackgroundMapLayers, setOverlayMapLayers]);
|
|
85
|
-
const [backgroundMapVisible, setBackgroundMapVisible] = React.useState(() => {
|
|
86
|
-
if (activeViewport) {
|
|
87
|
-
return activeViewport.viewFlags.backgroundMap;
|
|
88
|
-
}
|
|
89
|
-
return false;
|
|
90
|
-
});
|
|
91
|
-
React.useEffect(() => {
|
|
92
|
-
const updateBackgroundMapVisible = () => setBackgroundMapVisible(activeViewport.viewFlags.backgroundMap);
|
|
93
|
-
return activeViewport.onDisplayStyleChanged.addListener(updateBackgroundMapVisible);
|
|
94
|
-
}, [activeViewport]);
|
|
95
|
-
// 'isMounted' is used to prevent any async operation once the hook has been
|
|
96
|
-
// unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.
|
|
97
|
-
const isMounted = React.useRef(false);
|
|
98
|
-
React.useEffect(() => {
|
|
99
|
-
isMounted.current = true;
|
|
100
|
-
return () => {
|
|
101
|
-
isMounted.current = false;
|
|
102
|
-
};
|
|
103
|
-
});
|
|
104
|
-
// Setup onTileTreeLoad events listening.
|
|
105
|
-
// This is needed because we need to know when the imagery provider
|
|
106
|
-
// is created, and be able to monitor to status change.
|
|
107
|
-
React.useEffect(() => {
|
|
108
|
-
const handleTileTreeLoad = (args) => {
|
|
109
|
-
// Ignore non-map tile trees
|
|
110
|
-
if (args.tileTree instanceof core_frontend_1.ImageryMapTileTree) {
|
|
111
|
-
loadMapLayerSettingsFromViewport(activeViewport);
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
core_frontend_1.IModelApp.tileAdmin.onTileTreeLoad.addListener(handleTileTreeLoad);
|
|
115
|
-
return () => {
|
|
116
|
-
core_frontend_1.IModelApp.tileAdmin.onTileTreeLoad.removeListener(handleTileTreeLoad);
|
|
117
|
-
};
|
|
118
|
-
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
119
|
-
React.useEffect(() => {
|
|
120
|
-
const handleScaleRangeVisibilityChanged = (layerIndexes) => {
|
|
121
|
-
const updateLayers = (array) => {
|
|
122
|
-
if (array === undefined)
|
|
123
|
-
return undefined;
|
|
124
|
-
return array.map((curStyledLayer) => {
|
|
125
|
-
const foundScaleRangeVisibility = layerIndexes.find((layerIdx) => layerIdx.index === curStyledLayer.layerIndex && layerIdx.isOverlay === curStyledLayer.isOverlay);
|
|
126
|
-
if (undefined === foundScaleRangeVisibility)
|
|
127
|
-
return curStyledLayer;
|
|
128
|
-
else
|
|
129
|
-
return { ...curStyledLayer, treeVisibility: foundScaleRangeVisibility.visibility };
|
|
130
|
-
});
|
|
131
|
-
};
|
|
132
|
-
setBackgroundMapLayers(updateLayers(backgroundMapLayers));
|
|
133
|
-
setOverlayMapLayers(updateLayers(overlayMapLayers));
|
|
134
|
-
};
|
|
135
|
-
activeViewport.onMapLayerScaleRangeVisibilityChanged.addListener(handleScaleRangeVisibilityChanged);
|
|
136
|
-
return () => {
|
|
137
|
-
activeViewport.onMapLayerScaleRangeVisibilityChanged.removeListener(handleScaleRangeVisibilityChanged);
|
|
138
|
-
};
|
|
139
|
-
}, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);
|
|
140
|
-
// Setup onMapImageryChanged events listening.
|
|
141
|
-
React.useEffect(() => {
|
|
142
|
-
const handleMapImageryChanged = (args) => {
|
|
143
|
-
if (args.backgroundLayers.length !== (backgroundMapLayers ? backgroundMapLayers.length : 0)
|
|
144
|
-
|| args.overlayLayers.length !== (overlayMapLayers ? overlayMapLayers.length : 0)) {
|
|
145
|
-
loadMapLayerSettingsFromViewport(activeViewport);
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
activeViewport?.displayStyle.settings.onMapImageryChanged.addListener(handleMapImageryChanged);
|
|
149
|
-
return () => {
|
|
150
|
-
activeViewport?.displayStyle.settings.onMapImageryChanged.removeListener(handleMapImageryChanged);
|
|
151
|
-
};
|
|
152
|
-
}, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);
|
|
153
|
-
const handleProviderStatusChanged = React.useCallback((_args) => {
|
|
154
|
-
loadMapLayerSettingsFromViewport(activeViewport);
|
|
155
|
-
}, [loadMapLayerSettingsFromViewport, activeViewport]);
|
|
156
|
-
// Triggered whenever a provider status change
|
|
157
|
-
React.useEffect(() => {
|
|
158
|
-
backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });
|
|
159
|
-
overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });
|
|
160
|
-
return () => {
|
|
161
|
-
backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });
|
|
162
|
-
overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });
|
|
163
|
-
};
|
|
164
|
-
}, [backgroundMapLayers, overlayMapLayers, activeViewport, loadMapLayerSettingsFromViewport, handleProviderStatusChanged]);
|
|
165
|
-
// Monitor viewport updates, and refresh the widget accordingly.
|
|
166
|
-
// Note: This is needed for multiple viewport applications.
|
|
167
|
-
React.useEffect(() => {
|
|
168
|
-
// Update background map status
|
|
169
|
-
setBackgroundMapVisible(activeViewport.viewFlags.backgroundMap);
|
|
170
|
-
// Refresh list of layers
|
|
171
|
-
loadMapLayerSettingsFromViewport(activeViewport);
|
|
172
|
-
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
173
|
-
React.useEffect(() => {
|
|
174
|
-
async function fetchWmsMapData() {
|
|
175
|
-
const sources = [];
|
|
176
|
-
const bases = [];
|
|
177
|
-
const sourceLayers = await core_frontend_1.MapLayerSources.create(undefined, (fetchPublicMapLayerSources && !hideExternalMapLayersSection));
|
|
178
|
-
const iModel = core_frontend_1.IModelApp.viewManager.selectedView ? core_frontend_1.IModelApp.viewManager.selectedView.iModel : undefined;
|
|
179
|
-
try {
|
|
180
|
-
const preferenceSources = (iModel?.iTwinId === undefined
|
|
181
|
-
? []
|
|
182
|
-
: await MapLayerPreferences_1.MapLayerPreferences.getSources(iModel?.iTwinId, iModel?.iModelId));
|
|
183
|
-
for (const source of preferenceSources)
|
|
184
|
-
await core_frontend_1.MapLayerSources.addSourceToMapLayerSources(source);
|
|
185
|
-
}
|
|
186
|
-
catch (err) {
|
|
187
|
-
core_frontend_1.IModelApp.notifications.outputMessage(new core_frontend_1.NotifyMessageDetails(core_frontend_1.OutputMessagePriority.Error, core_frontend_1.IModelApp.localization.getLocalizedString("mapLayers:CustomAttach.ErrorLoadingLayers"), core_bentley_1.BentleyError.getErrorMessage(err)));
|
|
188
|
-
}
|
|
189
|
-
if (!isMounted.current) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
// This is where the list of layers first gets populated... I need to update it
|
|
193
|
-
// MapUrlDialog gets around knowing MapLayerManager exists and vice versa by affecting the viewports displayStyle which MapLayerManager is listening for
|
|
194
|
-
// We know when displayStyle changes we've added a layer, this layer may not be a custom layer
|
|
195
|
-
sourceLayers?.layers.forEach((source) => { sources.push(source); });
|
|
196
|
-
setMapSources(sources);
|
|
197
|
-
sourceLayers?.bases.forEach((source) => { bases.push(source); });
|
|
198
|
-
setBaseSources(bases);
|
|
199
|
-
}
|
|
200
|
-
setLoadingSources(true);
|
|
201
|
-
fetchWmsMapData().then(() => {
|
|
202
|
-
if (isMounted.current) {
|
|
203
|
-
setLoadingSources(false);
|
|
204
|
-
}
|
|
205
|
-
}).catch(() => {
|
|
206
|
-
if (isMounted.current) {
|
|
207
|
-
setLoadingSources(false);
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
}, [setMapSources, fetchPublicMapLayerSources, hideExternalMapLayersSection]);
|
|
211
|
-
const updateMapSources = React.useCallback(() => {
|
|
212
|
-
const newSources = [];
|
|
213
|
-
core_frontend_1.MapLayerSources.getInstance()?.layers?.forEach((sourceLayer) => { newSources.push(sourceLayer); });
|
|
214
|
-
setMapSources(newSources);
|
|
215
|
-
}, [setMapSources]);
|
|
216
|
-
/**
|
|
217
|
-
* Handle change events in the MapLayerPreferences
|
|
218
|
-
*/
|
|
219
|
-
React.useEffect(() => {
|
|
220
|
-
const handleLayerSourceChange = async (changeType, oldSource, newSource) => {
|
|
221
|
-
const removeSourceOnly = (changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Removed);
|
|
222
|
-
const removeSource = (changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Replaced || changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Removed);
|
|
223
|
-
const addSource = (changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Replaced || changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Added);
|
|
224
|
-
if (removeSource) {
|
|
225
|
-
if (oldSource) {
|
|
226
|
-
const succeeded = core_frontend_1.MapLayerSources.removeLayerByName(oldSource.name);
|
|
227
|
-
(0, core_bentley_1.assert)(succeeded);
|
|
228
|
-
if (!succeeded) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
if (removeSourceOnly) {
|
|
232
|
-
updateMapSources();
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
if (addSource) {
|
|
238
|
-
const sources = await core_frontend_1.MapLayerSources.addSourceToMapLayerSources(newSource);
|
|
239
|
-
(0, core_bentley_1.assert)(sources !== undefined);
|
|
240
|
-
if (sources) {
|
|
241
|
-
updateMapSources();
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
MapLayerPreferences_1.MapLayerPreferences.onLayerSourceChanged.addListener(handleLayerSourceChange);
|
|
246
|
-
return (() => {
|
|
247
|
-
MapLayerPreferences_1.MapLayerPreferences.onLayerSourceChanged.removeListener(handleLayerSourceChange);
|
|
248
|
-
});
|
|
249
|
-
}, [updateMapSources]);
|
|
250
|
-
// update when a different display style is loaded.
|
|
251
|
-
React.useEffect(() => {
|
|
252
|
-
const handleDisplayStyleChange = (vp) => {
|
|
253
|
-
loadMapLayerSettingsFromViewport(vp);
|
|
254
|
-
};
|
|
255
|
-
activeViewport?.onDisplayStyleChanged.addListener(handleDisplayStyleChange);
|
|
256
|
-
return () => {
|
|
257
|
-
activeViewport?.onDisplayStyleChanged.removeListener(handleDisplayStyleChange);
|
|
258
|
-
};
|
|
259
|
-
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
260
|
-
const handleOnMenuItemSelection = React.useCallback((action, mapLayerSettings) => {
|
|
261
|
-
if (!activeViewport || !activeViewport.displayStyle)
|
|
262
|
-
return;
|
|
263
|
-
const indexInDisplayStyle = activeViewport.displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);
|
|
264
|
-
if (indexInDisplayStyle < 0)
|
|
265
|
-
return;
|
|
266
|
-
switch (action) {
|
|
267
|
-
case "delete":
|
|
268
|
-
activeViewport.displayStyle.detachMapLayerByIndex(indexInDisplayStyle, mapLayerSettings.isOverlay);
|
|
269
|
-
break;
|
|
270
|
-
case "zoom-to-layer":
|
|
271
|
-
activeViewport.displayStyle.viewMapLayerRange(indexInDisplayStyle, mapLayerSettings.isOverlay, activeViewport).then((status) => {
|
|
272
|
-
if (!status) {
|
|
273
|
-
const msg = mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Messages.NoRangeDefined");
|
|
274
|
-
core_frontend_1.IModelApp.notifications.outputMessage(new core_frontend_1.NotifyMessageDetails(core_frontend_1.OutputMessagePriority.Error, `${msg} [${mapLayerSettings.name}]`));
|
|
275
|
-
}
|
|
276
|
-
}).catch((_error) => { });
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
activeViewport.invalidateRenderPlan();
|
|
280
|
-
// force UI to update
|
|
281
|
-
loadMapLayerSettingsFromViewport(activeViewport);
|
|
282
|
-
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
283
|
-
const handleLayerVisibilityChange = React.useCallback((mapLayerSettings) => {
|
|
284
|
-
if (activeViewport) {
|
|
285
|
-
const isVisible = !mapLayerSettings.visible;
|
|
286
|
-
const displayStyle = activeViewport.displayStyle;
|
|
287
|
-
const indexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);
|
|
288
|
-
if (-1 !== indexInDisplayStyle) {
|
|
289
|
-
// update the display style
|
|
290
|
-
displayStyle.changeMapLayerProps({ visible: isVisible }, indexInDisplayStyle, mapLayerSettings.isOverlay);
|
|
291
|
-
activeViewport.invalidateRenderPlan();
|
|
292
|
-
// force UI to update
|
|
293
|
-
loadMapLayerSettingsFromViewport(activeViewport);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
297
|
-
const handleMapLayersToggle = React.useCallback(() => {
|
|
298
|
-
if (activeViewport) {
|
|
299
|
-
const newState = !backgroundMapVisible;
|
|
300
|
-
activeViewport.viewFlags = activeViewport.viewFlags.with("backgroundMap", newState);
|
|
301
|
-
setBackgroundMapVisible(newState);
|
|
302
|
-
}
|
|
303
|
-
}, [backgroundMapVisible, setBackgroundMapVisible, activeViewport]);
|
|
304
|
-
const handleOnMapLayerDragEnd = React.useCallback((result /* , _provided: ResponderProvided*/) => {
|
|
305
|
-
const { destination, source } = result;
|
|
306
|
-
if (!destination) // dropped outside of list
|
|
307
|
-
return;
|
|
308
|
-
// item was not moved
|
|
309
|
-
if (destination.droppableId === source.droppableId && destination.index === source.index)
|
|
310
|
-
return;
|
|
311
|
-
let fromMapLayer;
|
|
312
|
-
if (source.droppableId === "overlayMapLayers" && overlayMapLayers)
|
|
313
|
-
fromMapLayer = overlayMapLayers[source.index];
|
|
314
|
-
else if (source.droppableId === "backgroundMapLayers" && backgroundMapLayers)
|
|
315
|
-
fromMapLayer = backgroundMapLayers[source.index];
|
|
316
|
-
if (!fromMapLayer || !activeViewport)
|
|
317
|
-
return;
|
|
318
|
-
const displayStyle = activeViewport.displayStyle;
|
|
319
|
-
let toMapLayer;
|
|
320
|
-
let toIndexInDisplayStyle = -1;
|
|
321
|
-
// If destination.index is undefined then the user dropped the map at the end of list of maps. To get the "actual" index in the style, look up index in style by name.
|
|
322
|
-
// We need to do this because the order of layers in UI are reversed so higher layers appear above lower layers.
|
|
323
|
-
if (undefined !== destination.index) {
|
|
324
|
-
if (destination.droppableId === "overlayMapLayers" && overlayMapLayers)
|
|
325
|
-
toMapLayer = overlayMapLayers[destination.index];
|
|
326
|
-
else if (destination.droppableId === "backgroundMapLayers" && backgroundMapLayers)
|
|
327
|
-
toMapLayer = backgroundMapLayers[destination.index];
|
|
328
|
-
if (toMapLayer)
|
|
329
|
-
toIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(toMapLayer.name, toMapLayer.source, toMapLayer.isOverlay);
|
|
330
|
-
}
|
|
331
|
-
const fromIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(fromMapLayer.name, fromMapLayer.source, fromMapLayer.isOverlay);
|
|
332
|
-
if (fromIndexInDisplayStyle < 0)
|
|
333
|
-
return;
|
|
334
|
-
if (destination.droppableId !== source.droppableId) {
|
|
335
|
-
// see if we moved from "overlayMapLayers" to "backgroundMapLayers" or vice-versa
|
|
336
|
-
const settings = activeViewport.displayStyle.mapLayerAtIndex(fromIndexInDisplayStyle, fromMapLayer.isOverlay);
|
|
337
|
-
if (settings) {
|
|
338
|
-
activeViewport.displayStyle.detachMapLayerByIndex(fromIndexInDisplayStyle, fromMapLayer.isOverlay);
|
|
339
|
-
// Manually reverse index when moved from one section to the other
|
|
340
|
-
if (fromMapLayer.isOverlay && backgroundMapLayers) {
|
|
341
|
-
toIndexInDisplayStyle = displayStyle.backgroundMapLayers.length - destination.index;
|
|
342
|
-
}
|
|
343
|
-
else if (!fromMapLayer.isOverlay && overlayMapLayers) {
|
|
344
|
-
toIndexInDisplayStyle = overlayMapLayers.length - destination.index;
|
|
345
|
-
}
|
|
346
|
-
activeViewport.displayStyle.attachMapLayer({ settings, isOverlay: !fromMapLayer.isOverlay, insertIndex: toIndexInDisplayStyle });
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
if (undefined === destination.index) {
|
|
351
|
-
displayStyle.moveMapLayerToBottom(fromIndexInDisplayStyle, destination.droppableId === "overlayMapLayers");
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
if (toMapLayer) {
|
|
355
|
-
if (toIndexInDisplayStyle !== -1)
|
|
356
|
-
displayStyle.moveMapLayerToIndex(fromIndexInDisplayStyle, toIndexInDisplayStyle, toMapLayer.isOverlay);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
// apply display style change to view
|
|
361
|
-
activeViewport.invalidateRenderPlan();
|
|
362
|
-
// force UI to update
|
|
363
|
-
loadMapLayerSettingsFromViewport(activeViewport);
|
|
364
|
-
}, [loadMapLayerSettingsFromViewport, activeViewport, overlayMapLayers, backgroundMapLayers]);
|
|
365
|
-
const handleRefreshFromStyle = React.useCallback(() => {
|
|
366
|
-
if (activeViewport)
|
|
367
|
-
loadMapLayerSettingsFromViewport(activeViewport);
|
|
368
|
-
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
369
|
-
const [baseMapPanelLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Basemap.BaseMapPanelTitle"));
|
|
370
|
-
return (React.createElement(exports.SourceMapContext.Provider, { value: {
|
|
371
|
-
activeViewport,
|
|
372
|
-
loadingSources,
|
|
373
|
-
sources: mapSources ? mapSources : [],
|
|
374
|
-
bases: baseSources ? baseSources : [],
|
|
375
|
-
refreshFromStyle: handleRefreshFromStyle,
|
|
376
|
-
backgroundLayers: backgroundMapLayers,
|
|
377
|
-
overlayLayers: overlayMapLayers,
|
|
378
|
-
mapLayerOptions,
|
|
379
|
-
} },
|
|
380
|
-
React.createElement("div", { className: "map-manager-top-header" },
|
|
381
|
-
React.createElement("span", { className: "map-manager-header-label" }, baseMapPanelLabel),
|
|
382
|
-
React.createElement("div", { className: "map-manager-header-buttons-group" },
|
|
383
|
-
React.createElement(itwinui_react_1.ToggleSwitch, { className: "map-manager-toggle", checked: backgroundMapVisible, onChange: handleMapLayersToggle }),
|
|
384
|
-
React.createElement(MapLayerSettingsPopupButton_1.MapLayerSettingsPopupButton, { disabled: !backgroundMapVisible }))),
|
|
385
|
-
React.createElement("div", { className: "map-manager-container" },
|
|
386
|
-
React.createElement("div", { className: "map-manager-basemap" },
|
|
387
|
-
React.createElement(BasemapPanel_1.BasemapPanel, { disabled: !backgroundMapVisible })),
|
|
388
|
-
!hideExternalMapLayersSection &&
|
|
389
|
-
React.createElement(react_beautiful_dnd_1.DragDropContext, { onDragEnd: handleOnMapLayerDragEnd },
|
|
390
|
-
React.createElement("div", { className: "map-manager-layer-wrapper" },
|
|
391
|
-
React.createElement("div", { className: "map-manager-underlays" },
|
|
392
|
-
React.createElement("span", { className: "map-manager-underlays-label" }, underlaysLabel),
|
|
393
|
-
React.createElement(AttachLayerPopupButton_1.AttachLayerPopupButton, { disabled: !backgroundMapVisible, isOverlay: false })),
|
|
394
|
-
React.createElement(MapLayerDroppable_1.MapLayerDroppable, { disabled: !backgroundMapVisible, isOverlay: false, layersList: backgroundMapLayers, mapTypesOptions: props.mapLayerOptions?.mapTypeOptions, getContainerForClone: props.getContainerForClone, activeViewport: props.activeViewport, onMenuItemSelected: handleOnMenuItemSelection, onItemVisibilityToggleClicked: handleLayerVisibilityChange, onItemEdited: handleRefreshFromStyle })),
|
|
395
|
-
React.createElement("div", { className: "map-manager-layer-wrapper" },
|
|
396
|
-
React.createElement("div", { className: "map-manager-overlays" },
|
|
397
|
-
React.createElement("span", { className: "map-manager-overlays-label" }, overlaysLabel),
|
|
398
|
-
React.createElement(AttachLayerPopupButton_1.AttachLayerPopupButton, { disabled: !backgroundMapVisible, isOverlay: true })),
|
|
399
|
-
React.createElement(MapLayerDroppable_1.MapLayerDroppable, { disabled: !backgroundMapVisible, isOverlay: true, layersList: overlayMapLayers, mapTypesOptions: props.mapLayerOptions?.mapTypeOptions, getContainerForClone: props.getContainerForClone, activeViewport: props.activeViewport, onMenuItemSelected: handleOnMenuItemSelection, onItemVisibilityToggleClicked: handleLayerVisibilityChange, onItemEdited: handleRefreshFromStyle }))))));
|
|
400
|
-
}
|
|
401
|
-
exports.MapLayerManager = MapLayerManager;
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
+
*--------------------------------------------------------------------------------------------*/
|
|
6
|
+
// cSpell:ignore droppable Sublayer Basemap
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.MapLayerManager = exports.useSourceMapContext = exports.SourceMapContext = void 0;
|
|
9
|
+
// the following quiet warning caused by react-beautiful-dnd package
|
|
10
|
+
/* eslint-disable @typescript-eslint/unbound-method */
|
|
11
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
12
|
+
const core_common_1 = require("@itwin/core-common");
|
|
13
|
+
const core_frontend_1 = require("@itwin/core-frontend");
|
|
14
|
+
const itwinui_react_1 = require("@itwin/itwinui-react");
|
|
15
|
+
const React = require("react");
|
|
16
|
+
const react_beautiful_dnd_1 = require("react-beautiful-dnd");
|
|
17
|
+
const MapLayerPreferences_1 = require("../../MapLayerPreferences");
|
|
18
|
+
const AttachLayerPopupButton_1 = require("./AttachLayerPopupButton");
|
|
19
|
+
const BasemapPanel_1 = require("./BasemapPanel");
|
|
20
|
+
const MapLayerDroppable_1 = require("./MapLayerDroppable");
|
|
21
|
+
require("./MapLayerManager.scss");
|
|
22
|
+
const MapLayerSettingsPopupButton_1 = require("./MapLayerSettingsPopupButton");
|
|
23
|
+
const mapLayers_1 = require("../../mapLayers");
|
|
24
|
+
/** @internal */
|
|
25
|
+
exports.SourceMapContext = React.createContext({
|
|
26
|
+
sources: [],
|
|
27
|
+
loadingSources: false,
|
|
28
|
+
bases: [],
|
|
29
|
+
refreshFromStyle: () => { },
|
|
30
|
+
});
|
|
31
|
+
/** @internal */
|
|
32
|
+
function useSourceMapContext() {
|
|
33
|
+
return React.useContext(exports.SourceMapContext);
|
|
34
|
+
}
|
|
35
|
+
exports.useSourceMapContext = useSourceMapContext;
|
|
36
|
+
function getSubLayerProps(subLayerSettings) {
|
|
37
|
+
return subLayerSettings.map((subLayer) => subLayer.toJSON());
|
|
38
|
+
}
|
|
39
|
+
function getMapLayerSettingsFromViewport(viewport, getBackgroundMap, populateSubLayers = true) {
|
|
40
|
+
const displayStyle = viewport.displayStyle;
|
|
41
|
+
if (!displayStyle)
|
|
42
|
+
return undefined;
|
|
43
|
+
const layers = new Array();
|
|
44
|
+
const displayStyleLayers = (getBackgroundMap ? displayStyle.backgroundMapLayers : displayStyle.overlayMapLayers);
|
|
45
|
+
for (let layerIndex = 0; layerIndex < displayStyleLayers.length; layerIndex++) {
|
|
46
|
+
const layerSettings = displayStyleLayers[layerIndex];
|
|
47
|
+
const isOverlay = !getBackgroundMap;
|
|
48
|
+
const layerProvider = viewport.getMapLayerImageryProvider(layerIndex, isOverlay);
|
|
49
|
+
const treeVisibility = viewport.getMapLayerScaleRangeVisibility(layerIndex, isOverlay);
|
|
50
|
+
const popSubLayers = populateSubLayers && (layerSettings instanceof core_common_1.ImageMapLayerSettings);
|
|
51
|
+
layers.push({
|
|
52
|
+
visible: layerSettings.visible,
|
|
53
|
+
treeVisibility,
|
|
54
|
+
name: layerSettings.name,
|
|
55
|
+
source: layerSettings.source,
|
|
56
|
+
transparency: layerSettings.transparency,
|
|
57
|
+
transparentBackground: layerSettings.transparentBackground,
|
|
58
|
+
subLayers: popSubLayers ? getSubLayerProps(layerSettings.subLayers) : undefined,
|
|
59
|
+
showSubLayers: false,
|
|
60
|
+
isOverlay,
|
|
61
|
+
layerIndex,
|
|
62
|
+
provider: layerProvider,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// since we want to display higher level maps above lower maps in UI reverse their order here.
|
|
66
|
+
return layers.reverse();
|
|
67
|
+
}
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
69
|
+
function MapLayerManager(props) {
|
|
70
|
+
const [mapSources, setMapSources] = React.useState();
|
|
71
|
+
const [loadingSources, setLoadingSources] = React.useState(false);
|
|
72
|
+
const [baseSources, setBaseSources] = React.useState();
|
|
73
|
+
const [overlaysLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Widget.OverlayLayers"));
|
|
74
|
+
const [underlaysLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Widget.BackgroundLayers"));
|
|
75
|
+
const { activeViewport, mapLayerOptions } = props;
|
|
76
|
+
const hideExternalMapLayersSection = mapLayerOptions?.hideExternalMapLayers ? mapLayerOptions.hideExternalMapLayers : false;
|
|
77
|
+
const fetchPublicMapLayerSources = mapLayerOptions?.fetchPublicMapLayerSources ? mapLayerOptions.fetchPublicMapLayerSources : false;
|
|
78
|
+
// map layer settings from display style
|
|
79
|
+
const [backgroundMapLayers, setBackgroundMapLayers] = React.useState(getMapLayerSettingsFromViewport(activeViewport, true));
|
|
80
|
+
const [overlayMapLayers, setOverlayMapLayers] = React.useState(getMapLayerSettingsFromViewport(activeViewport, false));
|
|
81
|
+
const loadMapLayerSettingsFromViewport = React.useCallback((viewport) => {
|
|
82
|
+
setBackgroundMapLayers(getMapLayerSettingsFromViewport(viewport, true));
|
|
83
|
+
setOverlayMapLayers(getMapLayerSettingsFromViewport(viewport, false));
|
|
84
|
+
}, [setBackgroundMapLayers, setOverlayMapLayers]);
|
|
85
|
+
const [backgroundMapVisible, setBackgroundMapVisible] = React.useState(() => {
|
|
86
|
+
if (activeViewport) {
|
|
87
|
+
return activeViewport.viewFlags.backgroundMap;
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
});
|
|
91
|
+
React.useEffect(() => {
|
|
92
|
+
const updateBackgroundMapVisible = () => setBackgroundMapVisible(activeViewport.viewFlags.backgroundMap);
|
|
93
|
+
return activeViewport.onDisplayStyleChanged.addListener(updateBackgroundMapVisible);
|
|
94
|
+
}, [activeViewport]);
|
|
95
|
+
// 'isMounted' is used to prevent any async operation once the hook has been
|
|
96
|
+
// unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.
|
|
97
|
+
const isMounted = React.useRef(false);
|
|
98
|
+
React.useEffect(() => {
|
|
99
|
+
isMounted.current = true;
|
|
100
|
+
return () => {
|
|
101
|
+
isMounted.current = false;
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
// Setup onTileTreeLoad events listening.
|
|
105
|
+
// This is needed because we need to know when the imagery provider
|
|
106
|
+
// is created, and be able to monitor to status change.
|
|
107
|
+
React.useEffect(() => {
|
|
108
|
+
const handleTileTreeLoad = (args) => {
|
|
109
|
+
// Ignore non-map tile trees
|
|
110
|
+
if (args.tileTree instanceof core_frontend_1.ImageryMapTileTree) {
|
|
111
|
+
loadMapLayerSettingsFromViewport(activeViewport);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
core_frontend_1.IModelApp.tileAdmin.onTileTreeLoad.addListener(handleTileTreeLoad);
|
|
115
|
+
return () => {
|
|
116
|
+
core_frontend_1.IModelApp.tileAdmin.onTileTreeLoad.removeListener(handleTileTreeLoad);
|
|
117
|
+
};
|
|
118
|
+
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
119
|
+
React.useEffect(() => {
|
|
120
|
+
const handleScaleRangeVisibilityChanged = (layerIndexes) => {
|
|
121
|
+
const updateLayers = (array) => {
|
|
122
|
+
if (array === undefined)
|
|
123
|
+
return undefined;
|
|
124
|
+
return array.map((curStyledLayer) => {
|
|
125
|
+
const foundScaleRangeVisibility = layerIndexes.find((layerIdx) => layerIdx.index === curStyledLayer.layerIndex && layerIdx.isOverlay === curStyledLayer.isOverlay);
|
|
126
|
+
if (undefined === foundScaleRangeVisibility)
|
|
127
|
+
return curStyledLayer;
|
|
128
|
+
else
|
|
129
|
+
return { ...curStyledLayer, treeVisibility: foundScaleRangeVisibility.visibility };
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
setBackgroundMapLayers(updateLayers(backgroundMapLayers));
|
|
133
|
+
setOverlayMapLayers(updateLayers(overlayMapLayers));
|
|
134
|
+
};
|
|
135
|
+
activeViewport.onMapLayerScaleRangeVisibilityChanged.addListener(handleScaleRangeVisibilityChanged);
|
|
136
|
+
return () => {
|
|
137
|
+
activeViewport.onMapLayerScaleRangeVisibilityChanged.removeListener(handleScaleRangeVisibilityChanged);
|
|
138
|
+
};
|
|
139
|
+
}, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);
|
|
140
|
+
// Setup onMapImageryChanged events listening.
|
|
141
|
+
React.useEffect(() => {
|
|
142
|
+
const handleMapImageryChanged = (args) => {
|
|
143
|
+
if (args.backgroundLayers.length !== (backgroundMapLayers ? backgroundMapLayers.length : 0)
|
|
144
|
+
|| args.overlayLayers.length !== (overlayMapLayers ? overlayMapLayers.length : 0)) {
|
|
145
|
+
loadMapLayerSettingsFromViewport(activeViewport);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
activeViewport?.displayStyle.settings.onMapImageryChanged.addListener(handleMapImageryChanged);
|
|
149
|
+
return () => {
|
|
150
|
+
activeViewport?.displayStyle.settings.onMapImageryChanged.removeListener(handleMapImageryChanged);
|
|
151
|
+
};
|
|
152
|
+
}, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);
|
|
153
|
+
const handleProviderStatusChanged = React.useCallback((_args) => {
|
|
154
|
+
loadMapLayerSettingsFromViewport(activeViewport);
|
|
155
|
+
}, [loadMapLayerSettingsFromViewport, activeViewport]);
|
|
156
|
+
// Triggered whenever a provider status change
|
|
157
|
+
React.useEffect(() => {
|
|
158
|
+
backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });
|
|
159
|
+
overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });
|
|
160
|
+
return () => {
|
|
161
|
+
backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });
|
|
162
|
+
overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });
|
|
163
|
+
};
|
|
164
|
+
}, [backgroundMapLayers, overlayMapLayers, activeViewport, loadMapLayerSettingsFromViewport, handleProviderStatusChanged]);
|
|
165
|
+
// Monitor viewport updates, and refresh the widget accordingly.
|
|
166
|
+
// Note: This is needed for multiple viewport applications.
|
|
167
|
+
React.useEffect(() => {
|
|
168
|
+
// Update background map status
|
|
169
|
+
setBackgroundMapVisible(activeViewport.viewFlags.backgroundMap);
|
|
170
|
+
// Refresh list of layers
|
|
171
|
+
loadMapLayerSettingsFromViewport(activeViewport);
|
|
172
|
+
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
173
|
+
React.useEffect(() => {
|
|
174
|
+
async function fetchWmsMapData() {
|
|
175
|
+
const sources = [];
|
|
176
|
+
const bases = [];
|
|
177
|
+
const sourceLayers = await core_frontend_1.MapLayerSources.create(undefined, (fetchPublicMapLayerSources && !hideExternalMapLayersSection));
|
|
178
|
+
const iModel = core_frontend_1.IModelApp.viewManager.selectedView ? core_frontend_1.IModelApp.viewManager.selectedView.iModel : undefined;
|
|
179
|
+
try {
|
|
180
|
+
const preferenceSources = (iModel?.iTwinId === undefined
|
|
181
|
+
? []
|
|
182
|
+
: await MapLayerPreferences_1.MapLayerPreferences.getSources(iModel?.iTwinId, iModel?.iModelId));
|
|
183
|
+
for (const source of preferenceSources)
|
|
184
|
+
await core_frontend_1.MapLayerSources.addSourceToMapLayerSources(source);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
core_frontend_1.IModelApp.notifications.outputMessage(new core_frontend_1.NotifyMessageDetails(core_frontend_1.OutputMessagePriority.Error, core_frontend_1.IModelApp.localization.getLocalizedString("mapLayers:CustomAttach.ErrorLoadingLayers"), core_bentley_1.BentleyError.getErrorMessage(err)));
|
|
188
|
+
}
|
|
189
|
+
if (!isMounted.current) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// This is where the list of layers first gets populated... I need to update it
|
|
193
|
+
// MapUrlDialog gets around knowing MapLayerManager exists and vice versa by affecting the viewports displayStyle which MapLayerManager is listening for
|
|
194
|
+
// We know when displayStyle changes we've added a layer, this layer may not be a custom layer
|
|
195
|
+
sourceLayers?.layers.forEach((source) => { sources.push(source); });
|
|
196
|
+
setMapSources(sources);
|
|
197
|
+
sourceLayers?.bases.forEach((source) => { bases.push(source); });
|
|
198
|
+
setBaseSources(bases);
|
|
199
|
+
}
|
|
200
|
+
setLoadingSources(true);
|
|
201
|
+
fetchWmsMapData().then(() => {
|
|
202
|
+
if (isMounted.current) {
|
|
203
|
+
setLoadingSources(false);
|
|
204
|
+
}
|
|
205
|
+
}).catch(() => {
|
|
206
|
+
if (isMounted.current) {
|
|
207
|
+
setLoadingSources(false);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}, [setMapSources, fetchPublicMapLayerSources, hideExternalMapLayersSection]);
|
|
211
|
+
const updateMapSources = React.useCallback(() => {
|
|
212
|
+
const newSources = [];
|
|
213
|
+
core_frontend_1.MapLayerSources.getInstance()?.layers?.forEach((sourceLayer) => { newSources.push(sourceLayer); });
|
|
214
|
+
setMapSources(newSources);
|
|
215
|
+
}, [setMapSources]);
|
|
216
|
+
/**
|
|
217
|
+
* Handle change events in the MapLayerPreferences
|
|
218
|
+
*/
|
|
219
|
+
React.useEffect(() => {
|
|
220
|
+
const handleLayerSourceChange = async (changeType, oldSource, newSource) => {
|
|
221
|
+
const removeSourceOnly = (changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Removed);
|
|
222
|
+
const removeSource = (changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Replaced || changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Removed);
|
|
223
|
+
const addSource = (changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Replaced || changeType === MapLayerPreferences_1.MapLayerSourceChangeType.Added);
|
|
224
|
+
if (removeSource) {
|
|
225
|
+
if (oldSource) {
|
|
226
|
+
const succeeded = core_frontend_1.MapLayerSources.removeLayerByName(oldSource.name);
|
|
227
|
+
(0, core_bentley_1.assert)(succeeded);
|
|
228
|
+
if (!succeeded) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (removeSourceOnly) {
|
|
232
|
+
updateMapSources();
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (addSource) {
|
|
238
|
+
const sources = await core_frontend_1.MapLayerSources.addSourceToMapLayerSources(newSource);
|
|
239
|
+
(0, core_bentley_1.assert)(sources !== undefined);
|
|
240
|
+
if (sources) {
|
|
241
|
+
updateMapSources();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
MapLayerPreferences_1.MapLayerPreferences.onLayerSourceChanged.addListener(handleLayerSourceChange);
|
|
246
|
+
return (() => {
|
|
247
|
+
MapLayerPreferences_1.MapLayerPreferences.onLayerSourceChanged.removeListener(handleLayerSourceChange);
|
|
248
|
+
});
|
|
249
|
+
}, [updateMapSources]);
|
|
250
|
+
// update when a different display style is loaded.
|
|
251
|
+
React.useEffect(() => {
|
|
252
|
+
const handleDisplayStyleChange = (vp) => {
|
|
253
|
+
loadMapLayerSettingsFromViewport(vp);
|
|
254
|
+
};
|
|
255
|
+
activeViewport?.onDisplayStyleChanged.addListener(handleDisplayStyleChange);
|
|
256
|
+
return () => {
|
|
257
|
+
activeViewport?.onDisplayStyleChanged.removeListener(handleDisplayStyleChange);
|
|
258
|
+
};
|
|
259
|
+
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
260
|
+
const handleOnMenuItemSelection = React.useCallback((action, mapLayerSettings) => {
|
|
261
|
+
if (!activeViewport || !activeViewport.displayStyle)
|
|
262
|
+
return;
|
|
263
|
+
const indexInDisplayStyle = activeViewport.displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);
|
|
264
|
+
if (indexInDisplayStyle < 0)
|
|
265
|
+
return;
|
|
266
|
+
switch (action) {
|
|
267
|
+
case "delete":
|
|
268
|
+
activeViewport.displayStyle.detachMapLayerByIndex(indexInDisplayStyle, mapLayerSettings.isOverlay);
|
|
269
|
+
break;
|
|
270
|
+
case "zoom-to-layer":
|
|
271
|
+
activeViewport.displayStyle.viewMapLayerRange(indexInDisplayStyle, mapLayerSettings.isOverlay, activeViewport).then((status) => {
|
|
272
|
+
if (!status) {
|
|
273
|
+
const msg = mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Messages.NoRangeDefined");
|
|
274
|
+
core_frontend_1.IModelApp.notifications.outputMessage(new core_frontend_1.NotifyMessageDetails(core_frontend_1.OutputMessagePriority.Error, `${msg} [${mapLayerSettings.name}]`));
|
|
275
|
+
}
|
|
276
|
+
}).catch((_error) => { });
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
activeViewport.invalidateRenderPlan();
|
|
280
|
+
// force UI to update
|
|
281
|
+
loadMapLayerSettingsFromViewport(activeViewport);
|
|
282
|
+
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
283
|
+
const handleLayerVisibilityChange = React.useCallback((mapLayerSettings) => {
|
|
284
|
+
if (activeViewport) {
|
|
285
|
+
const isVisible = !mapLayerSettings.visible;
|
|
286
|
+
const displayStyle = activeViewport.displayStyle;
|
|
287
|
+
const indexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);
|
|
288
|
+
if (-1 !== indexInDisplayStyle) {
|
|
289
|
+
// update the display style
|
|
290
|
+
displayStyle.changeMapLayerProps({ visible: isVisible }, indexInDisplayStyle, mapLayerSettings.isOverlay);
|
|
291
|
+
activeViewport.invalidateRenderPlan();
|
|
292
|
+
// force UI to update
|
|
293
|
+
loadMapLayerSettingsFromViewport(activeViewport);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
297
|
+
const handleMapLayersToggle = React.useCallback(() => {
|
|
298
|
+
if (activeViewport) {
|
|
299
|
+
const newState = !backgroundMapVisible;
|
|
300
|
+
activeViewport.viewFlags = activeViewport.viewFlags.with("backgroundMap", newState);
|
|
301
|
+
setBackgroundMapVisible(newState);
|
|
302
|
+
}
|
|
303
|
+
}, [backgroundMapVisible, setBackgroundMapVisible, activeViewport]);
|
|
304
|
+
const handleOnMapLayerDragEnd = React.useCallback((result /* , _provided: ResponderProvided*/) => {
|
|
305
|
+
const { destination, source } = result;
|
|
306
|
+
if (!destination) // dropped outside of list
|
|
307
|
+
return;
|
|
308
|
+
// item was not moved
|
|
309
|
+
if (destination.droppableId === source.droppableId && destination.index === source.index)
|
|
310
|
+
return;
|
|
311
|
+
let fromMapLayer;
|
|
312
|
+
if (source.droppableId === "overlayMapLayers" && overlayMapLayers)
|
|
313
|
+
fromMapLayer = overlayMapLayers[source.index];
|
|
314
|
+
else if (source.droppableId === "backgroundMapLayers" && backgroundMapLayers)
|
|
315
|
+
fromMapLayer = backgroundMapLayers[source.index];
|
|
316
|
+
if (!fromMapLayer || !activeViewport)
|
|
317
|
+
return;
|
|
318
|
+
const displayStyle = activeViewport.displayStyle;
|
|
319
|
+
let toMapLayer;
|
|
320
|
+
let toIndexInDisplayStyle = -1;
|
|
321
|
+
// If destination.index is undefined then the user dropped the map at the end of list of maps. To get the "actual" index in the style, look up index in style by name.
|
|
322
|
+
// We need to do this because the order of layers in UI are reversed so higher layers appear above lower layers.
|
|
323
|
+
if (undefined !== destination.index) {
|
|
324
|
+
if (destination.droppableId === "overlayMapLayers" && overlayMapLayers)
|
|
325
|
+
toMapLayer = overlayMapLayers[destination.index];
|
|
326
|
+
else if (destination.droppableId === "backgroundMapLayers" && backgroundMapLayers)
|
|
327
|
+
toMapLayer = backgroundMapLayers[destination.index];
|
|
328
|
+
if (toMapLayer)
|
|
329
|
+
toIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(toMapLayer.name, toMapLayer.source, toMapLayer.isOverlay);
|
|
330
|
+
}
|
|
331
|
+
const fromIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(fromMapLayer.name, fromMapLayer.source, fromMapLayer.isOverlay);
|
|
332
|
+
if (fromIndexInDisplayStyle < 0)
|
|
333
|
+
return;
|
|
334
|
+
if (destination.droppableId !== source.droppableId) {
|
|
335
|
+
// see if we moved from "overlayMapLayers" to "backgroundMapLayers" or vice-versa
|
|
336
|
+
const settings = activeViewport.displayStyle.mapLayerAtIndex(fromIndexInDisplayStyle, fromMapLayer.isOverlay);
|
|
337
|
+
if (settings) {
|
|
338
|
+
activeViewport.displayStyle.detachMapLayerByIndex(fromIndexInDisplayStyle, fromMapLayer.isOverlay);
|
|
339
|
+
// Manually reverse index when moved from one section to the other
|
|
340
|
+
if (fromMapLayer.isOverlay && backgroundMapLayers) {
|
|
341
|
+
toIndexInDisplayStyle = displayStyle.backgroundMapLayers.length - destination.index;
|
|
342
|
+
}
|
|
343
|
+
else if (!fromMapLayer.isOverlay && overlayMapLayers) {
|
|
344
|
+
toIndexInDisplayStyle = overlayMapLayers.length - destination.index;
|
|
345
|
+
}
|
|
346
|
+
activeViewport.displayStyle.attachMapLayer({ settings, isOverlay: !fromMapLayer.isOverlay, insertIndex: toIndexInDisplayStyle });
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
if (undefined === destination.index) {
|
|
351
|
+
displayStyle.moveMapLayerToBottom(fromIndexInDisplayStyle, destination.droppableId === "overlayMapLayers");
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
if (toMapLayer) {
|
|
355
|
+
if (toIndexInDisplayStyle !== -1)
|
|
356
|
+
displayStyle.moveMapLayerToIndex(fromIndexInDisplayStyle, toIndexInDisplayStyle, toMapLayer.isOverlay);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// apply display style change to view
|
|
361
|
+
activeViewport.invalidateRenderPlan();
|
|
362
|
+
// force UI to update
|
|
363
|
+
loadMapLayerSettingsFromViewport(activeViewport);
|
|
364
|
+
}, [loadMapLayerSettingsFromViewport, activeViewport, overlayMapLayers, backgroundMapLayers]);
|
|
365
|
+
const handleRefreshFromStyle = React.useCallback(() => {
|
|
366
|
+
if (activeViewport)
|
|
367
|
+
loadMapLayerSettingsFromViewport(activeViewport);
|
|
368
|
+
}, [activeViewport, loadMapLayerSettingsFromViewport]);
|
|
369
|
+
const [baseMapPanelLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Basemap.BaseMapPanelTitle"));
|
|
370
|
+
return (React.createElement(exports.SourceMapContext.Provider, { value: {
|
|
371
|
+
activeViewport,
|
|
372
|
+
loadingSources,
|
|
373
|
+
sources: mapSources ? mapSources : [],
|
|
374
|
+
bases: baseSources ? baseSources : [],
|
|
375
|
+
refreshFromStyle: handleRefreshFromStyle,
|
|
376
|
+
backgroundLayers: backgroundMapLayers,
|
|
377
|
+
overlayLayers: overlayMapLayers,
|
|
378
|
+
mapLayerOptions,
|
|
379
|
+
} },
|
|
380
|
+
React.createElement("div", { className: "map-manager-top-header" },
|
|
381
|
+
React.createElement("span", { className: "map-manager-header-label" }, baseMapPanelLabel),
|
|
382
|
+
React.createElement("div", { className: "map-manager-header-buttons-group" },
|
|
383
|
+
React.createElement(itwinui_react_1.ToggleSwitch, { className: "map-manager-toggle", checked: backgroundMapVisible, onChange: handleMapLayersToggle }),
|
|
384
|
+
React.createElement(MapLayerSettingsPopupButton_1.MapLayerSettingsPopupButton, { disabled: !backgroundMapVisible }))),
|
|
385
|
+
React.createElement("div", { className: "map-manager-container" },
|
|
386
|
+
React.createElement("div", { className: "map-manager-basemap" },
|
|
387
|
+
React.createElement(BasemapPanel_1.BasemapPanel, { disabled: !backgroundMapVisible })),
|
|
388
|
+
!hideExternalMapLayersSection &&
|
|
389
|
+
React.createElement(react_beautiful_dnd_1.DragDropContext, { onDragEnd: handleOnMapLayerDragEnd },
|
|
390
|
+
React.createElement("div", { className: "map-manager-layer-wrapper" },
|
|
391
|
+
React.createElement("div", { className: "map-manager-underlays" },
|
|
392
|
+
React.createElement("span", { className: "map-manager-underlays-label" }, underlaysLabel),
|
|
393
|
+
React.createElement(AttachLayerPopupButton_1.AttachLayerPopupButton, { disabled: !backgroundMapVisible, isOverlay: false })),
|
|
394
|
+
React.createElement(MapLayerDroppable_1.MapLayerDroppable, { disabled: !backgroundMapVisible, isOverlay: false, layersList: backgroundMapLayers, mapTypesOptions: props.mapLayerOptions?.mapTypeOptions, getContainerForClone: props.getContainerForClone, activeViewport: props.activeViewport, onMenuItemSelected: handleOnMenuItemSelection, onItemVisibilityToggleClicked: handleLayerVisibilityChange, onItemEdited: handleRefreshFromStyle })),
|
|
395
|
+
React.createElement("div", { className: "map-manager-layer-wrapper" },
|
|
396
|
+
React.createElement("div", { className: "map-manager-overlays" },
|
|
397
|
+
React.createElement("span", { className: "map-manager-overlays-label" }, overlaysLabel),
|
|
398
|
+
React.createElement(AttachLayerPopupButton_1.AttachLayerPopupButton, { disabled: !backgroundMapVisible, isOverlay: true })),
|
|
399
|
+
React.createElement(MapLayerDroppable_1.MapLayerDroppable, { disabled: !backgroundMapVisible, isOverlay: true, layersList: overlayMapLayers, mapTypesOptions: props.mapLayerOptions?.mapTypeOptions, getContainerForClone: props.getContainerForClone, activeViewport: props.activeViewport, onMenuItemSelected: handleOnMenuItemSelection, onItemVisibilityToggleClicked: handleLayerVisibilityChange, onItemEdited: handleRefreshFromStyle }))))));
|
|
400
|
+
}
|
|
401
|
+
exports.MapLayerManager = MapLayerManager;
|
|
402
402
|
//# sourceMappingURL=MapLayerManager.js.map
|