@itwin/appui-react 4.5.1 → 4.6.1
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 +20 -1
- package/lib/cjs/appui-react/accudraw/MenuButton.d.ts +2 -2
- package/lib/cjs/appui-react/accudraw/MenuButton.d.ts.map +1 -1
- package/lib/cjs/appui-react/accudraw/MenuButton.js.map +1 -1
- package/lib/cjs/appui-react/backstage/BackstageComposer.d.ts.map +1 -1
- package/lib/cjs/appui-react/backstage/BackstageComposer.js.map +1 -1
- package/lib/cjs/appui-react/childwindow/CopyStyles.d.ts.map +1 -1
- package/lib/cjs/appui-react/childwindow/CopyStyles.js +3 -1
- package/lib/cjs/appui-react/childwindow/CopyStyles.js.map +1 -1
- package/lib/cjs/appui-react/childwindow/InternalChildWindowManager.d.ts.map +1 -1
- package/lib/cjs/appui-react/childwindow/InternalChildWindowManager.js +2 -1
- package/lib/cjs/appui-react/childwindow/InternalChildWindowManager.js.map +1 -1
- package/lib/cjs/appui-react/cursor/CursorInformation.d.ts +6 -6
- package/lib/cjs/appui-react/cursor/CursorInformation.d.ts.map +1 -1
- package/lib/cjs/appui-react/cursor/CursorInformation.js.map +1 -1
- package/lib/cjs/appui-react/cursor/cursormenu/CursorMenu.d.ts.map +1 -1
- package/lib/cjs/appui-react/cursor/cursormenu/CursorMenu.js.map +1 -1
- package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopup.d.ts +4 -4
- package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopup.d.ts.map +1 -1
- package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopup.js.map +1 -1
- package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts +5 -5
- package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts.map +1 -1
- package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopupManager.js.map +1 -1
- package/lib/cjs/appui-react/cursor/cursorprompt/CursorPrompt.d.ts +2 -2
- package/lib/cjs/appui-react/cursor/cursorprompt/CursorPrompt.d.ts.map +1 -1
- package/lib/cjs/appui-react/cursor/cursorprompt/CursorPrompt.js.map +1 -1
- package/lib/cjs/appui-react/dialog/ContentDialog.js.map +1 -1
- package/lib/cjs/appui-react/feedback/ElementTooltip.d.ts +1 -2
- package/lib/cjs/appui-react/feedback/ElementTooltip.d.ts.map +1 -1
- package/lib/cjs/appui-react/feedback/ElementTooltip.js.map +1 -1
- package/lib/cjs/appui-react/frontstage/FrontstageDef.d.ts +22 -26
- package/lib/cjs/appui-react/frontstage/FrontstageDef.d.ts.map +1 -1
- package/lib/cjs/appui-react/frontstage/FrontstageDef.js +185 -254
- package/lib/cjs/appui-react/frontstage/FrontstageDef.js.map +1 -1
- package/lib/cjs/appui-react/frontstage/InternalFrontstageManager.d.ts +1 -7
- package/lib/cjs/appui-react/frontstage/InternalFrontstageManager.d.ts.map +1 -1
- package/lib/cjs/appui-react/frontstage/InternalFrontstageManager.js +0 -6
- package/lib/cjs/appui-react/frontstage/InternalFrontstageManager.js.map +1 -1
- package/lib/cjs/appui-react/hooks/useActiveIModelConnection.d.ts.map +1 -1
- package/lib/cjs/appui-react/hooks/useActiveIModelConnection.js.map +1 -1
- package/lib/cjs/appui-react/hooks/useActiveViewport.d.ts.map +1 -1
- package/lib/cjs/appui-react/hooks/useActiveViewport.js.map +1 -1
- package/lib/cjs/appui-react/keyboardshortcut/InternalKeyboardShortcut.d.ts.map +1 -1
- package/lib/cjs/appui-react/keyboardshortcut/InternalKeyboardShortcut.js.map +1 -1
- package/lib/cjs/appui-react/messages/MessageManager.d.ts +0 -1
- package/lib/cjs/appui-react/messages/MessageManager.d.ts.map +1 -1
- package/lib/cjs/appui-react/messages/MessageManager.js +1 -2
- package/lib/cjs/appui-react/messages/MessageManager.js.map +1 -1
- package/lib/cjs/appui-react/messages/Pointer.d.ts +1 -2
- package/lib/cjs/appui-react/messages/Pointer.d.ts.map +1 -1
- package/lib/cjs/appui-react/messages/Pointer.js +1 -1
- package/lib/cjs/appui-react/messages/Pointer.js.map +1 -1
- package/lib/cjs/appui-react/popup/PositionPopup.d.ts +2 -2
- package/lib/cjs/appui-react/popup/PositionPopup.d.ts.map +1 -1
- package/lib/cjs/appui-react/popup/PositionPopup.js.map +1 -1
- package/lib/cjs/appui-react/settings/ui/UiSettingsPage.js.map +1 -1
- package/lib/cjs/appui-react/stagepanels/StagePanelDef.d.ts +16 -20
- package/lib/cjs/appui-react/stagepanels/StagePanelDef.d.ts.map +1 -1
- package/lib/cjs/appui-react/stagepanels/StagePanelDef.js +80 -115
- package/lib/cjs/appui-react/stagepanels/StagePanelDef.js.map +1 -1
- package/lib/cjs/appui-react/statusfields/MessageCenter.d.ts.map +1 -1
- package/lib/cjs/appui-react/statusfields/MessageCenter.js +1 -2
- package/lib/cjs/appui-react/statusfields/MessageCenter.js.map +1 -1
- package/lib/cjs/appui-react/syncui/InternalSyncUiEventDispatcher.d.ts +36 -0
- package/lib/cjs/appui-react/syncui/InternalSyncUiEventDispatcher.d.ts.map +1 -0
- package/lib/cjs/appui-react/syncui/InternalSyncUiEventDispatcher.js +134 -0
- package/lib/cjs/appui-react/syncui/InternalSyncUiEventDispatcher.js.map +1 -0
- package/lib/cjs/appui-react/syncui/SyncUiEventDispatcher.d.ts +1 -1
- package/lib/cjs/appui-react/syncui/SyncUiEventDispatcher.d.ts.map +1 -1
- package/lib/cjs/appui-react/syncui/SyncUiEventDispatcher.js +2 -2
- package/lib/cjs/appui-react/syncui/SyncUiEventDispatcher.js.map +1 -1
- package/lib/cjs/appui-react/syncui/UiSyncEvent.d.ts +16 -0
- package/lib/cjs/appui-react/syncui/UiSyncEvent.d.ts.map +1 -0
- package/lib/cjs/appui-react/syncui/UiSyncEvent.js +18 -0
- package/lib/cjs/appui-react/syncui/UiSyncEvent.js.map +1 -0
- package/lib/cjs/appui-react/uistate/AppUiSettings.d.ts.map +1 -1
- package/lib/cjs/appui-react/uistate/AppUiSettings.js.map +1 -1
- package/lib/cjs/appui-react/uistate/useUiStateStorage.d.ts.map +1 -1
- package/lib/cjs/appui-react/uistate/useUiStateStorage.js.map +1 -1
- package/lib/cjs/appui-react/widget-panels/Frontstage.d.ts +7 -29
- package/lib/cjs/appui-react/widget-panels/Frontstage.d.ts.map +1 -1
- package/lib/cjs/appui-react/widget-panels/Frontstage.js +101 -434
- package/lib/cjs/appui-react/widget-panels/Frontstage.js.map +1 -1
- package/lib/cjs/appui-react/widget-panels/ToolSettings.d.ts.map +1 -1
- package/lib/cjs/appui-react/widget-panels/ToolSettings.js +16 -3
- package/lib/cjs/appui-react/widget-panels/ToolSettings.js.map +1 -1
- package/lib/cjs/appui-react/widgets/Widget.d.ts +10 -4
- package/lib/cjs/appui-react/widgets/Widget.d.ts.map +1 -1
- package/lib/cjs/appui-react/widgets/Widget.js.map +1 -1
- package/lib/cjs/appui-react/widgets/WidgetDef.d.ts +9 -29
- package/lib/cjs/appui-react/widgets/WidgetDef.d.ts.map +1 -1
- package/lib/cjs/appui-react/widgets/WidgetDef.js +89 -46
- package/lib/cjs/appui-react/widgets/WidgetDef.js.map +1 -1
- package/lib/cjs/appui-react.d.ts +1 -0
- package/lib/cjs/appui-react.d.ts.map +1 -1
- package/lib/cjs/appui-react.js +1 -0
- package/lib/cjs/appui-react.js.map +1 -1
- package/lib/esm/appui-react/accudraw/MenuButton.d.ts +2 -2
- package/lib/esm/appui-react/accudraw/MenuButton.d.ts.map +1 -1
- package/lib/esm/appui-react/accudraw/MenuButton.js.map +1 -1
- package/lib/esm/appui-react/backstage/BackstageComposer.d.ts.map +1 -1
- package/lib/esm/appui-react/backstage/BackstageComposer.js.map +1 -1
- package/lib/esm/appui-react/childwindow/CopyStyles.d.ts.map +1 -1
- package/lib/esm/appui-react/childwindow/CopyStyles.js +3 -1
- package/lib/esm/appui-react/childwindow/CopyStyles.js.map +1 -1
- package/lib/esm/appui-react/childwindow/InternalChildWindowManager.d.ts.map +1 -1
- package/lib/esm/appui-react/childwindow/InternalChildWindowManager.js +2 -1
- package/lib/esm/appui-react/childwindow/InternalChildWindowManager.js.map +1 -1
- package/lib/esm/appui-react/cursor/CursorInformation.d.ts +6 -6
- package/lib/esm/appui-react/cursor/CursorInformation.d.ts.map +1 -1
- package/lib/esm/appui-react/cursor/CursorInformation.js.map +1 -1
- package/lib/esm/appui-react/cursor/cursormenu/CursorMenu.d.ts.map +1 -1
- package/lib/esm/appui-react/cursor/cursormenu/CursorMenu.js.map +1 -1
- package/lib/esm/appui-react/cursor/cursorpopup/CursorPopup.d.ts +4 -4
- package/lib/esm/appui-react/cursor/cursorpopup/CursorPopup.d.ts.map +1 -1
- package/lib/esm/appui-react/cursor/cursorpopup/CursorPopup.js.map +1 -1
- package/lib/esm/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts +5 -5
- package/lib/esm/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts.map +1 -1
- package/lib/esm/appui-react/cursor/cursorpopup/CursorPopupManager.js.map +1 -1
- package/lib/esm/appui-react/cursor/cursorprompt/CursorPrompt.d.ts +2 -2
- package/lib/esm/appui-react/cursor/cursorprompt/CursorPrompt.d.ts.map +1 -1
- package/lib/esm/appui-react/cursor/cursorprompt/CursorPrompt.js.map +1 -1
- package/lib/esm/appui-react/dialog/ContentDialog.js.map +1 -1
- package/lib/esm/appui-react/feedback/ElementTooltip.d.ts +1 -2
- package/lib/esm/appui-react/feedback/ElementTooltip.d.ts.map +1 -1
- package/lib/esm/appui-react/feedback/ElementTooltip.js.map +1 -1
- package/lib/esm/appui-react/frontstage/FrontstageDef.d.ts +22 -26
- package/lib/esm/appui-react/frontstage/FrontstageDef.d.ts.map +1 -1
- package/lib/esm/appui-react/frontstage/FrontstageDef.js +189 -258
- package/lib/esm/appui-react/frontstage/FrontstageDef.js.map +1 -1
- package/lib/esm/appui-react/frontstage/InternalFrontstageManager.d.ts +1 -7
- package/lib/esm/appui-react/frontstage/InternalFrontstageManager.d.ts.map +1 -1
- package/lib/esm/appui-react/frontstage/InternalFrontstageManager.js +0 -6
- package/lib/esm/appui-react/frontstage/InternalFrontstageManager.js.map +1 -1
- package/lib/esm/appui-react/hooks/useActiveIModelConnection.d.ts.map +1 -1
- package/lib/esm/appui-react/hooks/useActiveIModelConnection.js.map +1 -1
- package/lib/esm/appui-react/hooks/useActiveViewport.d.ts.map +1 -1
- package/lib/esm/appui-react/hooks/useActiveViewport.js.map +1 -1
- package/lib/esm/appui-react/keyboardshortcut/InternalKeyboardShortcut.d.ts.map +1 -1
- package/lib/esm/appui-react/keyboardshortcut/InternalKeyboardShortcut.js.map +1 -1
- package/lib/esm/appui-react/messages/MessageManager.d.ts +0 -1
- package/lib/esm/appui-react/messages/MessageManager.d.ts.map +1 -1
- package/lib/esm/appui-react/messages/MessageManager.js +1 -2
- package/lib/esm/appui-react/messages/MessageManager.js.map +1 -1
- package/lib/esm/appui-react/messages/Pointer.d.ts +1 -2
- package/lib/esm/appui-react/messages/Pointer.d.ts.map +1 -1
- package/lib/esm/appui-react/messages/Pointer.js +1 -1
- package/lib/esm/appui-react/messages/Pointer.js.map +1 -1
- package/lib/esm/appui-react/popup/PositionPopup.d.ts +2 -2
- package/lib/esm/appui-react/popup/PositionPopup.d.ts.map +1 -1
- package/lib/esm/appui-react/popup/PositionPopup.js.map +1 -1
- package/lib/esm/appui-react/settings/ui/UiSettingsPage.js.map +1 -1
- package/lib/esm/appui-react/stagepanels/StagePanelDef.d.ts +16 -20
- package/lib/esm/appui-react/stagepanels/StagePanelDef.d.ts.map +1 -1
- package/lib/esm/appui-react/stagepanels/StagePanelDef.js +78 -114
- package/lib/esm/appui-react/stagepanels/StagePanelDef.js.map +1 -1
- package/lib/esm/appui-react/statusfields/MessageCenter.d.ts.map +1 -1
- package/lib/esm/appui-react/statusfields/MessageCenter.js +1 -2
- package/lib/esm/appui-react/statusfields/MessageCenter.js.map +1 -1
- package/lib/esm/appui-react/syncui/InternalSyncUiEventDispatcher.d.ts +36 -0
- package/lib/esm/appui-react/syncui/InternalSyncUiEventDispatcher.d.ts.map +1 -0
- package/lib/esm/appui-react/syncui/InternalSyncUiEventDispatcher.js +130 -0
- package/lib/esm/appui-react/syncui/InternalSyncUiEventDispatcher.js.map +1 -0
- package/lib/esm/appui-react/syncui/SyncUiEventDispatcher.d.ts +1 -1
- package/lib/esm/appui-react/syncui/SyncUiEventDispatcher.d.ts.map +1 -1
- package/lib/esm/appui-react/syncui/SyncUiEventDispatcher.js +2 -2
- package/lib/esm/appui-react/syncui/SyncUiEventDispatcher.js.map +1 -1
- package/lib/esm/appui-react/syncui/UiSyncEvent.d.ts +16 -0
- package/lib/esm/appui-react/syncui/UiSyncEvent.d.ts.map +1 -0
- package/lib/esm/appui-react/syncui/UiSyncEvent.js +14 -0
- package/lib/esm/appui-react/syncui/UiSyncEvent.js.map +1 -0
- package/lib/esm/appui-react/uistate/AppUiSettings.d.ts.map +1 -1
- package/lib/esm/appui-react/uistate/AppUiSettings.js.map +1 -1
- package/lib/esm/appui-react/uistate/useUiStateStorage.d.ts.map +1 -1
- package/lib/esm/appui-react/uistate/useUiStateStorage.js.map +1 -1
- package/lib/esm/appui-react/widget-panels/Frontstage.d.ts +7 -29
- package/lib/esm/appui-react/widget-panels/Frontstage.d.ts.map +1 -1
- package/lib/esm/appui-react/widget-panels/Frontstage.js +104 -433
- package/lib/esm/appui-react/widget-panels/Frontstage.js.map +1 -1
- package/lib/esm/appui-react/widget-panels/ToolSettings.d.ts.map +1 -1
- package/lib/esm/appui-react/widget-panels/ToolSettings.js +16 -3
- package/lib/esm/appui-react/widget-panels/ToolSettings.js.map +1 -1
- package/lib/esm/appui-react/widgets/Widget.d.ts +10 -4
- package/lib/esm/appui-react/widgets/Widget.d.ts.map +1 -1
- package/lib/esm/appui-react/widgets/Widget.js.map +1 -1
- package/lib/esm/appui-react/widgets/WidgetDef.d.ts +9 -29
- package/lib/esm/appui-react/widgets/WidgetDef.d.ts.map +1 -1
- package/lib/esm/appui-react/widgets/WidgetDef.js +89 -46
- package/lib/esm/appui-react/widgets/WidgetDef.js.map +1 -1
- package/lib/esm/appui-react.d.ts +1 -0
- package/lib/esm/appui-react.d.ts.map +1 -1
- package/lib/esm/appui-react.js +1 -0
- package/lib/esm/appui-react.js.map +1 -1
- package/package.json +10 -10
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @module Frontstage
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.useItemsManager = exports.useFrontstageManager = exports.getFrontstageStateSettingName = exports.FRONTSTAGE_SETTINGS_NAMESPACE = exports.useSaveFrontstageSettings = exports.useSavedFrontstageState = exports.
|
|
10
|
+
exports.useItemsManager = exports.useFrontstageManager = exports.getFrontstageStateSettingName = exports.FRONTSTAGE_SETTINGS_NAMESPACE = exports.useSaveFrontstageSettings = exports.useSavedFrontstageState = exports.expandWidget = exports.showWidget = exports.isPanelCollapsed = exports.packNineZoneState = exports.restoreNineZoneState = exports.initializeNineZoneState = exports.stateVersion = exports.initializePanel = exports.isFrontstageStateSettingResult = exports.addPanelWidgets = exports.getPanelSectionWidgets = exports.getWidgetId = exports.addMissingWidgets = exports.appendWidgets = exports.addWidgets = exports.useLabels = exports.ActiveFrontstageDefProvider = exports.WidgetPanelsFrontstage = exports.useNineZoneDispatch = exports.useUpdateNineZoneSize = exports.useLayoutStore = void 0;
|
|
11
11
|
// cSpell:ignore popout
|
|
12
12
|
require("./Frontstage.scss");
|
|
13
13
|
const immer_1 = require("immer");
|
|
@@ -17,6 +17,7 @@ const core_bentley_1 = require("@itwin/core-bentley");
|
|
|
17
17
|
const core_react_1 = require("@itwin/core-react");
|
|
18
18
|
const components_react_1 = require("@itwin/components-react");
|
|
19
19
|
const appui_layout_react_1 = require("@itwin/appui-layout-react");
|
|
20
|
+
const FrontstageDef_1 = require("../frontstage/FrontstageDef");
|
|
20
21
|
const StagePanelDef_1 = require("../stagepanels/StagePanelDef");
|
|
21
22
|
const UiFramework_1 = require("../UiFramework");
|
|
22
23
|
const useUiStateStorage_1 = require("../uistate/useUiStateStorage");
|
|
@@ -53,30 +54,19 @@ const widgetContent = React.createElement(Content_1.WidgetContent, null);
|
|
|
53
54
|
const toolSettingsContent = React.createElement(ToolSettings_1.ToolSettingsContent, null);
|
|
54
55
|
const widgetPanelsFrontstage = React.createElement(WidgetPanelsFrontstageComponent, null);
|
|
55
56
|
/** @internal */
|
|
56
|
-
function useLayoutStore() {
|
|
57
|
-
const
|
|
58
|
-
const [layout, setLayout] = React.useState(() => (0, appui_layout_react_1.createLayoutStore)(def?.nineZoneState));
|
|
59
|
-
React.useEffect(() => {
|
|
60
|
-
return UiFramework_1.UiFramework.frontstages.onFrontstageActivatedEvent.addListener((args) => {
|
|
61
|
-
(0, react_dom_1.unstable_batchedUpdates)(() => {
|
|
62
|
-
setDef(args.activatedFrontstageDef);
|
|
63
|
-
setLayout((0, appui_layout_react_1.createLayoutStore)(args.activatedFrontstageDef.nineZoneState));
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
}, []);
|
|
57
|
+
function useLayoutStore(frontstageDef) {
|
|
58
|
+
const layoutStore = React.useMemo(() => (0, appui_layout_react_1.createLayoutStore)(frontstageDef?.nineZoneState), [frontstageDef]);
|
|
67
59
|
React.useEffect(() => {
|
|
68
60
|
return InternalFrontstageManager_1.InternalFrontstageManager.onFrontstageNineZoneStateChangedEvent.addListener((args) => {
|
|
69
|
-
if (args.frontstageDef !==
|
|
70
|
-
def.isStageClosing ||
|
|
71
|
-
def.isApplicationClosing)
|
|
61
|
+
if (args.frontstageDef !== frontstageDef)
|
|
72
62
|
return;
|
|
73
63
|
(0, react_dom_1.unstable_batchedUpdates)(() => {
|
|
74
64
|
// https://github.com/pmndrs/zustand/blob/main/docs/guides/event-handler-in-pre-react-18.md
|
|
75
|
-
|
|
65
|
+
layoutStore.setState(args.state || defaultNineZone);
|
|
76
66
|
});
|
|
77
67
|
});
|
|
78
|
-
}, [
|
|
79
|
-
return
|
|
68
|
+
}, [frontstageDef, layoutStore]);
|
|
69
|
+
return layoutStore;
|
|
80
70
|
}
|
|
81
71
|
exports.useLayoutStore = useLayoutStore;
|
|
82
72
|
/** Update in-memory NineZoneState of newly activated frontstage with up to date size.
|
|
@@ -85,68 +75,32 @@ exports.useLayoutStore = useLayoutStore;
|
|
|
85
75
|
function useUpdateNineZoneSize(frontstageDef) {
|
|
86
76
|
React.useEffect(() => {
|
|
87
77
|
const size = InternalFrontstageManager_1.InternalFrontstageManager.nineZoneSize;
|
|
88
|
-
|
|
78
|
+
const state = frontstageDef.nineZoneState;
|
|
89
79
|
if (!size || !state)
|
|
90
80
|
return;
|
|
91
|
-
|
|
81
|
+
frontstageDef.dispatch({
|
|
92
82
|
type: "RESIZE",
|
|
93
83
|
size: {
|
|
94
84
|
height: size.height,
|
|
95
85
|
width: size.width,
|
|
96
86
|
},
|
|
97
|
-
}
|
|
98
|
-
frontstageDef.nineZoneState = state;
|
|
87
|
+
});
|
|
99
88
|
}, [frontstageDef]);
|
|
100
89
|
}
|
|
101
90
|
exports.useUpdateNineZoneSize = useUpdateNineZoneSize;
|
|
102
91
|
/** @internal */
|
|
103
|
-
function FrameworkStateReducer(state, action, frontstageDef) {
|
|
104
|
-
state = (0, appui_layout_react_1.NineZoneStateReducer)(state, action);
|
|
105
|
-
if (action.type === "RESIZE") {
|
|
106
|
-
state = (0, immer_1.default)(state, (draft) => {
|
|
107
|
-
for (const panelSide of appui_layout_react_1.panelSides) {
|
|
108
|
-
const panel = draft.panels[panelSide];
|
|
109
|
-
const location = toStagePanelLocation(panelSide);
|
|
110
|
-
const panelDef = frontstageDef.getStagePanelDef(location);
|
|
111
|
-
if (panelDef?.maxSizeSpec) {
|
|
112
|
-
panel.maxSize = getPanelMaxSize(panelDef.maxSizeSpec, panelSide, action.size);
|
|
113
|
-
if (panel.size) {
|
|
114
|
-
panel.size = Math.min(Math.max(panel.size, panel.minSize), panel.maxSize);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
return state;
|
|
121
|
-
}
|
|
122
|
-
exports.FrameworkStateReducer = FrameworkStateReducer;
|
|
123
|
-
/** @internal */
|
|
124
92
|
function useNineZoneDispatch(frontstageDef) {
|
|
125
|
-
|
|
126
|
-
if (action.type === "RESIZE") {
|
|
127
|
-
InternalFrontstageManager_1.InternalFrontstageManager.nineZoneSize = core_react_1.Size.create(action.size);
|
|
128
|
-
}
|
|
129
|
-
if (action.type === "WIDGET_TAB_POPOUT") {
|
|
130
|
-
const tabId = action.id;
|
|
131
|
-
frontstageDef.popoutWidget(tabId);
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const state = frontstageDef.nineZoneState;
|
|
135
|
-
if (!state)
|
|
136
|
-
return;
|
|
137
|
-
frontstageDef.nineZoneState = FrameworkStateReducer(state, action, frontstageDef);
|
|
138
|
-
}, [frontstageDef]);
|
|
139
|
-
return dispatch;
|
|
93
|
+
return React.useMemo(() => frontstageDef.dispatch, [frontstageDef]);
|
|
140
94
|
}
|
|
141
95
|
exports.useNineZoneDispatch = useNineZoneDispatch;
|
|
142
96
|
/** @internal */
|
|
143
97
|
function WidgetPanelsFrontstage() {
|
|
144
|
-
const
|
|
98
|
+
const frontstageDef = (0, FrontstageDef_1.useActiveFrontstageDef)();
|
|
99
|
+
const layout = useLayoutStore(frontstageDef);
|
|
145
100
|
React.useEffect(() => {
|
|
146
101
|
const triggerWidowCloseProcessing = () => {
|
|
147
102
|
frontstageDef && frontstageDef.setIsApplicationClosing(true);
|
|
148
103
|
};
|
|
149
|
-
frontstageDef && frontstageDef.setIsApplicationClosing(false);
|
|
150
104
|
window.addEventListener("unload", triggerWidowCloseProcessing);
|
|
151
105
|
return () => {
|
|
152
106
|
window.removeEventListener("unload", triggerWidowCloseProcessing);
|
|
@@ -208,16 +162,17 @@ function useLabels() {
|
|
|
208
162
|
exports.useLabels = useLabels;
|
|
209
163
|
function toTabArgs(widget) {
|
|
210
164
|
const label = getWidgetLabel(widget.label);
|
|
211
|
-
|
|
165
|
+
const args = {
|
|
212
166
|
allowedPanelTargets: widget.allowedPanelTargets?.map((location) => (0, StagePanelDef_1.toPanelSide)(location)),
|
|
213
167
|
hideWithUiWhenFloating: !!widget.hideWithUiWhenFloating,
|
|
214
168
|
canPopout: widget.canPopout,
|
|
215
169
|
iconSpec: widget.iconSpec,
|
|
216
|
-
|
|
170
|
+
isFloatingWidgetResizable: widget.isFloatingStateWindowResizable,
|
|
217
171
|
label,
|
|
218
172
|
preferredFloatingWidgetSize: widget.defaultFloatingSize,
|
|
219
173
|
preferredPanelWidgetSize: widget.preferredPanelSize,
|
|
220
174
|
};
|
|
175
|
+
return args;
|
|
221
176
|
}
|
|
222
177
|
/** @internal */
|
|
223
178
|
function addWidgets(state, widgets, side, widgetId) {
|
|
@@ -266,9 +221,15 @@ function appendWidgets(state, widgetDefs, location, section) {
|
|
|
266
221
|
preferredPanelWidgetSize,
|
|
267
222
|
userSized,
|
|
268
223
|
});
|
|
269
|
-
|
|
224
|
+
const savedTab = state.savedTabs.byId[widgetDef.id];
|
|
225
|
+
if (savedTab) {
|
|
226
|
+
state = (0, appui_layout_react_1.addRemovedTab)(state, widgetDef.id);
|
|
227
|
+
}
|
|
228
|
+
else if (widgetDef.isFloatingStateSupported &&
|
|
270
229
|
widgetDef.defaultState === WidgetState_1.WidgetState.Floating) {
|
|
271
|
-
const floatingContainerId = widgetDef.floatingContainerId
|
|
230
|
+
const floatingContainerId = widgetDef.floatingContainerId
|
|
231
|
+
? widgetDef.floatingContainerId
|
|
232
|
+
: (0, appui_layout_react_1.getUniqueId)();
|
|
272
233
|
const widgetContainerId = getWidgetId(location, section);
|
|
273
234
|
const home = {
|
|
274
235
|
side,
|
|
@@ -297,8 +258,6 @@ function appendWidgets(state, widgetDefs, location, section) {
|
|
|
297
258
|
bounds: containedBounds.toProps(),
|
|
298
259
|
home,
|
|
299
260
|
userSized,
|
|
300
|
-
}, {
|
|
301
|
-
isFloatingStateWindowResizable: widgetDef.isFloatingStateWindowResizable,
|
|
302
261
|
});
|
|
303
262
|
}
|
|
304
263
|
}
|
|
@@ -322,25 +281,30 @@ function appendWidgets(state, widgetDefs, location, section) {
|
|
|
322
281
|
}
|
|
323
282
|
}
|
|
324
283
|
}
|
|
284
|
+
if (widgetDef.defaultState === WidgetState_1.WidgetState.Hidden) {
|
|
285
|
+
state = (0, appui_layout_react_1.NineZoneStateReducer)(state, {
|
|
286
|
+
type: "WIDGET_TAB_HIDE",
|
|
287
|
+
id: widgetDef.id,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
325
290
|
}
|
|
326
291
|
return state;
|
|
327
292
|
}
|
|
328
293
|
exports.appendWidgets = appendWidgets;
|
|
329
|
-
function processPopoutWidgets(
|
|
330
|
-
//
|
|
331
|
-
if (
|
|
332
|
-
return
|
|
333
|
-
// istanbul ignore next - not unit testing electron case that reopens popout windows
|
|
334
|
-
if (initialState.popoutWidgets && core_bentley_1.ProcessDetector.isElectronAppFrontend) {
|
|
335
|
-
if (initialState.popoutWidgets.allIds.length &&
|
|
336
|
-
core_bentley_1.ProcessDetector.isElectronAppFrontend) {
|
|
337
|
-
for (const widgetContainerId of initialState.popoutWidgets.allIds) {
|
|
338
|
-
frontstageDef.openPopoutWidgetContainer(initialState, widgetContainerId);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
return initialState;
|
|
294
|
+
function processPopoutWidgets(state) {
|
|
295
|
+
// Electron reopens popout windows
|
|
296
|
+
if (core_bentley_1.ProcessDetector.isElectronAppFrontend) {
|
|
297
|
+
return state;
|
|
342
298
|
}
|
|
343
|
-
|
|
299
|
+
for (const popoutWidgetId of state.popoutWidgets.allIds) {
|
|
300
|
+
const widget = state.widgets[popoutWidgetId];
|
|
301
|
+
const id = widget.tabs[0];
|
|
302
|
+
state = (0, appui_layout_react_1.NineZoneStateReducer)(state, {
|
|
303
|
+
type: "WIDGET_TAB_FLOAT",
|
|
304
|
+
id,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
return state;
|
|
344
308
|
}
|
|
345
309
|
/** Adds frontstageDef widgets that are missing in NineZoneState.
|
|
346
310
|
* @internal
|
|
@@ -380,7 +344,10 @@ function hideWidgets(state, frontstageDef) {
|
|
|
380
344
|
if (!widgetDef)
|
|
381
345
|
continue;
|
|
382
346
|
if (widgetDef.defaultState === WidgetState_1.WidgetState.Hidden) {
|
|
383
|
-
state =
|
|
347
|
+
state = (0, appui_layout_react_1.NineZoneStateReducer)(state, {
|
|
348
|
+
type: "WIDGET_TAB_HIDE",
|
|
349
|
+
id: widgetDef.id,
|
|
350
|
+
});
|
|
384
351
|
}
|
|
385
352
|
}
|
|
386
353
|
return state;
|
|
@@ -396,26 +363,17 @@ function removeMissingWidgets(frontstageDef, state) {
|
|
|
396
363
|
const widgetDef = frontstageDef.findWidgetDef(tab.id);
|
|
397
364
|
if (widgetDef)
|
|
398
365
|
continue;
|
|
366
|
+
state = (0, appui_layout_react_1.NineZoneStateReducer)(state, {
|
|
367
|
+
type: "WIDGET_TAB_HIDE",
|
|
368
|
+
id: tab.id,
|
|
369
|
+
});
|
|
399
370
|
state = (0, appui_layout_react_1.removeTab)(state, tab.id);
|
|
400
371
|
}
|
|
401
372
|
return state;
|
|
402
373
|
}
|
|
403
|
-
exports.removeMissingWidgets = removeMissingWidgets;
|
|
404
374
|
function getWidgetLabel(label) {
|
|
405
375
|
return label === "" ? "Widget" : label;
|
|
406
376
|
}
|
|
407
|
-
function toStagePanelLocation(side) {
|
|
408
|
-
switch (side) {
|
|
409
|
-
case "bottom":
|
|
410
|
-
return StagePanelLocation_1.StagePanelLocation.Bottom;
|
|
411
|
-
case "left":
|
|
412
|
-
return StagePanelLocation_1.StagePanelLocation.Left;
|
|
413
|
-
case "right":
|
|
414
|
-
return StagePanelLocation_1.StagePanelLocation.Right;
|
|
415
|
-
case "top":
|
|
416
|
-
return StagePanelLocation_1.StagePanelLocation.Top;
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
377
|
/** @internal */
|
|
420
378
|
function getWidgetId(location, section) {
|
|
421
379
|
switch (location) {
|
|
@@ -470,37 +428,28 @@ function isFrontstageStateSettingResult(settingsResult) {
|
|
|
470
428
|
exports.isFrontstageStateSettingResult = isFrontstageStateSettingResult;
|
|
471
429
|
/** @internal */
|
|
472
430
|
function initializePanel(state, frontstageDef, location) {
|
|
473
|
-
const
|
|
431
|
+
const side = (0, StagePanelDef_1.toPanelSide)(location);
|
|
474
432
|
state = addPanelWidgets(state, frontstageDef, location);
|
|
475
433
|
const panelDef = frontstageDef.getStagePanelDef(location);
|
|
476
434
|
state = (0, immer_1.default)(state, (draft) => {
|
|
477
|
-
const panel = draft.panels[
|
|
478
|
-
panel.minSize = panelDef?.minSize ?? panel.minSize;
|
|
435
|
+
const panel = draft.panels[side];
|
|
436
|
+
panel.minSize = panelDef?.initialConfig?.minSize ?? panel.minSize;
|
|
479
437
|
panel.pinned = panelDef?.pinned ?? panel.pinned;
|
|
480
438
|
panel.resizable = panelDef?.resizable ?? panel.resizable;
|
|
481
|
-
|
|
482
|
-
panel.maxSize = getPanelMaxSize(panelDef.maxSizeSpec, panelSide, state.size);
|
|
483
|
-
}
|
|
484
|
-
const size = panelDef?.size;
|
|
485
|
-
panel.size =
|
|
486
|
-
size === undefined
|
|
487
|
-
? size
|
|
488
|
-
: Math.min(Math.max(size, panel.minSize), panel.maxSize);
|
|
439
|
+
panel.maxSize = panelDef?.initialConfig?.maxSize ?? panel.maxSize;
|
|
489
440
|
});
|
|
441
|
+
if (panelDef?.size !== undefined) {
|
|
442
|
+
state = (0, appui_layout_react_1.NineZoneStateReducer)(state, {
|
|
443
|
+
type: "PANEL_SET_SIZE",
|
|
444
|
+
side,
|
|
445
|
+
size: panelDef.size,
|
|
446
|
+
});
|
|
447
|
+
}
|
|
490
448
|
return state;
|
|
491
449
|
}
|
|
492
450
|
exports.initializePanel = initializePanel;
|
|
493
|
-
function getPanelMaxSize(maxSizeSpec, panel, nineZoneSize) {
|
|
494
|
-
if (typeof maxSizeSpec === "number") {
|
|
495
|
-
return maxSizeSpec;
|
|
496
|
-
}
|
|
497
|
-
const size = (0, appui_layout_react_1.isHorizontalPanelSide)(panel)
|
|
498
|
-
? nineZoneSize.height
|
|
499
|
-
: nineZoneSize.width;
|
|
500
|
-
return (maxSizeSpec.percentage / 100) * size;
|
|
501
|
-
}
|
|
502
451
|
/** @internal */
|
|
503
|
-
exports.stateVersion =
|
|
452
|
+
exports.stateVersion = 16; // this needs to be bumped when NineZoneState is changed (to recreate the layout).
|
|
504
453
|
/** @internal */
|
|
505
454
|
function initializeNineZoneState(frontstageDef) {
|
|
506
455
|
let nineZone = defaultNineZone;
|
|
@@ -538,7 +487,7 @@ function initializeNineZoneState(frontstageDef) {
|
|
|
538
487
|
nineZone = (0, appui_layout_react_1.addDockedToolSettings)(nineZone, toolSettingsTabId);
|
|
539
488
|
}
|
|
540
489
|
nineZone = hideWidgets(nineZone, frontstageDef);
|
|
541
|
-
nineZone = processPopoutWidgets(nineZone
|
|
490
|
+
nineZone = processPopoutWidgets(nineZone);
|
|
542
491
|
return nineZone;
|
|
543
492
|
}
|
|
544
493
|
exports.initializeNineZoneState = initializeNineZoneState;
|
|
@@ -548,23 +497,23 @@ exports.initializeNineZoneState = initializeNineZoneState;
|
|
|
548
497
|
* @internal
|
|
549
498
|
*/
|
|
550
499
|
function restoreNineZoneState(frontstageDef, saved) {
|
|
551
|
-
let
|
|
500
|
+
let state = {
|
|
552
501
|
...saved,
|
|
553
502
|
tabs: {},
|
|
554
503
|
};
|
|
555
504
|
for (const [, tab] of Object.entries(saved.tabs)) {
|
|
556
505
|
// Re-add the placeholder tab in order to correctly remove it from the state if WidgetDef is not found.
|
|
557
|
-
|
|
506
|
+
state = (0, appui_layout_react_1.addTab)(state, tab.id);
|
|
558
507
|
const widgetDef = frontstageDef.findWidgetDef(tab.id);
|
|
559
508
|
if (!widgetDef) {
|
|
560
509
|
core_bentley_1.Logger.logInfo(UiFramework_1.UiFramework.loggerCategory(restoreNineZoneState), "WidgetDef is not found for saved tab.", () => ({
|
|
561
510
|
frontstageId: frontstageDef.id,
|
|
562
511
|
tabId: tab.id,
|
|
563
512
|
}));
|
|
564
|
-
|
|
513
|
+
state = (0, appui_layout_react_1.removeTab)(state, tab.id);
|
|
565
514
|
continue;
|
|
566
515
|
}
|
|
567
|
-
|
|
516
|
+
state = (0, immer_1.default)(state, (draft) => {
|
|
568
517
|
draft.tabs[tab.id] = {
|
|
569
518
|
...tab,
|
|
570
519
|
...toTabArgs(widgetDef),
|
|
@@ -573,7 +522,7 @@ function restoreNineZoneState(frontstageDef, saved) {
|
|
|
573
522
|
};
|
|
574
523
|
});
|
|
575
524
|
}
|
|
576
|
-
|
|
525
|
+
state = (0, immer_1.default)(state, (draft) => {
|
|
577
526
|
// remove center panel section if one is found in left or right panels
|
|
578
527
|
const oldLeftMiddleIndex = saved.panels.left.widgets.findIndex((value) => value === "leftMiddle");
|
|
579
528
|
// istanbul ignore next
|
|
@@ -604,15 +553,18 @@ function restoreNineZoneState(frontstageDef, saved) {
|
|
|
604
553
|
if (InternalFrontstageManager_1.InternalFrontstageManager.nineZoneSize &&
|
|
605
554
|
(0 !== InternalFrontstageManager_1.InternalFrontstageManager.nineZoneSize.height ||
|
|
606
555
|
0 !== InternalFrontstageManager_1.InternalFrontstageManager.nineZoneSize.width)) {
|
|
607
|
-
|
|
556
|
+
state = (0, appui_layout_react_1.NineZoneStateReducer)(state, {
|
|
608
557
|
type: "RESIZE",
|
|
609
558
|
size: {
|
|
610
559
|
height: InternalFrontstageManager_1.InternalFrontstageManager.nineZoneSize.height,
|
|
611
560
|
width: InternalFrontstageManager_1.InternalFrontstageManager.nineZoneSize.width,
|
|
612
561
|
},
|
|
613
|
-
}
|
|
562
|
+
});
|
|
614
563
|
}
|
|
615
|
-
|
|
564
|
+
state = addMissingWidgets(frontstageDef, state);
|
|
565
|
+
state = hideWidgets(state, frontstageDef);
|
|
566
|
+
state = processPopoutWidgets(state);
|
|
567
|
+
return state;
|
|
616
568
|
}
|
|
617
569
|
exports.restoreNineZoneState = restoreNineZoneState;
|
|
618
570
|
/** Prepares NineZoneState to be saved.
|
|
@@ -637,222 +589,11 @@ function packNineZoneState(state) {
|
|
|
637
589
|
return packed;
|
|
638
590
|
}
|
|
639
591
|
exports.packNineZoneState = packNineZoneState;
|
|
640
|
-
// istanbul ignore next
|
|
641
|
-
function packSavedWidgets(frontstageDef) {
|
|
642
|
-
let savedWidgets = [];
|
|
643
|
-
for (const widgetDef of frontstageDef.widgetDefs) {
|
|
644
|
-
const id = widgetDef.id;
|
|
645
|
-
const initialWidget = {
|
|
646
|
-
id,
|
|
647
|
-
};
|
|
648
|
-
const widget = (0, immer_1.default)(initialWidget, (draft) => {
|
|
649
|
-
if (widgetDef.tabLocation) {
|
|
650
|
-
draft.tabLocation = { ...widgetDef.tabLocation };
|
|
651
|
-
}
|
|
652
|
-
if (widgetDef.popoutBounds) {
|
|
653
|
-
draft.popoutBounds = widgetDef.popoutBounds.toProps();
|
|
654
|
-
}
|
|
655
|
-
});
|
|
656
|
-
if (widget === initialWidget)
|
|
657
|
-
continue;
|
|
658
|
-
savedWidgets.push(widget);
|
|
659
|
-
}
|
|
660
|
-
// Add previously saved widgets.
|
|
661
|
-
const prevSavedWidgets = frontstageDef.savedWidgetDefs || [];
|
|
662
|
-
for (const prevWidget of prevSavedWidgets) {
|
|
663
|
-
if (savedWidgets.find((w) => w.id === prevWidget.id))
|
|
664
|
-
continue;
|
|
665
|
-
savedWidgets.push(prevWidget);
|
|
666
|
-
}
|
|
667
|
-
// Limit number of saved widgets.
|
|
668
|
-
const maxWidgets = 100;
|
|
669
|
-
if (savedWidgets.length > maxWidgets)
|
|
670
|
-
savedWidgets = savedWidgets.slice(0, maxWidgets);
|
|
671
|
-
return savedWidgets;
|
|
672
|
-
}
|
|
673
|
-
// istanbul ignore next
|
|
674
|
-
function restoreSavedWidgets(frontstage) {
|
|
675
|
-
const savedWidgets = frontstage.savedWidgetDefs || [];
|
|
676
|
-
for (const savedWidget of savedWidgets) {
|
|
677
|
-
const widgetId = savedWidget.id;
|
|
678
|
-
const widgetDef = frontstage.findWidgetDef(widgetId);
|
|
679
|
-
if (!widgetDef)
|
|
680
|
-
continue;
|
|
681
|
-
if (savedWidget.tabLocation) {
|
|
682
|
-
widgetDef.tabLocation = { ...savedWidget.tabLocation };
|
|
683
|
-
}
|
|
684
|
-
if (savedWidget.popoutBounds) {
|
|
685
|
-
widgetDef.popoutBounds = core_react_1.Rectangle.create(savedWidget.popoutBounds);
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
592
|
/** @internal */
|
|
690
593
|
function isPanelCollapsed(panelState) {
|
|
691
594
|
return panelState !== StagePanelDef_1.StagePanelState.Open;
|
|
692
595
|
}
|
|
693
596
|
exports.isPanelCollapsed = isPanelCollapsed;
|
|
694
|
-
function addHiddenWidget(state, widgetDef) {
|
|
695
|
-
const tabLocation = widgetDef.tabLocation || widgetDef.defaultTabLocation;
|
|
696
|
-
const tabId = widgetDef.id;
|
|
697
|
-
const { widgetId, tabIndex } = tabLocation;
|
|
698
|
-
if (widgetId in state.widgets) {
|
|
699
|
-
// Add to an existing widget (by widget id).
|
|
700
|
-
return (0, appui_layout_react_1.insertTabToWidget)(state, tabId, widgetId, tabIndex);
|
|
701
|
-
}
|
|
702
|
-
else if (tabLocation.floatingWidget) {
|
|
703
|
-
const floatingWidget = tabLocation.floatingWidget;
|
|
704
|
-
(0, core_bentley_1.assert)(widgetId === floatingWidget.id);
|
|
705
|
-
// Add to a new floating widget.
|
|
706
|
-
const nzBounds = core_react_1.Rectangle.createFromSize(state.size);
|
|
707
|
-
const bounds = core_react_1.Rectangle.create(floatingWidget.bounds).containIn(nzBounds);
|
|
708
|
-
return (0, appui_layout_react_1.addFloatingWidget)(state, floatingWidget.id, [tabId], {
|
|
709
|
-
...floatingWidget,
|
|
710
|
-
bounds: bounds.toProps(),
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
// Add to a panel section.
|
|
714
|
-
const panel = state.panels[tabLocation.side];
|
|
715
|
-
// Add to existing panel section.
|
|
716
|
-
if (panel.widgets.length >= panel.maxWidgetCount) {
|
|
717
|
-
const sectionIndex = Math.min(panel.maxWidgetCount - 1, tabLocation.widgetIndex);
|
|
718
|
-
const sectionId = panel.widgets[sectionIndex];
|
|
719
|
-
return (0, appui_layout_react_1.insertTabToWidget)(state, tabId, sectionId, tabLocation.tabIndex);
|
|
720
|
-
}
|
|
721
|
-
// Create a new panel section.
|
|
722
|
-
const newSectionId = (0, appui_layout_react_1.getUniqueId)();
|
|
723
|
-
return (0, appui_layout_react_1.insertPanelWidget)(state, panel.side, newSectionId, [tabId], tabLocation.widgetIndex);
|
|
724
|
-
}
|
|
725
|
-
/** @internal */
|
|
726
|
-
function setWidgetState(state, widgetDef, widgetState) {
|
|
727
|
-
if (widgetState === WidgetState_1.WidgetState.Hidden) {
|
|
728
|
-
return hideWidget(state, widgetDef);
|
|
729
|
-
}
|
|
730
|
-
else if (widgetState === WidgetState_1.WidgetState.Open) {
|
|
731
|
-
const id = widgetDef.id;
|
|
732
|
-
if (widgetDef.isToolSettings) {
|
|
733
|
-
if (!state.toolSettings && !widgetDef.tabLocation) {
|
|
734
|
-
state = (0, appui_layout_react_1.addDockedToolSettings)(state, id);
|
|
735
|
-
}
|
|
736
|
-
if (state.toolSettings?.type === "docked")
|
|
737
|
-
return state;
|
|
738
|
-
}
|
|
739
|
-
let location = (0, appui_layout_react_1.getTabLocation)(state, id);
|
|
740
|
-
if (!location) {
|
|
741
|
-
state = addHiddenWidget(state, widgetDef);
|
|
742
|
-
location = (0, appui_layout_react_1.getTabLocation)(state, id);
|
|
743
|
-
if (widgetDef.isToolSettings) {
|
|
744
|
-
state = (0, appui_layout_react_1.addWidgetToolSettings)(state, id);
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
return (0, immer_1.default)(state, (draft) => {
|
|
748
|
-
(0, core_bentley_1.assert)(!!location);
|
|
749
|
-
const widget = draft.widgets[location.widgetId];
|
|
750
|
-
widget.minimized = false;
|
|
751
|
-
widget.activeTabId = id;
|
|
752
|
-
if ((0, appui_layout_react_1.isFloatingTabLocation)(location)) {
|
|
753
|
-
const floatingWidget = draft.floatingWidgets.byId[location.floatingWidgetId];
|
|
754
|
-
floatingWidget.hidden = false;
|
|
755
|
-
// istanbul ignore else
|
|
756
|
-
}
|
|
757
|
-
else if ((0, appui_layout_react_1.isPanelTabLocation)(location)) {
|
|
758
|
-
const panel = draft.panels[location.side];
|
|
759
|
-
panel.collapsed = false;
|
|
760
|
-
if (undefined === panel.size || 0 === panel.size) {
|
|
761
|
-
// istanbul ignore next
|
|
762
|
-
panel.size = panel.minSize ?? 200;
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
});
|
|
766
|
-
}
|
|
767
|
-
else if (widgetState === WidgetState_1.WidgetState.Closed) {
|
|
768
|
-
const id = widgetDef.id;
|
|
769
|
-
if (widgetDef.isToolSettings && state.toolSettings?.type !== "widget") {
|
|
770
|
-
return state;
|
|
771
|
-
}
|
|
772
|
-
let location = (0, appui_layout_react_1.getTabLocation)(state, id);
|
|
773
|
-
if (!location) {
|
|
774
|
-
state = addHiddenWidget(state, widgetDef);
|
|
775
|
-
location = (0, appui_layout_react_1.getTabLocation)(state, id);
|
|
776
|
-
}
|
|
777
|
-
// TODO: should change activeTabId of a widget with multiple tabs.
|
|
778
|
-
return (0, immer_1.default)(state, (draft) => {
|
|
779
|
-
(0, core_bentley_1.assert)(!!location);
|
|
780
|
-
const widget = draft.widgets[location.widgetId];
|
|
781
|
-
if ((0, appui_layout_react_1.isFloatingTabLocation)(location)) {
|
|
782
|
-
if (id === widget.activeTabId) {
|
|
783
|
-
widget.minimized = true;
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
});
|
|
787
|
-
}
|
|
788
|
-
else if (widgetState === WidgetState_1.WidgetState.Floating) {
|
|
789
|
-
const id = widgetDef.id;
|
|
790
|
-
let location = (0, appui_layout_react_1.getTabLocation)(state, id);
|
|
791
|
-
if (!location) {
|
|
792
|
-
state = addHiddenWidget(state, widgetDef);
|
|
793
|
-
location = (0, appui_layout_react_1.getTabLocation)(state, id);
|
|
794
|
-
}
|
|
795
|
-
(0, core_bentley_1.assert)(!!location);
|
|
796
|
-
if ((0, appui_layout_react_1.isFloatingTabLocation)(location))
|
|
797
|
-
return state;
|
|
798
|
-
// Widget is not floating.
|
|
799
|
-
state = (0, appui_layout_react_1.removeTabFromWidget)(state, id);
|
|
800
|
-
const bounds = widgetDef.tabLocation?.floatingWidget?.bounds;
|
|
801
|
-
state = (0, appui_layout_react_1.addFloatingWidget)(state, (0, appui_layout_react_1.getUniqueId)(), [id], { bounds });
|
|
802
|
-
if (widgetDef.isToolSettings) {
|
|
803
|
-
if (state.toolSettings?.type === "docked") {
|
|
804
|
-
state = (0, appui_layout_react_1.removeToolSettings)(state);
|
|
805
|
-
}
|
|
806
|
-
if (!state.toolSettings) {
|
|
807
|
-
state = (0, appui_layout_react_1.addWidgetToolSettings)(state, id);
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
return state;
|
|
812
|
-
}
|
|
813
|
-
exports.setWidgetState = setWidgetState;
|
|
814
|
-
/** Stores widget location and hides it in the UI. */
|
|
815
|
-
function hideWidget(state, widgetDef) {
|
|
816
|
-
const toolSettingsTabId = state.toolSettings?.tabId;
|
|
817
|
-
if (widgetDef.id === toolSettingsTabId) {
|
|
818
|
-
widgetDef.tabLocation = undefined;
|
|
819
|
-
state = (0, immer_1.default)(state, (draft) => {
|
|
820
|
-
draft.toolSettings = undefined;
|
|
821
|
-
});
|
|
822
|
-
if (state.toolSettings?.type === "docked")
|
|
823
|
-
return state;
|
|
824
|
-
}
|
|
825
|
-
const location = (0, appui_layout_react_1.getTabLocation)(state, widgetDef.id);
|
|
826
|
-
if (!location)
|
|
827
|
-
return state;
|
|
828
|
-
// istanbul ignore else
|
|
829
|
-
if ((0, appui_layout_react_1.isFloatingTabLocation)(location)) {
|
|
830
|
-
const floatingWidget = state.floatingWidgets.byId[location.widgetId];
|
|
831
|
-
widgetDef.setFloatingContainerId(location.floatingWidgetId);
|
|
832
|
-
widgetDef.tabLocation = {
|
|
833
|
-
side: floatingWidget.home.side,
|
|
834
|
-
tabIndex: floatingWidget.home.widgetIndex,
|
|
835
|
-
widgetId: floatingWidget.id,
|
|
836
|
-
widgetIndex: floatingWidget.home.widgetIndex,
|
|
837
|
-
floatingWidget,
|
|
838
|
-
};
|
|
839
|
-
}
|
|
840
|
-
else if (!(0, appui_layout_react_1.isPopoutTabLocation)(location)) {
|
|
841
|
-
const widgetId = location.widgetId;
|
|
842
|
-
const side = (0, appui_layout_react_1.isPanelTabLocation)(location) ? location.side : "left";
|
|
843
|
-
const widgetIndex = (0, appui_layout_react_1.isPanelTabLocation)(location)
|
|
844
|
-
? state.panels[side].widgets.indexOf(widgetId)
|
|
845
|
-
: 0;
|
|
846
|
-
const tabIndex = state.widgets[location.widgetId].tabs.indexOf(widgetDef.id);
|
|
847
|
-
widgetDef.tabLocation = {
|
|
848
|
-
side,
|
|
849
|
-
tabIndex,
|
|
850
|
-
widgetId,
|
|
851
|
-
widgetIndex,
|
|
852
|
-
};
|
|
853
|
-
}
|
|
854
|
-
return (0, appui_layout_react_1.removeTabFromWidget)(state, widgetDef.id);
|
|
855
|
-
}
|
|
856
597
|
/** @internal */
|
|
857
598
|
function showWidget(state, id) {
|
|
858
599
|
const location = (0, appui_layout_react_1.getTabLocation)(state, id);
|
|
@@ -892,16 +633,6 @@ function expandWidget(state, id) {
|
|
|
892
633
|
}
|
|
893
634
|
exports.expandWidget = expandWidget;
|
|
894
635
|
/** @internal */
|
|
895
|
-
function setWidgetLabel(state, id, label) {
|
|
896
|
-
if (!(id in state.tabs))
|
|
897
|
-
return state;
|
|
898
|
-
return (0, immer_1.default)(state, (draft) => {
|
|
899
|
-
const tab = draft.tabs[id];
|
|
900
|
-
tab.label = label;
|
|
901
|
-
});
|
|
902
|
-
}
|
|
903
|
-
exports.setWidgetLabel = setWidgetLabel;
|
|
904
|
-
/** @internal */
|
|
905
636
|
function useSavedFrontstageState(frontstageDef) {
|
|
906
637
|
const uiStateStorage = (0, useUiStateStorage_1.useUiStateStorageHandler)();
|
|
907
638
|
const uiStateStorageRef = React.useRef(uiStateStorage);
|
|
@@ -918,7 +649,7 @@ function useSavedFrontstageState(frontstageDef) {
|
|
|
918
649
|
React.useEffect(() => {
|
|
919
650
|
async function fetchFrontstageState() {
|
|
920
651
|
if (frontstageDef.nineZoneState) {
|
|
921
|
-
frontstageDef.nineZoneState = processPopoutWidgets(frontstageDef.nineZoneState
|
|
652
|
+
frontstageDef.nineZoneState = processPopoutWidgets(frontstageDef.nineZoneState);
|
|
922
653
|
return;
|
|
923
654
|
}
|
|
924
655
|
const id = frontstageDef.id;
|
|
@@ -930,13 +661,7 @@ function useSavedFrontstageState(frontstageDef) {
|
|
|
930
661
|
const setting = settingResult.setting;
|
|
931
662
|
if (setting.version === version &&
|
|
932
663
|
setting.stateVersion === exports.stateVersion) {
|
|
933
|
-
|
|
934
|
-
frontstageDef.savedWidgetDefs = setting.widgets;
|
|
935
|
-
restoreSavedWidgets(frontstageDef);
|
|
936
|
-
let state = addMissingWidgets(frontstageDef, restored);
|
|
937
|
-
state = hideWidgets(state, frontstageDef);
|
|
938
|
-
state = processPopoutWidgets(state, frontstageDef);
|
|
939
|
-
frontstageDef.nineZoneState = state;
|
|
664
|
+
frontstageDef.nineZoneState = restoreNineZoneState(frontstageDef, setting.nineZone);
|
|
940
665
|
return;
|
|
941
666
|
}
|
|
942
667
|
}
|
|
@@ -952,14 +677,11 @@ function useSaveFrontstageSettings(frontstageDef, store) {
|
|
|
952
677
|
const saveSetting = React.useMemo(() => {
|
|
953
678
|
const debounced = debounce(async (frontstage, state) => {
|
|
954
679
|
const id = frontstage.id;
|
|
955
|
-
const widgets = packSavedWidgets(frontstage);
|
|
956
|
-
frontstage.savedWidgetDefs = widgets;
|
|
957
680
|
const setting = {
|
|
958
681
|
id,
|
|
959
682
|
version: frontstage.version,
|
|
960
683
|
stateVersion: exports.stateVersion,
|
|
961
684
|
nineZone: packNineZoneState(state),
|
|
962
|
-
widgets,
|
|
963
685
|
};
|
|
964
686
|
await uiSettingsStorage.saveSetting(exports.FRONTSTAGE_SETTINGS_NAMESPACE, getFrontstageStateSettingName(id), setting);
|
|
965
687
|
}, 1000);
|
|
@@ -1009,49 +731,11 @@ function debounce(func, duration) {
|
|
|
1009
731
|
};
|
|
1010
732
|
return debounced;
|
|
1011
733
|
}
|
|
1012
|
-
const createListener = (frontstageDef, listener) => {
|
|
1013
|
-
return (...args) => {
|
|
1014
|
-
if (!frontstageDef.nineZoneState)
|
|
1015
|
-
return;
|
|
1016
|
-
listener(...args);
|
|
1017
|
-
};
|
|
1018
|
-
};
|
|
1019
734
|
/** @internal */
|
|
1020
735
|
function useFrontstageManager(frontstageDef, useToolAsToolSettingsLabel) {
|
|
1021
|
-
React.useEffect(() => {
|
|
1022
|
-
return UiFramework_1.UiFramework.frontstages.onWidgetStateChangedEvent.addListener(({ widgetDef, widgetState }) => {
|
|
1023
|
-
if (!frontstageDef.nineZoneState)
|
|
1024
|
-
return;
|
|
1025
|
-
frontstageDef.nineZoneState = setWidgetState(frontstageDef.nineZoneState, widgetDef, widgetState);
|
|
1026
|
-
});
|
|
1027
|
-
}, [frontstageDef]);
|
|
1028
|
-
React.useEffect(() => {
|
|
1029
|
-
const listener = createListener(frontstageDef, ({ widgetDef }) => {
|
|
1030
|
-
(0, core_bentley_1.assert)(!!frontstageDef.nineZoneState);
|
|
1031
|
-
const nineZoneState = setWidgetState(frontstageDef.nineZoneState, widgetDef, WidgetState_1.WidgetState.Open);
|
|
1032
|
-
frontstageDef.nineZoneState = showWidget(nineZoneState, widgetDef.id);
|
|
1033
|
-
});
|
|
1034
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onWidgetShowEvent.addListener(listener);
|
|
1035
|
-
return () => {
|
|
1036
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onWidgetShowEvent.removeListener(listener);
|
|
1037
|
-
};
|
|
1038
|
-
}, [frontstageDef]);
|
|
1039
|
-
React.useEffect(() => {
|
|
1040
|
-
const listener = createListener(frontstageDef, ({ widgetDef }) => {
|
|
1041
|
-
(0, core_bentley_1.assert)(!!frontstageDef.nineZoneState);
|
|
1042
|
-
let nineZoneState = setWidgetState(frontstageDef.nineZoneState, widgetDef, WidgetState_1.WidgetState.Open);
|
|
1043
|
-
nineZoneState = showWidget(nineZoneState, widgetDef.id);
|
|
1044
|
-
nineZoneState = expandWidget(nineZoneState, widgetDef.id);
|
|
1045
|
-
frontstageDef.nineZoneState = nineZoneState;
|
|
1046
|
-
});
|
|
1047
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onWidgetExpandEvent.addListener(listener);
|
|
1048
|
-
return () => {
|
|
1049
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onWidgetExpandEvent.removeListener(listener);
|
|
1050
|
-
};
|
|
1051
|
-
}, [frontstageDef]);
|
|
1052
736
|
const uiSettingsStorage = (0, useUiStateStorage_1.useUiStateStorageHandler)();
|
|
1053
737
|
React.useEffect(() => {
|
|
1054
|
-
|
|
738
|
+
return InternalFrontstageManager_1.InternalFrontstageManager.onFrontstageRestoreLayoutEvent.addListener((args) => {
|
|
1055
739
|
// TODO: track restoring frontstages to support workflows: i.e. prevent loading frontstage OR saving layout when delete is pending
|
|
1056
740
|
void uiSettingsStorage.deleteSetting(exports.FRONTSTAGE_SETTINGS_NAMESPACE, getFrontstageStateSettingName(args.frontstageDef.id));
|
|
1057
741
|
if (frontstageDef.id === args.frontstageDef.id) {
|
|
@@ -1061,52 +745,36 @@ function useFrontstageManager(frontstageDef, useToolAsToolSettingsLabel) {
|
|
|
1061
745
|
else {
|
|
1062
746
|
args.frontstageDef.nineZoneState = undefined;
|
|
1063
747
|
}
|
|
1064
|
-
};
|
|
1065
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onFrontstageRestoreLayoutEvent.addListener(listener);
|
|
1066
|
-
return () => {
|
|
1067
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onFrontstageRestoreLayoutEvent.removeListener(listener);
|
|
1068
|
-
};
|
|
1069
|
-
}, [uiSettingsStorage, frontstageDef]);
|
|
1070
|
-
React.useEffect(() => {
|
|
1071
|
-
const listener = createListener(frontstageDef, ({ widgetDef }) => {
|
|
1072
|
-
(0, core_bentley_1.assert)(!!frontstageDef.nineZoneState);
|
|
1073
|
-
const label = widgetDef.label;
|
|
1074
|
-
frontstageDef.nineZoneState = setWidgetLabel(frontstageDef.nineZoneState, widgetDef.id, label);
|
|
1075
748
|
});
|
|
1076
|
-
|
|
1077
|
-
return () => {
|
|
1078
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onWidgetLabelChangedEvent.removeListener(listener);
|
|
1079
|
-
};
|
|
1080
|
-
}, [frontstageDef]);
|
|
749
|
+
}, [uiSettingsStorage, frontstageDef]);
|
|
1081
750
|
const defaultLabel = React.useMemo(() => UiFramework_1.UiFramework.translate("widget.labels.toolSettings"), []);
|
|
1082
751
|
React.useEffect(() => {
|
|
1083
|
-
const updateLabel =
|
|
752
|
+
const updateLabel = () => {
|
|
753
|
+
const state = frontstageDef.nineZoneState;
|
|
754
|
+
if (!state)
|
|
755
|
+
return;
|
|
756
|
+
const toolSettingsTabId = state.toolSettings?.tabId;
|
|
757
|
+
if (!toolSettingsTabId)
|
|
758
|
+
return;
|
|
1084
759
|
const toolId = UiFramework_1.UiFramework.frontstages.activeToolId;
|
|
1085
|
-
(0, core_bentley_1.assert)(!!frontstageDef.nineZoneState);
|
|
1086
760
|
const label = useToolAsToolSettingsLabel
|
|
1087
761
|
? core_frontend_1.IModelApp.tools.find(toolId)?.flyover || defaultLabel
|
|
1088
762
|
: defaultLabel;
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
763
|
+
frontstageDef.dispatch({
|
|
764
|
+
type: "WIDGET_TAB_SET_LABEL",
|
|
765
|
+
id: toolSettingsTabId,
|
|
766
|
+
label,
|
|
767
|
+
});
|
|
768
|
+
};
|
|
1094
769
|
// Whenever the frontstageDef or the useTool... changes, keep the label up to date.
|
|
1095
770
|
updateLabel();
|
|
771
|
+
const removeListenerFuncs = [];
|
|
1096
772
|
// If useTool... is true, listen for events to keep up the label up to date.
|
|
1097
773
|
if (useToolAsToolSettingsLabel) {
|
|
1098
|
-
UiFramework_1.UiFramework.frontstages.onFrontstageReadyEvent.addListener(updateLabel);
|
|
1099
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onFrontstageRestoreLayoutEvent.addListener(updateLabel);
|
|
1100
|
-
UiFramework_1.UiFramework.frontstages.onToolActivatedEvent.addListener(updateLabel);
|
|
1101
|
-
UiFramework_1.UiFramework.frontstages.onToolSettingsReloadEvent.addListener(updateLabel);
|
|
774
|
+
removeListenerFuncs.push(UiFramework_1.UiFramework.frontstages.onFrontstageReadyEvent.addListener(updateLabel), InternalFrontstageManager_1.InternalFrontstageManager.onFrontstageRestoreLayoutEvent.addListener(updateLabel), UiFramework_1.UiFramework.frontstages.onToolActivatedEvent.addListener(updateLabel), UiFramework_1.UiFramework.frontstages.onToolSettingsReloadEvent.addListener(updateLabel));
|
|
1102
775
|
}
|
|
1103
776
|
return () => {
|
|
1104
|
-
|
|
1105
|
-
UiFramework_1.UiFramework.frontstages.onFrontstageReadyEvent.removeListener(updateLabel);
|
|
1106
|
-
InternalFrontstageManager_1.InternalFrontstageManager.onFrontstageRestoreLayoutEvent.removeListener(updateLabel);
|
|
1107
|
-
UiFramework_1.UiFramework.frontstages.onToolActivatedEvent.removeListener(updateLabel);
|
|
1108
|
-
UiFramework_1.UiFramework.frontstages.onToolSettingsReloadEvent.removeListener(updateLabel);
|
|
1109
|
-
}
|
|
777
|
+
removeListenerFuncs.forEach((removeListener) => removeListener());
|
|
1110
778
|
};
|
|
1111
779
|
}, [frontstageDef, useToolAsToolSettingsLabel, defaultLabel]);
|
|
1112
780
|
}
|
|
@@ -1117,23 +785,22 @@ function useItemsManager(frontstageDef) {
|
|
|
1117
785
|
const refreshNineZoneState = (def) => {
|
|
1118
786
|
// Fired for both registered/unregistered. Update definitions and remove/add missing widgets.
|
|
1119
787
|
def.updateWidgetDefs();
|
|
1120
|
-
restoreSavedWidgets(def);
|
|
1121
788
|
let state = def.nineZoneState;
|
|
1122
789
|
if (!state)
|
|
1123
790
|
return;
|
|
1124
791
|
state = addMissingWidgets(def, state);
|
|
1125
792
|
state = removeMissingWidgets(def, state);
|
|
1126
|
-
state = hideWidgets(state, def); // TODO: should only apply to widgets provided by registered provider in onUiProviderRegisteredEvent.
|
|
1127
793
|
def.nineZoneState = state;
|
|
1128
794
|
};
|
|
1129
795
|
React.useEffect(() => {
|
|
1130
|
-
const remove = UiItemsManager_1.UiItemsManager.onUiProviderRegisteredEvent.addListener(() => {
|
|
1131
|
-
refreshNineZoneState(frontstageDef);
|
|
1132
|
-
});
|
|
1133
796
|
// Need to refresh anytime frontstageDef changes because uiItemsProvider may have added something to
|
|
1134
797
|
// another stage before it was possibly unloaded in this stage.
|
|
1135
798
|
refreshNineZoneState(frontstageDef);
|
|
1136
|
-
|
|
799
|
+
}, [frontstageDef]);
|
|
800
|
+
React.useEffect(() => {
|
|
801
|
+
return UiItemsManager_1.UiItemsManager.onUiProviderRegisteredEvent.addListener(() => {
|
|
802
|
+
refreshNineZoneState(frontstageDef);
|
|
803
|
+
});
|
|
1137
804
|
}, [frontstageDef]);
|
|
1138
805
|
}
|
|
1139
806
|
exports.useItemsManager = useItemsManager;
|