@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.
Files changed (194) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/lib/cjs/appui-react/accudraw/MenuButton.d.ts +2 -2
  3. package/lib/cjs/appui-react/accudraw/MenuButton.d.ts.map +1 -1
  4. package/lib/cjs/appui-react/accudraw/MenuButton.js.map +1 -1
  5. package/lib/cjs/appui-react/backstage/BackstageComposer.d.ts.map +1 -1
  6. package/lib/cjs/appui-react/backstage/BackstageComposer.js.map +1 -1
  7. package/lib/cjs/appui-react/childwindow/CopyStyles.d.ts.map +1 -1
  8. package/lib/cjs/appui-react/childwindow/CopyStyles.js +3 -1
  9. package/lib/cjs/appui-react/childwindow/CopyStyles.js.map +1 -1
  10. package/lib/cjs/appui-react/childwindow/InternalChildWindowManager.d.ts.map +1 -1
  11. package/lib/cjs/appui-react/childwindow/InternalChildWindowManager.js +2 -1
  12. package/lib/cjs/appui-react/childwindow/InternalChildWindowManager.js.map +1 -1
  13. package/lib/cjs/appui-react/cursor/CursorInformation.d.ts +6 -6
  14. package/lib/cjs/appui-react/cursor/CursorInformation.d.ts.map +1 -1
  15. package/lib/cjs/appui-react/cursor/CursorInformation.js.map +1 -1
  16. package/lib/cjs/appui-react/cursor/cursormenu/CursorMenu.d.ts.map +1 -1
  17. package/lib/cjs/appui-react/cursor/cursormenu/CursorMenu.js.map +1 -1
  18. package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopup.d.ts +4 -4
  19. package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopup.d.ts.map +1 -1
  20. package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopup.js.map +1 -1
  21. package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts +5 -5
  22. package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts.map +1 -1
  23. package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopupManager.js.map +1 -1
  24. package/lib/cjs/appui-react/cursor/cursorprompt/CursorPrompt.d.ts +2 -2
  25. package/lib/cjs/appui-react/cursor/cursorprompt/CursorPrompt.d.ts.map +1 -1
  26. package/lib/cjs/appui-react/cursor/cursorprompt/CursorPrompt.js.map +1 -1
  27. package/lib/cjs/appui-react/dialog/ContentDialog.js.map +1 -1
  28. package/lib/cjs/appui-react/feedback/ElementTooltip.d.ts +1 -2
  29. package/lib/cjs/appui-react/feedback/ElementTooltip.d.ts.map +1 -1
  30. package/lib/cjs/appui-react/feedback/ElementTooltip.js.map +1 -1
  31. package/lib/cjs/appui-react/frontstage/FrontstageDef.d.ts +22 -26
  32. package/lib/cjs/appui-react/frontstage/FrontstageDef.d.ts.map +1 -1
  33. package/lib/cjs/appui-react/frontstage/FrontstageDef.js +185 -254
  34. package/lib/cjs/appui-react/frontstage/FrontstageDef.js.map +1 -1
  35. package/lib/cjs/appui-react/frontstage/InternalFrontstageManager.d.ts +1 -7
  36. package/lib/cjs/appui-react/frontstage/InternalFrontstageManager.d.ts.map +1 -1
  37. package/lib/cjs/appui-react/frontstage/InternalFrontstageManager.js +0 -6
  38. package/lib/cjs/appui-react/frontstage/InternalFrontstageManager.js.map +1 -1
  39. package/lib/cjs/appui-react/hooks/useActiveIModelConnection.d.ts.map +1 -1
  40. package/lib/cjs/appui-react/hooks/useActiveIModelConnection.js.map +1 -1
  41. package/lib/cjs/appui-react/hooks/useActiveViewport.d.ts.map +1 -1
  42. package/lib/cjs/appui-react/hooks/useActiveViewport.js.map +1 -1
  43. package/lib/cjs/appui-react/keyboardshortcut/InternalKeyboardShortcut.d.ts.map +1 -1
  44. package/lib/cjs/appui-react/keyboardshortcut/InternalKeyboardShortcut.js.map +1 -1
  45. package/lib/cjs/appui-react/messages/MessageManager.d.ts +0 -1
  46. package/lib/cjs/appui-react/messages/MessageManager.d.ts.map +1 -1
  47. package/lib/cjs/appui-react/messages/MessageManager.js +1 -2
  48. package/lib/cjs/appui-react/messages/MessageManager.js.map +1 -1
  49. package/lib/cjs/appui-react/messages/Pointer.d.ts +1 -2
  50. package/lib/cjs/appui-react/messages/Pointer.d.ts.map +1 -1
  51. package/lib/cjs/appui-react/messages/Pointer.js +1 -1
  52. package/lib/cjs/appui-react/messages/Pointer.js.map +1 -1
  53. package/lib/cjs/appui-react/popup/PositionPopup.d.ts +2 -2
  54. package/lib/cjs/appui-react/popup/PositionPopup.d.ts.map +1 -1
  55. package/lib/cjs/appui-react/popup/PositionPopup.js.map +1 -1
  56. package/lib/cjs/appui-react/settings/ui/UiSettingsPage.js.map +1 -1
  57. package/lib/cjs/appui-react/stagepanels/StagePanelDef.d.ts +16 -20
  58. package/lib/cjs/appui-react/stagepanels/StagePanelDef.d.ts.map +1 -1
  59. package/lib/cjs/appui-react/stagepanels/StagePanelDef.js +80 -115
  60. package/lib/cjs/appui-react/stagepanels/StagePanelDef.js.map +1 -1
  61. package/lib/cjs/appui-react/statusfields/MessageCenter.d.ts.map +1 -1
  62. package/lib/cjs/appui-react/statusfields/MessageCenter.js +1 -2
  63. package/lib/cjs/appui-react/statusfields/MessageCenter.js.map +1 -1
  64. package/lib/cjs/appui-react/syncui/InternalSyncUiEventDispatcher.d.ts +36 -0
  65. package/lib/cjs/appui-react/syncui/InternalSyncUiEventDispatcher.d.ts.map +1 -0
  66. package/lib/cjs/appui-react/syncui/InternalSyncUiEventDispatcher.js +134 -0
  67. package/lib/cjs/appui-react/syncui/InternalSyncUiEventDispatcher.js.map +1 -0
  68. package/lib/cjs/appui-react/syncui/SyncUiEventDispatcher.d.ts +1 -1
  69. package/lib/cjs/appui-react/syncui/SyncUiEventDispatcher.d.ts.map +1 -1
  70. package/lib/cjs/appui-react/syncui/SyncUiEventDispatcher.js +2 -2
  71. package/lib/cjs/appui-react/syncui/SyncUiEventDispatcher.js.map +1 -1
  72. package/lib/cjs/appui-react/syncui/UiSyncEvent.d.ts +16 -0
  73. package/lib/cjs/appui-react/syncui/UiSyncEvent.d.ts.map +1 -0
  74. package/lib/cjs/appui-react/syncui/UiSyncEvent.js +18 -0
  75. package/lib/cjs/appui-react/syncui/UiSyncEvent.js.map +1 -0
  76. package/lib/cjs/appui-react/uistate/AppUiSettings.d.ts.map +1 -1
  77. package/lib/cjs/appui-react/uistate/AppUiSettings.js.map +1 -1
  78. package/lib/cjs/appui-react/uistate/useUiStateStorage.d.ts.map +1 -1
  79. package/lib/cjs/appui-react/uistate/useUiStateStorage.js.map +1 -1
  80. package/lib/cjs/appui-react/widget-panels/Frontstage.d.ts +7 -29
  81. package/lib/cjs/appui-react/widget-panels/Frontstage.d.ts.map +1 -1
  82. package/lib/cjs/appui-react/widget-panels/Frontstage.js +101 -434
  83. package/lib/cjs/appui-react/widget-panels/Frontstage.js.map +1 -1
  84. package/lib/cjs/appui-react/widget-panels/ToolSettings.d.ts.map +1 -1
  85. package/lib/cjs/appui-react/widget-panels/ToolSettings.js +16 -3
  86. package/lib/cjs/appui-react/widget-panels/ToolSettings.js.map +1 -1
  87. package/lib/cjs/appui-react/widgets/Widget.d.ts +10 -4
  88. package/lib/cjs/appui-react/widgets/Widget.d.ts.map +1 -1
  89. package/lib/cjs/appui-react/widgets/Widget.js.map +1 -1
  90. package/lib/cjs/appui-react/widgets/WidgetDef.d.ts +9 -29
  91. package/lib/cjs/appui-react/widgets/WidgetDef.d.ts.map +1 -1
  92. package/lib/cjs/appui-react/widgets/WidgetDef.js +89 -46
  93. package/lib/cjs/appui-react/widgets/WidgetDef.js.map +1 -1
  94. package/lib/cjs/appui-react.d.ts +1 -0
  95. package/lib/cjs/appui-react.d.ts.map +1 -1
  96. package/lib/cjs/appui-react.js +1 -0
  97. package/lib/cjs/appui-react.js.map +1 -1
  98. package/lib/esm/appui-react/accudraw/MenuButton.d.ts +2 -2
  99. package/lib/esm/appui-react/accudraw/MenuButton.d.ts.map +1 -1
  100. package/lib/esm/appui-react/accudraw/MenuButton.js.map +1 -1
  101. package/lib/esm/appui-react/backstage/BackstageComposer.d.ts.map +1 -1
  102. package/lib/esm/appui-react/backstage/BackstageComposer.js.map +1 -1
  103. package/lib/esm/appui-react/childwindow/CopyStyles.d.ts.map +1 -1
  104. package/lib/esm/appui-react/childwindow/CopyStyles.js +3 -1
  105. package/lib/esm/appui-react/childwindow/CopyStyles.js.map +1 -1
  106. package/lib/esm/appui-react/childwindow/InternalChildWindowManager.d.ts.map +1 -1
  107. package/lib/esm/appui-react/childwindow/InternalChildWindowManager.js +2 -1
  108. package/lib/esm/appui-react/childwindow/InternalChildWindowManager.js.map +1 -1
  109. package/lib/esm/appui-react/cursor/CursorInformation.d.ts +6 -6
  110. package/lib/esm/appui-react/cursor/CursorInformation.d.ts.map +1 -1
  111. package/lib/esm/appui-react/cursor/CursorInformation.js.map +1 -1
  112. package/lib/esm/appui-react/cursor/cursormenu/CursorMenu.d.ts.map +1 -1
  113. package/lib/esm/appui-react/cursor/cursormenu/CursorMenu.js.map +1 -1
  114. package/lib/esm/appui-react/cursor/cursorpopup/CursorPopup.d.ts +4 -4
  115. package/lib/esm/appui-react/cursor/cursorpopup/CursorPopup.d.ts.map +1 -1
  116. package/lib/esm/appui-react/cursor/cursorpopup/CursorPopup.js.map +1 -1
  117. package/lib/esm/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts +5 -5
  118. package/lib/esm/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts.map +1 -1
  119. package/lib/esm/appui-react/cursor/cursorpopup/CursorPopupManager.js.map +1 -1
  120. package/lib/esm/appui-react/cursor/cursorprompt/CursorPrompt.d.ts +2 -2
  121. package/lib/esm/appui-react/cursor/cursorprompt/CursorPrompt.d.ts.map +1 -1
  122. package/lib/esm/appui-react/cursor/cursorprompt/CursorPrompt.js.map +1 -1
  123. package/lib/esm/appui-react/dialog/ContentDialog.js.map +1 -1
  124. package/lib/esm/appui-react/feedback/ElementTooltip.d.ts +1 -2
  125. package/lib/esm/appui-react/feedback/ElementTooltip.d.ts.map +1 -1
  126. package/lib/esm/appui-react/feedback/ElementTooltip.js.map +1 -1
  127. package/lib/esm/appui-react/frontstage/FrontstageDef.d.ts +22 -26
  128. package/lib/esm/appui-react/frontstage/FrontstageDef.d.ts.map +1 -1
  129. package/lib/esm/appui-react/frontstage/FrontstageDef.js +189 -258
  130. package/lib/esm/appui-react/frontstage/FrontstageDef.js.map +1 -1
  131. package/lib/esm/appui-react/frontstage/InternalFrontstageManager.d.ts +1 -7
  132. package/lib/esm/appui-react/frontstage/InternalFrontstageManager.d.ts.map +1 -1
  133. package/lib/esm/appui-react/frontstage/InternalFrontstageManager.js +0 -6
  134. package/lib/esm/appui-react/frontstage/InternalFrontstageManager.js.map +1 -1
  135. package/lib/esm/appui-react/hooks/useActiveIModelConnection.d.ts.map +1 -1
  136. package/lib/esm/appui-react/hooks/useActiveIModelConnection.js.map +1 -1
  137. package/lib/esm/appui-react/hooks/useActiveViewport.d.ts.map +1 -1
  138. package/lib/esm/appui-react/hooks/useActiveViewport.js.map +1 -1
  139. package/lib/esm/appui-react/keyboardshortcut/InternalKeyboardShortcut.d.ts.map +1 -1
  140. package/lib/esm/appui-react/keyboardshortcut/InternalKeyboardShortcut.js.map +1 -1
  141. package/lib/esm/appui-react/messages/MessageManager.d.ts +0 -1
  142. package/lib/esm/appui-react/messages/MessageManager.d.ts.map +1 -1
  143. package/lib/esm/appui-react/messages/MessageManager.js +1 -2
  144. package/lib/esm/appui-react/messages/MessageManager.js.map +1 -1
  145. package/lib/esm/appui-react/messages/Pointer.d.ts +1 -2
  146. package/lib/esm/appui-react/messages/Pointer.d.ts.map +1 -1
  147. package/lib/esm/appui-react/messages/Pointer.js +1 -1
  148. package/lib/esm/appui-react/messages/Pointer.js.map +1 -1
  149. package/lib/esm/appui-react/popup/PositionPopup.d.ts +2 -2
  150. package/lib/esm/appui-react/popup/PositionPopup.d.ts.map +1 -1
  151. package/lib/esm/appui-react/popup/PositionPopup.js.map +1 -1
  152. package/lib/esm/appui-react/settings/ui/UiSettingsPage.js.map +1 -1
  153. package/lib/esm/appui-react/stagepanels/StagePanelDef.d.ts +16 -20
  154. package/lib/esm/appui-react/stagepanels/StagePanelDef.d.ts.map +1 -1
  155. package/lib/esm/appui-react/stagepanels/StagePanelDef.js +78 -114
  156. package/lib/esm/appui-react/stagepanels/StagePanelDef.js.map +1 -1
  157. package/lib/esm/appui-react/statusfields/MessageCenter.d.ts.map +1 -1
  158. package/lib/esm/appui-react/statusfields/MessageCenter.js +1 -2
  159. package/lib/esm/appui-react/statusfields/MessageCenter.js.map +1 -1
  160. package/lib/esm/appui-react/syncui/InternalSyncUiEventDispatcher.d.ts +36 -0
  161. package/lib/esm/appui-react/syncui/InternalSyncUiEventDispatcher.d.ts.map +1 -0
  162. package/lib/esm/appui-react/syncui/InternalSyncUiEventDispatcher.js +130 -0
  163. package/lib/esm/appui-react/syncui/InternalSyncUiEventDispatcher.js.map +1 -0
  164. package/lib/esm/appui-react/syncui/SyncUiEventDispatcher.d.ts +1 -1
  165. package/lib/esm/appui-react/syncui/SyncUiEventDispatcher.d.ts.map +1 -1
  166. package/lib/esm/appui-react/syncui/SyncUiEventDispatcher.js +2 -2
  167. package/lib/esm/appui-react/syncui/SyncUiEventDispatcher.js.map +1 -1
  168. package/lib/esm/appui-react/syncui/UiSyncEvent.d.ts +16 -0
  169. package/lib/esm/appui-react/syncui/UiSyncEvent.d.ts.map +1 -0
  170. package/lib/esm/appui-react/syncui/UiSyncEvent.js +14 -0
  171. package/lib/esm/appui-react/syncui/UiSyncEvent.js.map +1 -0
  172. package/lib/esm/appui-react/uistate/AppUiSettings.d.ts.map +1 -1
  173. package/lib/esm/appui-react/uistate/AppUiSettings.js.map +1 -1
  174. package/lib/esm/appui-react/uistate/useUiStateStorage.d.ts.map +1 -1
  175. package/lib/esm/appui-react/uistate/useUiStateStorage.js.map +1 -1
  176. package/lib/esm/appui-react/widget-panels/Frontstage.d.ts +7 -29
  177. package/lib/esm/appui-react/widget-panels/Frontstage.d.ts.map +1 -1
  178. package/lib/esm/appui-react/widget-panels/Frontstage.js +104 -433
  179. package/lib/esm/appui-react/widget-panels/Frontstage.js.map +1 -1
  180. package/lib/esm/appui-react/widget-panels/ToolSettings.d.ts.map +1 -1
  181. package/lib/esm/appui-react/widget-panels/ToolSettings.js +16 -3
  182. package/lib/esm/appui-react/widget-panels/ToolSettings.js.map +1 -1
  183. package/lib/esm/appui-react/widgets/Widget.d.ts +10 -4
  184. package/lib/esm/appui-react/widgets/Widget.d.ts.map +1 -1
  185. package/lib/esm/appui-react/widgets/Widget.js.map +1 -1
  186. package/lib/esm/appui-react/widgets/WidgetDef.d.ts +9 -29
  187. package/lib/esm/appui-react/widgets/WidgetDef.d.ts.map +1 -1
  188. package/lib/esm/appui-react/widgets/WidgetDef.js +89 -46
  189. package/lib/esm/appui-react/widgets/WidgetDef.js.map +1 -1
  190. package/lib/esm/appui-react.d.ts +1 -0
  191. package/lib/esm/appui-react.d.ts.map +1 -1
  192. package/lib/esm/appui-react.js +1 -0
  193. package/lib/esm/appui-react.js.map +1 -1
  194. 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.setWidgetLabel = exports.expandWidget = exports.showWidget = exports.setWidgetState = exports.isPanelCollapsed = exports.packNineZoneState = exports.restoreNineZoneState = exports.initializeNineZoneState = exports.stateVersion = exports.initializePanel = exports.isFrontstageStateSettingResult = exports.addPanelWidgets = exports.getPanelSectionWidgets = exports.getWidgetId = exports.removeMissingWidgets = exports.addMissingWidgets = exports.appendWidgets = exports.addWidgets = exports.useLabels = exports.ActiveFrontstageDefProvider = exports.WidgetPanelsFrontstage = exports.useNineZoneDispatch = exports.FrameworkStateReducer = exports.useUpdateNineZoneSize = exports.useLayoutStore = void 0;
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 [def, setDef] = React.useState(UiFramework_1.UiFramework.frontstages.activeFrontstageDef);
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 !== def ||
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
- layout.setState(args.state || defaultNineZone);
65
+ layoutStore.setState(args.state || defaultNineZone);
76
66
  });
77
67
  });
78
- }, [def, layout]);
79
- return [layout, def];
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
- let state = frontstageDef.nineZoneState;
78
+ const state = frontstageDef.nineZoneState;
89
79
  if (!size || !state)
90
80
  return;
91
- state = FrameworkStateReducer(state, {
81
+ frontstageDef.dispatch({
92
82
  type: "RESIZE",
93
83
  size: {
94
84
  height: size.height,
95
85
  width: size.width,
96
86
  },
97
- }, frontstageDef);
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
- const dispatch = React.useCallback((action) => {
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 [layout, frontstageDef] = useLayoutStore();
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
- return {
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
- isFloatingStateWindowResizable: widget.isFloatingStateWindowResizable,
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
- if (widgetDef.isFloatingStateSupported &&
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 ?? (0, appui_layout_react_1.getUniqueId)();
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(initialState, frontstageDef) {
330
- // istanbul ignore next
331
- if (!initialState.popoutWidgets)
332
- return initialState;
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
- return (0, appui_layout_react_1.convertAllPopupWidgetContainersToFloating)(initialState);
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 = hideWidget(state, widgetDef);
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 panelSide = (0, StagePanelDef_1.toPanelSide)(location);
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[panelSide];
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
- if (panelDef?.maxSizeSpec) {
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 = 14; // this needs to be bumped when NineZoneState is changed (to recreate the layout).
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, frontstageDef);
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 restored = {
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
- restored = (0, appui_layout_react_1.addTab)(restored, tab.id);
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
- restored = (0, appui_layout_react_1.removeTab)(restored, tab.id);
513
+ state = (0, appui_layout_react_1.removeTab)(state, tab.id);
565
514
  continue;
566
515
  }
567
- restored = (0, immer_1.default)(restored, (draft) => {
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
- restored = (0, immer_1.default)(restored, (draft) => {
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
- restored = FrameworkStateReducer(restored, {
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
- }, frontstageDef);
562
+ });
614
563
  }
615
- return restored;
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, frontstageDef);
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
- const restored = restoreNineZoneState(frontstageDef, setting.nineZone);
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
- const listener = (args) => {
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
- InternalFrontstageManager_1.InternalFrontstageManager.onWidgetLabelChangedEvent.addListener(listener);
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 = createListener(frontstageDef, () => {
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
- const toolSettingsTabId = frontstageDef.nineZoneState.toolSettings?.tabId;
1090
- if (!toolSettingsTabId)
1091
- return;
1092
- frontstageDef.nineZoneState = setWidgetLabel(frontstageDef.nineZoneState, toolSettingsTabId, label);
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
- if (useToolAsToolSettingsLabel) {
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
- return remove;
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;