@itwin/appui-react 5.3.1 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/CHANGELOG.md +330 -30
  2. package/lib/appui-react/UiFramework.d.ts +6 -2
  3. package/lib/appui-react/UiFramework.d.ts.map +1 -1
  4. package/lib/appui-react/UiFramework.js +30 -3
  5. package/lib/appui-react/UiFramework.js.map +1 -1
  6. package/lib/appui-react/accudraw/AccuDrawFieldContainer.d.ts.map +1 -1
  7. package/lib/appui-react/accudraw/AccuDrawFieldContainer.js +4 -4
  8. package/lib/appui-react/accudraw/AccuDrawFieldContainer.js.map +1 -1
  9. package/lib/appui-react/accudraw/AccuDrawPopupManager.d.ts.map +1 -1
  10. package/lib/appui-react/accudraw/AccuDrawPopupManager.js +10 -6
  11. package/lib/appui-react/accudraw/AccuDrawPopupManager.js.map +1 -1
  12. package/lib/appui-react/accudraw/AccuDrawWidget.d.ts.map +1 -1
  13. package/lib/appui-react/accudraw/AccuDrawWidget.js +1 -0
  14. package/lib/appui-react/accudraw/AccuDrawWidget.js.map +1 -1
  15. package/lib/appui-react/accudraw/Calculator.js +2 -2
  16. package/lib/appui-react/accudraw/Calculator.js.map +1 -1
  17. package/lib/appui-react/backstage/BackstageItemUtilities.d.ts.map +1 -1
  18. package/lib/appui-react/backstage/BackstageItemUtilities.js +2 -0
  19. package/lib/appui-react/backstage/BackstageItemUtilities.js.map +1 -1
  20. package/lib/appui-react/childwindow/ChildWindowRenderer.d.ts +2 -0
  21. package/lib/appui-react/childwindow/ChildWindowRenderer.d.ts.map +1 -1
  22. package/lib/appui-react/childwindow/ChildWindowRenderer.js +15 -10
  23. package/lib/appui-react/childwindow/ChildWindowRenderer.js.map +1 -1
  24. package/lib/appui-react/configurableui/ConfigurableUiContent.d.ts +23 -1
  25. package/lib/appui-react/configurableui/ConfigurableUiContent.d.ts.map +1 -1
  26. package/lib/appui-react/configurableui/ConfigurableUiContent.js +20 -12
  27. package/lib/appui-react/configurableui/ConfigurableUiContent.js.map +1 -1
  28. package/lib/appui-react/content/ContentLayout.d.ts.map +1 -1
  29. package/lib/appui-react/content/ContentLayout.js +10 -11
  30. package/lib/appui-react/content/ContentLayout.js.map +1 -1
  31. package/lib/appui-react/content/ContentOverlay.d.ts +1 -0
  32. package/lib/appui-react/content/ContentOverlay.d.ts.map +1 -1
  33. package/lib/appui-react/content/ContentOverlay.js +3 -1
  34. package/lib/appui-react/content/ContentOverlay.js.map +1 -1
  35. package/lib/appui-react/content/DefaultViewOverlay.d.ts.map +1 -1
  36. package/lib/appui-react/content/DefaultViewOverlay.js +6 -2
  37. package/lib/appui-react/content/DefaultViewOverlay.js.map +1 -1
  38. package/lib/appui-react/content/FloatingViewportContent.d.ts.map +1 -1
  39. package/lib/appui-react/content/FloatingViewportContent.js +1 -1
  40. package/lib/appui-react/content/FloatingViewportContent.js.map +1 -1
  41. package/lib/appui-react/cursor/CursorInformation.d.ts +4 -1
  42. package/lib/appui-react/cursor/CursorInformation.d.ts.map +1 -1
  43. package/lib/appui-react/cursor/CursorInformation.js +6 -1
  44. package/lib/appui-react/cursor/CursorInformation.js.map +1 -1
  45. package/lib/appui-react/cursor/cursormenu/CursorMenu.d.ts +1 -24
  46. package/lib/appui-react/cursor/cursormenu/CursorMenu.d.ts.map +1 -1
  47. package/lib/appui-react/cursor/cursormenu/CursorMenu.js +37 -58
  48. package/lib/appui-react/cursor/cursormenu/CursorMenu.js.map +1 -1
  49. package/lib/appui-react/cursor/cursorpopup/CursorPopup.scss +3 -0
  50. package/lib/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts +8 -22
  51. package/lib/appui-react/cursor/cursorpopup/CursorPopupManager.d.ts.map +1 -1
  52. package/lib/appui-react/cursor/cursorpopup/CursorPopupManager.js +111 -116
  53. package/lib/appui-react/cursor/cursorpopup/CursorPopupManager.js.map +1 -1
  54. package/lib/appui-react/cursor/cursorprompt/CursorPrompt.d.ts +12 -15
  55. package/lib/appui-react/cursor/cursorprompt/CursorPrompt.d.ts.map +1 -1
  56. package/lib/appui-react/cursor/cursorprompt/CursorPrompt.js +85 -48
  57. package/lib/appui-react/cursor/cursorprompt/CursorPrompt.js.map +1 -1
  58. package/lib/appui-react/framework/FrameworkFrontstages.d.ts +47 -0
  59. package/lib/appui-react/framework/FrameworkFrontstages.d.ts.map +1 -1
  60. package/lib/appui-react/framework/FrameworkFrontstages.js +136 -0
  61. package/lib/appui-react/framework/FrameworkFrontstages.js.map +1 -1
  62. package/lib/appui-react/framework/FrameworkVisibility.d.ts +2 -0
  63. package/lib/appui-react/framework/FrameworkVisibility.d.ts.map +1 -1
  64. package/lib/appui-react/framework/FrameworkVisibility.js.map +1 -1
  65. package/lib/appui-react/frontstage/InternalFrontstageManager.d.ts.map +1 -1
  66. package/lib/appui-react/frontstage/InternalFrontstageManager.js +121 -115
  67. package/lib/appui-react/frontstage/InternalFrontstageManager.js.map +1 -1
  68. package/lib/appui-react/frontstage/StandardFrontstageProvider.d.ts.map +1 -1
  69. package/lib/appui-react/frontstage/StandardFrontstageProvider.js +1 -0
  70. package/lib/appui-react/frontstage/StandardFrontstageProvider.js.map +1 -1
  71. package/lib/appui-react/hooks/useActiveTool.d.ts +9 -0
  72. package/lib/appui-react/hooks/useActiveTool.d.ts.map +1 -0
  73. package/lib/appui-react/hooks/useActiveTool.js +23 -0
  74. package/lib/appui-react/hooks/useActiveTool.js.map +1 -0
  75. package/lib/appui-react/icons/SvgAngle.d.ts +7 -0
  76. package/lib/appui-react/icons/SvgAngle.d.ts.map +1 -0
  77. package/lib/appui-react/icons/SvgAngle.js +15 -0
  78. package/lib/appui-react/icons/SvgAngle.js.map +1 -0
  79. package/lib/appui-react/icons/SvgBackspace.d.ts +7 -0
  80. package/lib/appui-react/icons/SvgBackspace.d.ts.map +1 -0
  81. package/lib/appui-react/icons/SvgBackspace.js +14 -0
  82. package/lib/appui-react/icons/SvgBackspace.js.map +1 -0
  83. package/lib/appui-react/icons/SvgDistance.d.ts +7 -0
  84. package/lib/appui-react/icons/SvgDistance.d.ts.map +1 -0
  85. package/lib/appui-react/icons/SvgDistance.js +16 -0
  86. package/lib/appui-react/icons/SvgDistance.js.map +1 -0
  87. package/lib/appui-react/icons/SvgHeight.d.ts +7 -0
  88. package/lib/appui-react/icons/SvgHeight.d.ts.map +1 -0
  89. package/lib/appui-react/icons/SvgHeight.js +17 -0
  90. package/lib/appui-react/icons/SvgHeight.js.map +1 -0
  91. package/lib/appui-react/icons/SvgMouseClickLeftDrag.d.ts +7 -0
  92. package/lib/appui-react/icons/SvgMouseClickLeftDrag.d.ts.map +1 -0
  93. package/lib/appui-react/icons/SvgMouseClickLeftDrag.js +15 -0
  94. package/lib/appui-react/icons/SvgMouseClickLeftDrag.js.map +1 -0
  95. package/lib/appui-react/icons/SvgMouseClickRightDrag.d.ts +7 -0
  96. package/lib/appui-react/icons/SvgMouseClickRightDrag.d.ts.map +1 -0
  97. package/lib/appui-react/icons/SvgMouseClickRightDrag.js +15 -0
  98. package/lib/appui-react/icons/SvgMouseClickRightDrag.js.map +1 -0
  99. package/lib/appui-react/icons/SvgMouseClickWheelDrag.d.ts +7 -0
  100. package/lib/appui-react/icons/SvgMouseClickWheelDrag.d.ts.map +1 -0
  101. package/lib/appui-react/icons/SvgMouseClickWheelDrag.js +15 -0
  102. package/lib/appui-react/icons/SvgMouseClickWheelDrag.js.map +1 -0
  103. package/lib/appui-react/icons/SvgTouchCursorPan.d.ts +7 -0
  104. package/lib/appui-react/icons/SvgTouchCursorPan.d.ts.map +1 -0
  105. package/lib/appui-react/icons/SvgTouchCursorPan.js +15 -0
  106. package/lib/appui-react/icons/SvgTouchCursorPan.js.map +1 -0
  107. package/lib/appui-react/icons/SvgTouchCursorPoint.d.ts +7 -0
  108. package/lib/appui-react/icons/SvgTouchCursorPoint.d.ts.map +1 -0
  109. package/lib/appui-react/icons/SvgTouchCursorPoint.js +16 -0
  110. package/lib/appui-react/icons/SvgTouchCursorPoint.js.map +1 -0
  111. package/lib/appui-react/layout/StandardLayout.scss +3 -8
  112. package/lib/appui-react/layout/base/DragManager.d.ts.map +1 -1
  113. package/lib/appui-react/layout/base/DragManager.js +10 -15
  114. package/lib/appui-react/layout/base/DragManager.js.map +1 -1
  115. package/lib/appui-react/layout/state/NineZoneAction.d.ts +1 -0
  116. package/lib/appui-react/layout/state/NineZoneAction.d.ts.map +1 -1
  117. package/lib/appui-react/layout/state/NineZoneAction.js.map +1 -1
  118. package/lib/appui-react/layout/state/NineZoneStateReducer.d.ts.map +1 -1
  119. package/lib/appui-react/layout/state/NineZoneStateReducer.js +23 -16
  120. package/lib/appui-react/layout/state/NineZoneStateReducer.js.map +1 -1
  121. package/lib/appui-react/messages/Pointer.js +1 -1
  122. package/lib/appui-react/messages/Pointer.js.map +1 -1
  123. package/lib/appui-react/navigationaids/CubeNavigationAidControl.d.ts.map +1 -1
  124. package/lib/appui-react/navigationaids/CubeNavigationAidControl.js +1 -0
  125. package/lib/appui-react/navigationaids/CubeNavigationAidControl.js.map +1 -1
  126. package/lib/appui-react/navigationaids/DrawingNavigationAidControl.d.ts.map +1 -1
  127. package/lib/appui-react/navigationaids/DrawingNavigationAidControl.js +1 -0
  128. package/lib/appui-react/navigationaids/DrawingNavigationAidControl.js.map +1 -1
  129. package/lib/appui-react/navigationaids/SheetNavigationAid.d.ts.map +1 -1
  130. package/lib/appui-react/navigationaids/SheetNavigationAid.js +1 -0
  131. package/lib/appui-react/navigationaids/SheetNavigationAid.js.map +1 -1
  132. package/lib/appui-react/navigationaids/StandardRotationNavigationAid.d.ts.map +1 -1
  133. package/lib/appui-react/navigationaids/StandardRotationNavigationAid.js +1 -0
  134. package/lib/appui-react/navigationaids/StandardRotationNavigationAid.js.map +1 -1
  135. package/lib/appui-react/popup/KeyinPalettePanel.js +1 -1
  136. package/lib/appui-react/popup/KeyinPalettePanel.js.map +1 -1
  137. package/lib/appui-react/popup/PopupManager.d.ts.map +1 -1
  138. package/lib/appui-react/popup/PopupManager.js +9 -3
  139. package/lib/appui-react/popup/PopupManager.js.map +1 -1
  140. package/lib/appui-react/preview/PreviewFeatures.d.ts +5 -0
  141. package/lib/appui-react/preview/PreviewFeatures.d.ts.map +1 -1
  142. package/lib/appui-react/preview/PreviewFeatures.js +1 -0
  143. package/lib/appui-react/preview/PreviewFeatures.js.map +1 -1
  144. package/lib/appui-react/preview/horizontal-panel-alignment/PreviewHorizontalPanelAlign.d.ts.map +1 -1
  145. package/lib/appui-react/preview/horizontal-panel-alignment/PreviewHorizontalPanelAlign.js +8 -2
  146. package/lib/appui-react/preview/horizontal-panel-alignment/PreviewHorizontalPanelAlign.js.map +1 -1
  147. package/lib/appui-react/preview/tool-settings-new-editors/useToolsSettingsNewEditors.d.ts +5 -0
  148. package/lib/appui-react/preview/tool-settings-new-editors/useToolsSettingsNewEditors.d.ts.map +1 -0
  149. package/lib/appui-react/preview/tool-settings-new-editors/useToolsSettingsNewEditors.js +13 -0
  150. package/lib/appui-react/preview/tool-settings-new-editors/useToolsSettingsNewEditors.js.map +1 -0
  151. package/lib/appui-react/shared/MenuItem.d.ts +3 -0
  152. package/lib/appui-react/shared/MenuItem.d.ts.map +1 -1
  153. package/lib/appui-react/shared/MenuItem.js +2 -3
  154. package/lib/appui-react/shared/MenuItem.js.map +1 -1
  155. package/lib/appui-react/statusbar/StatusBarItemUtilities.d.ts.map +1 -1
  156. package/lib/appui-react/statusbar/StatusBarItemUtilities.js +2 -0
  157. package/lib/appui-react/statusbar/StatusBarItemUtilities.js.map +1 -1
  158. package/lib/appui-react/statusfields/ActivityCenter.js +1 -1
  159. package/lib/appui-react/statusfields/ActivityCenter.js.map +1 -1
  160. package/lib/appui-react/statusfields/toolassistance/ToolAssistanceField.d.ts +2 -55
  161. package/lib/appui-react/statusfields/toolassistance/ToolAssistanceField.d.ts.map +1 -1
  162. package/lib/appui-react/statusfields/toolassistance/ToolAssistanceField.js +333 -403
  163. package/lib/appui-react/statusfields/toolassistance/ToolAssistanceField.js.map +1 -1
  164. package/lib/appui-react/toolbar/Toolbar.d.ts.map +1 -1
  165. package/lib/appui-react/toolbar/Toolbar.js +4 -3
  166. package/lib/appui-react/toolbar/Toolbar.js.map +1 -1
  167. package/lib/appui-react/toolbar/ToolbarItemUtilities.d.ts.map +1 -1
  168. package/lib/appui-react/toolbar/ToolbarItemUtilities.js +3 -0
  169. package/lib/appui-react/toolbar/ToolbarItemUtilities.js.map +1 -1
  170. package/lib/appui-react/toolbar/new-toolbars/ActionItem.d.ts.map +1 -1
  171. package/lib/appui-react/toolbar/new-toolbars/ActionItem.js +3 -0
  172. package/lib/appui-react/toolbar/new-toolbars/ActionItem.js.map +1 -1
  173. package/lib/appui-react/toolbar/new-toolbars/GroupItem.d.ts +1 -1
  174. package/lib/appui-react/toolbar/new-toolbars/GroupItem.d.ts.map +1 -1
  175. package/lib/appui-react/toolbar/new-toolbars/GroupItem.js +2 -0
  176. package/lib/appui-react/toolbar/new-toolbars/GroupItem.js.map +1 -1
  177. package/lib/appui-react/toolbar/new-toolbars/Item.d.ts +2 -2
  178. package/lib/appui-react/toolbar/new-toolbars/Toolbar.d.ts +6 -3
  179. package/lib/appui-react/toolbar/new-toolbars/Toolbar.d.ts.map +1 -1
  180. package/lib/appui-react/toolbar/new-toolbars/Toolbar.js +4 -3
  181. package/lib/appui-react/toolbar/new-toolbars/Toolbar.js.map +1 -1
  182. package/lib/appui-react/toolsettings/DefaultToolSettingsProvider.d.ts.map +1 -1
  183. package/lib/appui-react/toolsettings/DefaultToolSettingsProvider.js +1 -0
  184. package/lib/appui-react/toolsettings/DefaultToolSettingsProvider.js.map +1 -1
  185. package/lib/appui-react/ui-items-provider/AbstractUiItemsManager.d.ts.map +1 -1
  186. package/lib/appui-react/ui-items-provider/AbstractUiItemsManager.js +9 -2
  187. package/lib/appui-react/ui-items-provider/AbstractUiItemsManager.js.map +1 -1
  188. package/lib/appui-react/ui-items-provider/StandardContentToolsProvider.d.ts.map +1 -1
  189. package/lib/appui-react/ui-items-provider/StandardContentToolsProvider.js +1 -0
  190. package/lib/appui-react/ui-items-provider/StandardContentToolsProvider.js.map +1 -1
  191. package/lib/appui-react/ui-items-provider/StandardNavigationToolsProvider.d.ts.map +1 -1
  192. package/lib/appui-react/ui-items-provider/StandardNavigationToolsProvider.js +1 -0
  193. package/lib/appui-react/ui-items-provider/StandardNavigationToolsProvider.js.map +1 -1
  194. package/lib/appui-react/ui-items-provider/StandardStatusbarItemsProvider.d.ts.map +1 -1
  195. package/lib/appui-react/ui-items-provider/StandardStatusbarItemsProvider.js +1 -0
  196. package/lib/appui-react/ui-items-provider/StandardStatusbarItemsProvider.js.map +1 -1
  197. package/lib/appui-react/uiprovider/ComponentGenerator.d.ts.map +1 -1
  198. package/lib/appui-react/uiprovider/ComponentGenerator.js +4 -2
  199. package/lib/appui-react/uiprovider/ComponentGenerator.js.map +1 -1
  200. package/lib/appui-react/utils/InternalUiShowHideManager.d.ts +2 -0
  201. package/lib/appui-react/utils/InternalUiShowHideManager.d.ts.map +1 -1
  202. package/lib/appui-react/utils/InternalUiShowHideManager.js +6 -0
  203. package/lib/appui-react/utils/InternalUiShowHideManager.js.map +1 -1
  204. package/lib/appui-react/utils/PropsHelper.js +1 -1
  205. package/lib/appui-react/utils/PropsHelper.js.map +1 -1
  206. package/lib/appui-react/widget-panels/Frontstage.d.ts +7 -2
  207. package/lib/appui-react/widget-panels/Frontstage.d.ts.map +1 -1
  208. package/lib/appui-react/widget-panels/Frontstage.js +29 -12
  209. package/lib/appui-react/widget-panels/Frontstage.js.map +1 -1
  210. package/lib/appui-react/widgets/BackstageAppButton.scss +8 -3
  211. package/lib/appui-react/widgets/BasicToolWidget.d.ts.map +1 -1
  212. package/lib/appui-react/widgets/BasicToolWidget.js +3 -1
  213. package/lib/appui-react/widgets/BasicToolWidget.js.map +1 -1
  214. package/lib/appui-react/widgets/WidgetDef.d.ts.map +1 -1
  215. package/lib/appui-react/widgets/WidgetDef.js +0 -1
  216. package/lib/appui-react/widgets/WidgetDef.js.map +1 -1
  217. package/lib/appui-react.d.ts +1 -1
  218. package/lib/appui-react.d.ts.map +1 -1
  219. package/lib/appui-react.js +1 -1
  220. package/lib/appui-react.js.map +1 -1
  221. package/lib/cjs/appui-react/cursor/cursorpopup/CursorPopup.scss +3 -0
  222. package/lib/cjs/appui-react/layout/StandardLayout.scss +3 -8
  223. package/lib/cjs/appui-react/widgets/BackstageAppButton.scss +8 -3
  224. package/lib/esm/appui-react/cursor/cursorpopup/CursorPopup.scss +3 -0
  225. package/lib/esm/appui-react/layout/StandardLayout.scss +3 -8
  226. package/lib/esm/appui-react/widgets/BackstageAppButton.scss +8 -3
  227. package/package.json +29 -30
  228. package/lib/appui-react/accudraw/angle.svg +0 -1
  229. package/lib/appui-react/accudraw/backspace.svg +0 -9
  230. package/lib/appui-react/accudraw/constraint-2d.svg +0 -11
  231. package/lib/appui-react/accudraw/distance.svg +0 -1
  232. package/lib/appui-react/accudraw/height-2.svg +0 -10
  233. package/lib/appui-react/accudraw/height.svg +0 -11
  234. package/lib/appui-react/statusfields/toolassistance/accept-point.svg +0 -1
  235. package/lib/appui-react/statusfields/toolassistance/cursor-click.svg +0 -1
  236. package/lib/appui-react/statusfields/toolassistance/gesture-one-finger-drag.svg +0 -1
  237. package/lib/appui-react/statusfields/toolassistance/gesture-one-finger-tap-double.svg +0 -1
  238. package/lib/appui-react/statusfields/toolassistance/gesture-one-finger-tap.svg +0 -1
  239. package/lib/appui-react/statusfields/toolassistance/gesture-pinch.svg +0 -1
  240. package/lib/appui-react/statusfields/toolassistance/gesture-two-finger-drag.svg +0 -1
  241. package/lib/appui-react/statusfields/toolassistance/gesture-two-finger-tap.svg +0 -1
  242. package/lib/appui-react/statusfields/toolassistance/mouse-click-left-drag.svg +0 -1
  243. package/lib/appui-react/statusfields/toolassistance/mouse-click-left.svg +0 -1
  244. package/lib/appui-react/statusfields/toolassistance/mouse-click-right-drag.svg +0 -1
  245. package/lib/appui-react/statusfields/toolassistance/mouse-click-right.svg +0 -1
  246. package/lib/appui-react/statusfields/toolassistance/mouse-click-wheel-drag.svg +0 -1
  247. package/lib/appui-react/statusfields/toolassistance/mouse-click-wheel.svg +0 -1
  248. package/lib/appui-react/statusfields/toolassistance/touch-cursor-pan.svg +0 -1
  249. package/lib/appui-react/statusfields/toolassistance/touch-cursor-point.svg +0 -1
  250. package/lib/cjs/appui-react/accudraw/angle.svg +0 -1
  251. package/lib/cjs/appui-react/accudraw/backspace.svg +0 -9
  252. package/lib/cjs/appui-react/accudraw/constraint-2d.svg +0 -11
  253. package/lib/cjs/appui-react/accudraw/distance.svg +0 -1
  254. package/lib/cjs/appui-react/accudraw/height-2.svg +0 -10
  255. package/lib/cjs/appui-react/accudraw/height.svg +0 -11
  256. package/lib/cjs/appui-react/statusfields/toolassistance/accept-point.svg +0 -1
  257. package/lib/cjs/appui-react/statusfields/toolassistance/cursor-click.svg +0 -1
  258. package/lib/cjs/appui-react/statusfields/toolassistance/gesture-one-finger-drag.svg +0 -1
  259. package/lib/cjs/appui-react/statusfields/toolassistance/gesture-one-finger-tap-double.svg +0 -1
  260. package/lib/cjs/appui-react/statusfields/toolassistance/gesture-one-finger-tap.svg +0 -1
  261. package/lib/cjs/appui-react/statusfields/toolassistance/gesture-pinch.svg +0 -1
  262. package/lib/cjs/appui-react/statusfields/toolassistance/gesture-two-finger-drag.svg +0 -1
  263. package/lib/cjs/appui-react/statusfields/toolassistance/gesture-two-finger-tap.svg +0 -1
  264. package/lib/cjs/appui-react/statusfields/toolassistance/mouse-click-left-drag.svg +0 -1
  265. package/lib/cjs/appui-react/statusfields/toolassistance/mouse-click-left.svg +0 -1
  266. package/lib/cjs/appui-react/statusfields/toolassistance/mouse-click-right-drag.svg +0 -1
  267. package/lib/cjs/appui-react/statusfields/toolassistance/mouse-click-right.svg +0 -1
  268. package/lib/cjs/appui-react/statusfields/toolassistance/mouse-click-wheel-drag.svg +0 -1
  269. package/lib/cjs/appui-react/statusfields/toolassistance/mouse-click-wheel.svg +0 -1
  270. package/lib/cjs/appui-react/statusfields/toolassistance/touch-cursor-pan.svg +0 -1
  271. package/lib/cjs/appui-react/statusfields/toolassistance/touch-cursor-point.svg +0 -1
  272. package/lib/esm/appui-react/accudraw/angle.svg +0 -1
  273. package/lib/esm/appui-react/accudraw/backspace.svg +0 -9
  274. package/lib/esm/appui-react/accudraw/constraint-2d.svg +0 -11
  275. package/lib/esm/appui-react/accudraw/distance.svg +0 -1
  276. package/lib/esm/appui-react/accudraw/height-2.svg +0 -10
  277. package/lib/esm/appui-react/accudraw/height.svg +0 -11
  278. package/lib/esm/appui-react/statusfields/toolassistance/accept-point.svg +0 -1
  279. package/lib/esm/appui-react/statusfields/toolassistance/cursor-click.svg +0 -1
  280. package/lib/esm/appui-react/statusfields/toolassistance/gesture-one-finger-drag.svg +0 -1
  281. package/lib/esm/appui-react/statusfields/toolassistance/gesture-one-finger-tap-double.svg +0 -1
  282. package/lib/esm/appui-react/statusfields/toolassistance/gesture-one-finger-tap.svg +0 -1
  283. package/lib/esm/appui-react/statusfields/toolassistance/gesture-pinch.svg +0 -1
  284. package/lib/esm/appui-react/statusfields/toolassistance/gesture-two-finger-drag.svg +0 -1
  285. package/lib/esm/appui-react/statusfields/toolassistance/gesture-two-finger-tap.svg +0 -1
  286. package/lib/esm/appui-react/statusfields/toolassistance/mouse-click-left-drag.svg +0 -1
  287. package/lib/esm/appui-react/statusfields/toolassistance/mouse-click-left.svg +0 -1
  288. package/lib/esm/appui-react/statusfields/toolassistance/mouse-click-right-drag.svg +0 -1
  289. package/lib/esm/appui-react/statusfields/toolassistance/mouse-click-right.svg +0 -1
  290. package/lib/esm/appui-react/statusfields/toolassistance/mouse-click-wheel-drag.svg +0 -1
  291. package/lib/esm/appui-react/statusfields/toolassistance/mouse-click-wheel.svg +0 -1
  292. package/lib/esm/appui-react/statusfields/toolassistance/touch-cursor-pan.svg +0 -1
  293. package/lib/esm/appui-react/statusfields/toolassistance/touch-cursor-point.svg +0 -1
@@ -12,6 +12,7 @@ import { Point } from "@itwin/core-react/internal";
12
12
  import { UiFramework } from "../../UiFramework.js";
13
13
  import { CursorPopupShow } from "./CursorPopup.js";
14
14
  import { CursorPopup } from "./CursorPopup.js";
15
+ import { ChildWindowContext } from "../../childwindow/ChildWindowRenderer.js";
15
16
  /** CursorPopup component
16
17
  * @public
17
18
  */
@@ -19,7 +20,7 @@ export class CursorPopupManager {
19
20
  /** @internal */
20
21
  static clearPopups() {
21
22
  this._popups.length = 0;
22
- CursorPopupManager._emitPopupsChangedEvent();
23
+ CursorPopupManager.onCursorPopupsChangedEvent.emit({});
23
24
  }
24
25
  static get popups() {
25
26
  return this._popups;
@@ -27,16 +28,13 @@ export class CursorPopupManager {
27
28
  static get popupCount() {
28
29
  return this._popups.length;
29
30
  }
30
- static _emitPopupsChangedEvent() {
31
- CursorPopupManager.onCursorPopupsChangedEvent.emit({});
32
- }
33
31
  static pushPopup(popupInfo) {
34
32
  CursorPopupManager._popups.push(popupInfo);
35
- CursorPopupManager._emitPopupsChangedEvent();
33
+ CursorPopupManager.onCursorPopupsChangedEvent.emit({});
36
34
  }
37
35
  /** Called to open popup with a new set of properties
38
36
  */
39
- static open(id, content, pt, offset, relativePosition, priority = 0, options) {
37
+ static open(id, content, pt, offset, relativePosition, priority = 0, options, targetDocument) {
40
38
  const popupInfo = CursorPopupManager._popups.find((info) => id === info.id);
41
39
  if (popupInfo) {
42
40
  CursorPopupManager.onCursorPopupFadeOutEvent.emit({
@@ -49,7 +47,8 @@ export class CursorPopupManager {
49
47
  popupInfo.renderRelativePosition = relativePosition;
50
48
  popupInfo.priority = priority;
51
49
  popupInfo.options = options;
52
- CursorPopupManager.updatePosition(pt);
50
+ popupInfo.targetDocument = targetDocument;
51
+ CursorPopupManager.updatePosition(pt, targetDocument);
53
52
  if (popupInfo.cancelFadeOut) {
54
53
  popupInfo.cancelFadeOut();
55
54
  popupInfo.cancelFadeOut = undefined;
@@ -64,13 +63,14 @@ export class CursorPopupManager {
64
63
  options,
65
64
  renderRelativePosition: relativePosition,
66
65
  priority,
66
+ targetDocument,
67
67
  };
68
68
  CursorPopupManager.pushPopup(newPopupInfo);
69
- CursorPopupManager.updatePosition(pt);
69
+ CursorPopupManager.updatePosition(pt, targetDocument);
70
70
  }
71
71
  /** Called to update popup with a new set of properties
72
72
  */
73
- static update(id, content, pt, offset, relativePosition, priority = 0) {
73
+ static update(id, content, pt, offset, relativePosition, priority = 0, targetDocument) {
74
74
  const popupInfo = CursorPopupManager._popups.find((info) => id === info.id);
75
75
  if (popupInfo) {
76
76
  popupInfo.content = content;
@@ -78,6 +78,7 @@ export class CursorPopupManager {
78
78
  popupInfo.relativePosition = relativePosition;
79
79
  popupInfo.renderRelativePosition = relativePosition;
80
80
  popupInfo.priority = priority;
81
+ popupInfo.targetDocument = targetDocument;
81
82
  }
82
83
  else {
83
84
  Logger.logError(UiFramework.loggerCategory("CursorPopupManager"), `update: Could not find popup with id of '${id}'`);
@@ -86,8 +87,8 @@ export class CursorPopupManager {
86
87
  }
87
88
  /** Called to move the open popup to new location
88
89
  */
89
- static updatePosition(pt) {
90
- CursorPopupManager.resetPopupsRenderRelativePosition(Point.create(pt));
90
+ static updatePosition(pt, targetDocument) {
91
+ CursorPopupManager.resetPopupsRenderRelativePosition(Point.create(pt), targetDocument);
91
92
  CursorPopupManager.onCursorPopupUpdatePositionEvent.emit({ pt });
92
93
  }
93
94
  /** Called when tool wants to close the popup
@@ -125,22 +126,29 @@ export class CursorPopupManager {
125
126
  const index = CursorPopupManager._popups.findIndex((popupInfo) => id === popupInfo.id);
126
127
  if (index >= 0) {
127
128
  CursorPopupManager._popups.splice(index, 1);
128
- CursorPopupManager._emitPopupsChangedEvent();
129
+ CursorPopupManager.onCursorPopupsChangedEvent.emit({});
129
130
  }
130
131
  }
131
- static resetPopupsRenderRelativePosition(pt) {
132
+ static resetPopupsRenderRelativePosition(pt, targetDocument) {
132
133
  CursorPopupManager.popups.forEach((popupInfo) => {
134
+ if (popupInfo.cancelFadeOut &&
135
+ popupInfo.targetDocument !== targetDocument) {
136
+ // Popup if fading out - do not change target document.
137
+ return;
138
+ }
133
139
  popupInfo.renderRelativePosition = popupInfo.relativePosition;
134
- const flipped = CursorPopupManager.validateRenderRelativePosition(pt, popupInfo);
140
+ popupInfo.targetDocument = targetDocument;
141
+ const flipped = CursorPopupManager.validateRenderRelativePosition(pt, popupInfo, targetDocument);
135
142
  // If flipped, call again to validate again.
136
143
  if (flipped) {
137
- CursorPopupManager.validateRenderRelativePosition(pt, popupInfo);
144
+ CursorPopupManager.validateRenderRelativePosition(pt, popupInfo, targetDocument);
138
145
  }
139
146
  });
140
147
  }
141
- static validateRenderRelativePosition(pt, popupInfo) {
148
+ static validateRenderRelativePosition(pt, popupInfo, targetDocument) {
142
149
  const popupRect = CursorPopup.getPopupRect(pt, Point.create(popupInfo.offset), popupInfo.popupSize, popupInfo.renderRelativePosition);
143
- const { outPos, flipped } = CursorPopupManager.autoFlip(popupInfo.renderRelativePosition, popupRect, window.innerWidth, window.innerHeight);
150
+ const targetWindow = targetDocument?.defaultView ?? window;
151
+ const { outPos, flipped } = CursorPopupManager.autoFlip(popupInfo.renderRelativePosition, popupRect, targetWindow.innerWidth, targetWindow.innerHeight);
144
152
  if (flipped)
145
153
  popupInfo.renderRelativePosition = outPos;
146
154
  return flipped;
@@ -222,109 +230,96 @@ CursorPopupManager.onCursorPopupUpdatePositionEvent = new BeUiEvent();
222
230
  CursorPopupManager.onCursorPopupFadeOutEvent = new BeUiEvent();
223
231
  /** @internal */
224
232
  CursorPopupManager.onCursorPopupsChangedEvent = new BeUiEvent();
233
+ const relativePositions = Object.values(RelativePosition).filter((value) => typeof value !== "string");
225
234
  /** CursorPopupRenderer React component.
226
235
  * @public
227
236
  */
228
- export class CursorPopupRenderer extends React.Component {
229
- constructor(props) {
230
- super(props);
231
- this._handlePopupChangedEvent = () => {
232
- this.forceUpdate();
233
- };
234
- this._handleCursorPopupUpdatePositionEvent = (args) => {
235
- this.setState({ pt: Point.create(args.pt) });
236
- };
237
- this.state = {
238
- pt: new Point(),
239
- };
240
- }
241
- render() {
242
- if (CursorPopupManager.popupCount <= 0)
243
- return null;
244
- return React.createElement(React.Fragment, null, this.renderPositions());
245
- }
246
- _handleSizeKnown(popupInfo, size) {
247
- popupInfo.popupSize = size;
248
- }
249
- renderPositions() {
250
- const positions = new Array();
251
- let renderedPosition;
252
- const begin = RelativePosition.Left;
253
- const end = RelativePosition.BottomRight;
254
- for (let position = begin; position <= end; position++) {
255
- renderedPosition = this.renderRelativePosition(position);
256
- if (renderedPosition)
257
- positions.push(renderedPosition);
258
- }
259
- return positions;
260
- }
261
- renderRelativePosition(relativePosition) {
262
- const filteredInfo = CursorPopupManager.popups.filter((popupInfo) => popupInfo.renderRelativePosition === relativePosition);
263
- if (filteredInfo.length > 0) {
264
- let totalDimension = 0;
265
- const ascending = relativePosition === RelativePosition.Right ||
266
- relativePosition === RelativePosition.BottomRight ||
267
- relativePosition === RelativePosition.Bottom ||
268
- relativePosition === RelativePosition.BottomLeft;
269
- const positionPopups = filteredInfo
270
- .sort((a, b) => ascending ? a.priority - b.priority : b.priority - a.priority)
271
- .map((popupInfo, index) => {
272
- const title = popupInfo.options !== undefined ? popupInfo.options.title : "";
273
- const shadow = popupInfo.options !== undefined ? popupInfo.options.shadow : false;
274
- let offset = popupInfo.offset;
275
- if (index > 0)
276
- offset = this.adjustOffset(offset, popupInfo.renderRelativePosition, totalDimension);
277
- if (popupInfo.popupSize)
278
- totalDimension += this.getDimension(popupInfo.popupSize, relativePosition);
279
- return (React.createElement(CursorPopup, { key: popupInfo.id, id: popupInfo.id, content: popupInfo.content, pt: this.state.pt, offset: offset, relativePosition: popupInfo.renderRelativePosition, title: title, shadow: shadow, onSizeKnown: (size) => this._handleSizeKnown(popupInfo, size) }));
280
- });
281
- return (React.createElement(React.Fragment, { key: relativePosition.toString() }, positionPopups));
282
- }
283
- return null;
284
- }
285
- getDimension(popupSize, relativePosition) {
286
- let dimension = 0;
287
- switch (relativePosition) {
288
- case RelativePosition.Top:
289
- case RelativePosition.Bottom:
290
- case RelativePosition.TopLeft:
291
- case RelativePosition.TopRight:
292
- case RelativePosition.BottomLeft:
293
- case RelativePosition.BottomRight:
294
- dimension = popupSize.height;
295
- break;
296
- case RelativePosition.Left:
297
- case RelativePosition.Right:
298
- dimension = popupSize.width;
299
- break;
300
- }
301
- return dimension;
302
- }
303
- adjustOffset(offset, relativePosition, dimension) {
304
- let outOffset = Point.create(offset.toProps());
305
- switch (relativePosition) {
306
- case RelativePosition.Top:
307
- case RelativePosition.Bottom:
308
- case RelativePosition.TopLeft:
309
- case RelativePosition.TopRight:
310
- case RelativePosition.BottomLeft:
311
- case RelativePosition.BottomRight:
312
- outOffset = Point.create({ x: offset.x, y: offset.y + dimension });
313
- break;
314
- case RelativePosition.Left:
315
- case RelativePosition.Right:
316
- outOffset = Point.create({ x: offset.x + dimension, y: offset.y });
317
- break;
318
- }
319
- return outOffset;
320
- }
321
- componentDidMount() {
322
- CursorPopupManager.onCursorPopupsChangedEvent.addListener(this._handlePopupChangedEvent);
323
- CursorPopupManager.onCursorPopupUpdatePositionEvent.addListener(this._handleCursorPopupUpdatePositionEvent);
237
+ export function CursorPopupRenderer() {
238
+ const popupWindow = React.useContext(ChildWindowContext) ?? window;
239
+ const [popups, setPopups] = React.useState(CursorPopupManager.popups);
240
+ const [point, setPoint] = React.useState(new Point());
241
+ React.useEffect(() => {
242
+ return CursorPopupManager.onCursorPopupsChangedEvent.addListener(() => {
243
+ const allPopups = CursorPopupManager.popups;
244
+ const newPopups = allPopups.map((p) => ({ ...p }));
245
+ setPopups(newPopups);
246
+ });
247
+ }, []);
248
+ React.useEffect(() => {
249
+ return CursorPopupManager.onCursorPopupUpdatePositionEvent.addListener((args) => {
250
+ const allPopups = CursorPopupManager.popups;
251
+ const newPopups = allPopups.map((p) => ({ ...p }));
252
+ setPopups(newPopups);
253
+ setPoint(Point.create(args.pt));
254
+ });
255
+ }, []);
256
+ if (popups.length === 0)
257
+ return undefined;
258
+ return (React.createElement(React.Fragment, null, relativePositions.map((position) => {
259
+ const filteredInfo = popups.filter((popupInfo) => popupInfo.renderRelativePosition === position);
260
+ if (filteredInfo.length === 0)
261
+ return undefined;
262
+ let totalDimension = 0;
263
+ const positionPopups = filteredInfo
264
+ .sort((a, b) => {
265
+ const ascending = position === RelativePosition.Right ||
266
+ position === RelativePosition.BottomRight ||
267
+ position === RelativePosition.Bottom ||
268
+ position === RelativePosition.BottomLeft;
269
+ return ascending
270
+ ? a.priority - b.priority
271
+ : b.priority - a.priority;
272
+ })
273
+ .map((popupInfo, index) => {
274
+ const targetDocument = popupInfo.targetDocument ?? window.document;
275
+ if (popupWindow.document !== targetDocument)
276
+ return undefined;
277
+ const title = popupInfo.options !== undefined ? popupInfo.options.title : "";
278
+ const shadow = popupInfo.options !== undefined
279
+ ? popupInfo.options.shadow
280
+ : false;
281
+ let offset = popupInfo.offset;
282
+ if (index > 0)
283
+ offset = adjustOffset(offset, popupInfo.renderRelativePosition, totalDimension);
284
+ if (popupInfo.popupSize)
285
+ totalDimension += getDimension(popupInfo.popupSize, position);
286
+ return (React.createElement(CursorPopup, { key: popupInfo.id, id: popupInfo.id, content: popupInfo.content, pt: point, offset: offset,
287
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
288
+ relativePosition: popupInfo.renderRelativePosition, title: title, shadow: shadow, onSizeKnown: (size) => {
289
+ popupInfo.popupSize = size;
290
+ } }));
291
+ });
292
+ return React.createElement(React.Fragment, { key: position }, positionPopups);
293
+ })));
294
+ }
295
+ function adjustOffset(offset, relativePosition, dimension) {
296
+ switch (relativePosition) {
297
+ case RelativePosition.Top:
298
+ case RelativePosition.Bottom:
299
+ case RelativePosition.TopLeft:
300
+ case RelativePosition.TopRight:
301
+ case RelativePosition.BottomLeft:
302
+ case RelativePosition.BottomRight:
303
+ return Point.create({ x: offset.x, y: offset.y + dimension });
304
+ case RelativePosition.Left:
305
+ case RelativePosition.Right:
306
+ return Point.create({ x: offset.x + dimension, y: offset.y });
324
307
  }
325
- componentWillUnmount() {
326
- CursorPopupManager.onCursorPopupsChangedEvent.removeListener(this._handlePopupChangedEvent);
327
- CursorPopupManager.onCursorPopupUpdatePositionEvent.removeListener(this._handleCursorPopupUpdatePositionEvent);
308
+ return Point.create(offset.toProps());
309
+ }
310
+ function getDimension(popupSize, relativePosition) {
311
+ switch (relativePosition) {
312
+ case RelativePosition.Top:
313
+ case RelativePosition.Bottom:
314
+ case RelativePosition.TopLeft:
315
+ case RelativePosition.TopRight:
316
+ case RelativePosition.BottomLeft:
317
+ case RelativePosition.BottomRight:
318
+ return popupSize.height;
319
+ case RelativePosition.Left:
320
+ case RelativePosition.Right:
321
+ return popupSize.width;
328
322
  }
323
+ return 0;
329
324
  }
330
325
  //# sourceMappingURL=CursorPopupManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CursorPopupManager.js","sourceRoot":"","sources":["../../../../src/appui-react/cursor/cursorpopup/CursorPopupManager.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Cursor\n */\n\nimport * as React from \"react\";\nimport { BeUiEvent, Logger } from \"@itwin/core-bentley\";\nimport type { XAndY } from \"@itwin/core-geometry\";\nimport { RelativePosition } from \"@itwin/appui-abstract\";\nimport type { ListenerType } from \"@itwin/core-react/internal\";\nimport { Point } from \"@itwin/core-react/internal\";\nimport { UiFramework } from \"../../UiFramework.js\";\nimport { CursorPopupShow } from \"./CursorPopup.js\";\nimport { CursorPopup } from \"./CursorPopup.js\";\nimport type { SizeProps } from \"../../utils/SizeProps.js\";\nimport type { RectangleProps } from \"../../utils/RectangleProps.js\";\n\n/** Options for the [[CursorPopupManager]] open method\n * @public\n */\nexport interface CursorPopupOptions {\n /** Title of the popup */\n title?: string;\n /** Called on popup close */\n onClose?: () => void;\n /** Callback to apply changes */\n onApply?: () => void;\n /** Draw shadow */\n shadow?: boolean;\n}\n\n/** Information maintained by CursorPopupManager about a CursorPopup. */\ninterface CursorPopupInfo {\n id: string;\n content: React.ReactNode;\n relativePosition: RelativePosition;\n offset: Point;\n priority: number;\n options?: CursorPopupOptions;\n\n renderRelativePosition: RelativePosition;\n popupSize?: SizeProps;\n\n cancelFadeOut?: () => void;\n}\n\n/** CursorPopup component\n * @public\n */\nexport class CursorPopupManager {\n private static _popups: CursorPopupInfo[] = new Array<CursorPopupInfo>();\n\n /** @internal */\n public static readonly onCursorPopupUpdatePositionEvent = new BeUiEvent<{\n pt: XAndY;\n }>();\n /** @internal */\n public static readonly onCursorPopupFadeOutEvent = new BeUiEvent<{\n id: string;\n show?: CursorPopupShow;\n }>();\n /** @internal */\n public static readonly onCursorPopupsChangedEvent = new BeUiEvent<object>();\n /** @internal */\n public static clearPopups() {\n this._popups.length = 0;\n CursorPopupManager._emitPopupsChangedEvent();\n }\n\n public static get popups() {\n return this._popups;\n }\n\n public static get popupCount() {\n return this._popups.length;\n }\n\n private static _emitPopupsChangedEvent(): void {\n CursorPopupManager.onCursorPopupsChangedEvent.emit({});\n }\n\n private static pushPopup(popupInfo: CursorPopupInfo): void {\n CursorPopupManager._popups.push(popupInfo);\n CursorPopupManager._emitPopupsChangedEvent();\n }\n\n /** Called to open popup with a new set of properties\n */\n public static open(\n id: string,\n content: React.ReactNode,\n pt: XAndY,\n offset: XAndY,\n relativePosition: RelativePosition,\n priority: number = 0,\n options?: CursorPopupOptions\n ) {\n const popupInfo = CursorPopupManager._popups.find(\n (info: CursorPopupInfo) => id === info.id\n );\n if (popupInfo) {\n CursorPopupManager.onCursorPopupFadeOutEvent.emit({\n id,\n show: CursorPopupShow.Open,\n });\n\n popupInfo.content = content;\n popupInfo.offset = Point.create(offset);\n popupInfo.relativePosition = relativePosition;\n popupInfo.renderRelativePosition = relativePosition;\n popupInfo.priority = priority;\n popupInfo.options = options;\n CursorPopupManager.updatePosition(pt);\n\n if (popupInfo.cancelFadeOut) {\n popupInfo.cancelFadeOut();\n popupInfo.cancelFadeOut = undefined;\n }\n return;\n }\n\n const newPopupInfo: CursorPopupInfo = {\n id,\n content,\n offset: Point.create(offset),\n relativePosition,\n options,\n renderRelativePosition: relativePosition,\n priority,\n };\n CursorPopupManager.pushPopup(newPopupInfo);\n CursorPopupManager.updatePosition(pt);\n }\n\n /** Called to update popup with a new set of properties\n */\n public static update(\n id: string,\n content: React.ReactNode,\n pt: XAndY,\n offset: XAndY,\n relativePosition: RelativePosition,\n priority: number = 0\n ) {\n const popupInfo = CursorPopupManager._popups.find(\n (info: CursorPopupInfo) => id === info.id\n );\n if (popupInfo) {\n popupInfo.content = content;\n popupInfo.offset = Point.create(offset);\n popupInfo.relativePosition = relativePosition;\n popupInfo.renderRelativePosition = relativePosition;\n popupInfo.priority = priority;\n } else {\n Logger.logError(\n UiFramework.loggerCategory(\"CursorPopupManager\"),\n `update: Could not find popup with id of '${id}'`\n );\n }\n\n CursorPopupManager.updatePosition(pt);\n }\n\n /** Called to move the open popup to new location\n */\n public static updatePosition(pt: XAndY) {\n CursorPopupManager.resetPopupsRenderRelativePosition(Point.create(pt));\n CursorPopupManager.onCursorPopupUpdatePositionEvent.emit({ pt });\n }\n\n /** Called when tool wants to close the popup\n */\n public static close(id: string, apply: boolean, fadeOut?: boolean) {\n const popupInfo = CursorPopupManager._popups.find(\n (info: CursorPopupInfo) => id === info.id\n );\n if (!popupInfo) {\n Logger.logError(\n UiFramework.loggerCategory(\"CursorPopupManager\"),\n `close: Could not find popup with id of '${id}'`\n );\n return;\n }\n\n if (apply) popupInfo.options?.onApply?.();\n popupInfo.options?.onClose?.();\n\n if (fadeOut) {\n // Already closing\n if (popupInfo.cancelFadeOut) return;\n\n let cancelled = false;\n popupInfo.cancelFadeOut = () => {\n cancelled = true;\n };\n CursorPopupManager.onCursorPopupFadeOutEvent.emit({ id });\n\n setTimeout(() => {\n if (cancelled) return;\n CursorPopupManager.removePopup(id);\n }, CursorPopup.fadeOutTime);\n return;\n }\n\n popupInfo.cancelFadeOut?.();\n popupInfo.cancelFadeOut = undefined;\n CursorPopupManager.removePopup(id);\n }\n\n private static removePopup(id: string): void {\n const index = CursorPopupManager._popups.findIndex(\n (popupInfo: CursorPopupInfo) => id === popupInfo.id\n );\n if (index >= 0) {\n CursorPopupManager._popups.splice(index, 1);\n CursorPopupManager._emitPopupsChangedEvent();\n }\n }\n\n private static resetPopupsRenderRelativePosition(pt: Point) {\n CursorPopupManager.popups.forEach((popupInfo: CursorPopupInfo) => {\n popupInfo.renderRelativePosition = popupInfo.relativePosition;\n\n const flipped = CursorPopupManager.validateRenderRelativePosition(\n pt,\n popupInfo\n );\n\n // If flipped, call again to validate again.\n if (flipped) {\n CursorPopupManager.validateRenderRelativePosition(pt, popupInfo);\n }\n });\n }\n\n private static validateRenderRelativePosition(\n pt: Point,\n popupInfo: CursorPopupInfo\n ): boolean {\n const popupRect = CursorPopup.getPopupRect(\n pt,\n Point.create(popupInfo.offset),\n popupInfo.popupSize,\n popupInfo.renderRelativePosition\n );\n const { outPos, flipped } = CursorPopupManager.autoFlip(\n popupInfo.renderRelativePosition,\n popupRect,\n window.innerWidth,\n window.innerHeight\n );\n\n if (flipped) popupInfo.renderRelativePosition = outPos;\n\n return flipped;\n }\n\n private static autoFlip(\n inPos: RelativePosition,\n rect: RectangleProps,\n windowWidth: number,\n windowHeight: number\n ): { outPos: RelativePosition; flipped: boolean } {\n let flipped = false;\n let outPos = inPos;\n\n if (rect.right > windowWidth) {\n flipped = true;\n switch (inPos) {\n case RelativePosition.Top:\n case RelativePosition.TopRight:\n outPos = RelativePosition.TopLeft;\n break;\n case RelativePosition.Right:\n outPos = RelativePosition.Left;\n break;\n case RelativePosition.Bottom:\n case RelativePosition.BottomRight:\n outPos = RelativePosition.BottomLeft;\n break;\n }\n }\n\n if (rect.left < 0) {\n flipped = true;\n switch (inPos) {\n case RelativePosition.Top:\n case RelativePosition.TopLeft:\n outPos = RelativePosition.TopRight;\n break;\n case RelativePosition.Left:\n outPos = RelativePosition.Right;\n break;\n case RelativePosition.Bottom:\n case RelativePosition.BottomLeft:\n outPos = RelativePosition.BottomRight;\n break;\n }\n }\n\n if (rect.bottom > windowHeight) {\n flipped = true;\n switch (inPos) {\n case RelativePosition.Left:\n case RelativePosition.BottomLeft:\n outPos = RelativePosition.TopLeft;\n break;\n case RelativePosition.Bottom:\n outPos = RelativePosition.Top;\n break;\n case RelativePosition.Right:\n case RelativePosition.BottomRight:\n outPos = RelativePosition.TopRight;\n break;\n }\n }\n\n if (rect.top < 0) {\n flipped = true;\n switch (inPos) {\n case RelativePosition.Left:\n case RelativePosition.TopLeft:\n outPos = RelativePosition.BottomLeft;\n break;\n case RelativePosition.Top:\n outPos = RelativePosition.Bottom;\n break;\n case RelativePosition.Right:\n case RelativePosition.TopRight:\n outPos = RelativePosition.BottomRight;\n break;\n }\n }\n\n return { outPos, flipped };\n }\n}\n\n/** State for the [[CursorPopupRenderer]] React component */\ninterface CursorPopupRendererState {\n pt: Point;\n}\n\n/** CursorPopupRenderer React component.\n * @public\n */\nexport class CursorPopupRenderer extends React.Component<\n any,\n CursorPopupRendererState\n> {\n constructor(props: any) {\n super(props);\n\n this.state = {\n pt: new Point(),\n };\n }\n\n public override render(): React.ReactNode {\n if (CursorPopupManager.popupCount <= 0) return null;\n\n return <>{this.renderPositions()}</>;\n }\n\n private _handleSizeKnown(popupInfo: CursorPopupInfo, size: SizeProps) {\n popupInfo.popupSize = size;\n }\n\n private renderPositions(): React.ReactNode[] {\n const positions = new Array<React.ReactNode>();\n let renderedPosition: React.ReactNode;\n const begin = RelativePosition.Left;\n const end = RelativePosition.BottomRight;\n\n for (let position = begin; position <= end; position++) {\n renderedPosition = this.renderRelativePosition(position);\n if (renderedPosition) positions.push(renderedPosition);\n }\n\n return positions;\n }\n\n private renderRelativePosition(\n relativePosition: RelativePosition\n ): React.ReactNode {\n const filteredInfo = CursorPopupManager.popups.filter(\n (popupInfo: CursorPopupInfo) =>\n popupInfo.renderRelativePosition === relativePosition\n );\n\n if (filteredInfo.length > 0) {\n let totalDimension = 0;\n const ascending =\n relativePosition === RelativePosition.Right ||\n relativePosition === RelativePosition.BottomRight ||\n relativePosition === RelativePosition.Bottom ||\n relativePosition === RelativePosition.BottomLeft;\n\n const positionPopups = filteredInfo\n .sort((a: CursorPopupInfo, b: CursorPopupInfo): number =>\n ascending ? a.priority - b.priority : b.priority - a.priority\n )\n .map((popupInfo: CursorPopupInfo, index: number) => {\n const title =\n popupInfo.options !== undefined ? popupInfo.options.title : \"\";\n const shadow =\n popupInfo.options !== undefined ? popupInfo.options.shadow : false;\n let offset = popupInfo.offset;\n\n if (index > 0)\n offset = this.adjustOffset(\n offset,\n popupInfo.renderRelativePosition,\n totalDimension\n );\n\n if (popupInfo.popupSize)\n totalDimension += this.getDimension(\n popupInfo.popupSize,\n relativePosition\n );\n\n return (\n <CursorPopup\n key={popupInfo.id}\n id={popupInfo.id}\n content={popupInfo.content}\n pt={this.state.pt}\n offset={offset}\n relativePosition={popupInfo.renderRelativePosition}\n title={title}\n shadow={shadow}\n onSizeKnown={(size: SizeProps) =>\n this._handleSizeKnown(popupInfo, size)\n }\n />\n );\n });\n\n return (\n <React.Fragment key={relativePosition.toString()}>\n {positionPopups}\n </React.Fragment>\n );\n }\n\n return null;\n }\n\n private getDimension(\n popupSize: SizeProps,\n relativePosition: RelativePosition\n ): number {\n let dimension = 0;\n\n switch (relativePosition) {\n case RelativePosition.Top:\n case RelativePosition.Bottom:\n case RelativePosition.TopLeft:\n case RelativePosition.TopRight:\n case RelativePosition.BottomLeft:\n case RelativePosition.BottomRight:\n dimension = popupSize.height;\n break;\n case RelativePosition.Left:\n case RelativePosition.Right:\n dimension = popupSize.width;\n break;\n }\n\n return dimension;\n }\n\n private adjustOffset(\n offset: Point,\n relativePosition: RelativePosition,\n dimension: number\n ): Point {\n let outOffset = Point.create(offset.toProps());\n\n switch (relativePosition) {\n case RelativePosition.Top:\n case RelativePosition.Bottom:\n case RelativePosition.TopLeft:\n case RelativePosition.TopRight:\n case RelativePosition.BottomLeft:\n case RelativePosition.BottomRight:\n outOffset = Point.create({ x: offset.x, y: offset.y + dimension });\n break;\n case RelativePosition.Left:\n case RelativePosition.Right:\n outOffset = Point.create({ x: offset.x + dimension, y: offset.y });\n break;\n }\n\n return outOffset;\n }\n\n public override componentDidMount(): void {\n CursorPopupManager.onCursorPopupsChangedEvent.addListener(\n this._handlePopupChangedEvent\n );\n CursorPopupManager.onCursorPopupUpdatePositionEvent.addListener(\n this._handleCursorPopupUpdatePositionEvent\n );\n }\n\n public override componentWillUnmount(): void {\n CursorPopupManager.onCursorPopupsChangedEvent.removeListener(\n this._handlePopupChangedEvent\n );\n CursorPopupManager.onCursorPopupUpdatePositionEvent.removeListener(\n this._handleCursorPopupUpdatePositionEvent\n );\n }\n\n private _handlePopupChangedEvent: ListenerType<\n typeof CursorPopupManager.onCursorPopupsChangedEvent\n > = () => {\n this.forceUpdate();\n };\n\n private _handleCursorPopupUpdatePositionEvent: ListenerType<\n typeof CursorPopupManager.onCursorPopupUpdatePositionEvent\n > = (args) => {\n this.setState({ pt: Point.create(args.pt) });\n };\n}\n"]}
1
+ {"version":3,"file":"CursorPopupManager.js","sourceRoot":"","sources":["../../../../src/appui-react/cursor/cursorpopup/CursorPopupManager.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Cursor\n */\n\nimport * as React from \"react\";\nimport { BeUiEvent, Logger } from \"@itwin/core-bentley\";\nimport type { XAndY } from \"@itwin/core-geometry\";\nimport { RelativePosition } from \"@itwin/appui-abstract\";\nimport { Point } from \"@itwin/core-react/internal\";\nimport { UiFramework } from \"../../UiFramework.js\";\nimport { CursorPopupShow } from \"./CursorPopup.js\";\nimport { CursorPopup } from \"./CursorPopup.js\";\nimport type { SizeProps } from \"../../utils/SizeProps.js\";\nimport type { RectangleProps } from \"../../utils/RectangleProps.js\";\nimport { ChildWindowContext } from \"../../childwindow/ChildWindowRenderer.js\";\n\n/** Options for the [[CursorPopupManager]] open method\n * @public\n */\nexport interface CursorPopupOptions {\n /** Title of the popup */\n title?: string;\n /** Called on popup close */\n onClose?: () => void;\n /** Callback to apply changes */\n onApply?: () => void;\n /** Draw shadow */\n shadow?: boolean;\n}\n\n/** Information maintained by CursorPopupManager about a CursorPopup.\n * @public\n */\ninterface CursorPopupInfo {\n id: string;\n content: React.ReactNode;\n relativePosition: RelativePosition;\n offset: Point;\n priority: number;\n options?: CursorPopupOptions;\n targetDocument?: Document;\n\n renderRelativePosition: RelativePosition;\n popupSize?: SizeProps;\n\n cancelFadeOut?: () => void;\n}\n\n/** CursorPopup component\n * @public\n */\nexport class CursorPopupManager {\n private static _popups: CursorPopupInfo[] = new Array<CursorPopupInfo>();\n\n /** @internal */\n public static readonly onCursorPopupUpdatePositionEvent = new BeUiEvent<{\n pt: XAndY;\n }>();\n /** @internal */\n public static readonly onCursorPopupFadeOutEvent = new BeUiEvent<{\n id: string;\n show?: CursorPopupShow;\n }>();\n /** @internal */\n public static readonly onCursorPopupsChangedEvent = new BeUiEvent<object>();\n /** @internal */\n public static clearPopups() {\n this._popups.length = 0;\n CursorPopupManager.onCursorPopupsChangedEvent.emit({});\n }\n\n public static get popups() {\n return this._popups;\n }\n\n public static get popupCount() {\n return this._popups.length;\n }\n\n private static pushPopup(popupInfo: CursorPopupInfo): void {\n CursorPopupManager._popups.push(popupInfo);\n CursorPopupManager.onCursorPopupsChangedEvent.emit({});\n }\n\n /** Called to open popup with a new set of properties\n */\n public static open(\n id: string,\n content: React.ReactNode,\n pt: XAndY,\n offset: XAndY,\n relativePosition: RelativePosition,\n priority: number = 0,\n options?: CursorPopupOptions,\n targetDocument?: Document\n ) {\n const popupInfo = CursorPopupManager._popups.find((info) => id === info.id);\n if (popupInfo) {\n CursorPopupManager.onCursorPopupFadeOutEvent.emit({\n id,\n show: CursorPopupShow.Open,\n });\n\n popupInfo.content = content;\n popupInfo.offset = Point.create(offset);\n popupInfo.relativePosition = relativePosition;\n popupInfo.renderRelativePosition = relativePosition;\n popupInfo.priority = priority;\n popupInfo.options = options;\n popupInfo.targetDocument = targetDocument;\n CursorPopupManager.updatePosition(pt, targetDocument);\n\n if (popupInfo.cancelFadeOut) {\n popupInfo.cancelFadeOut();\n popupInfo.cancelFadeOut = undefined;\n }\n return;\n }\n\n const newPopupInfo: CursorPopupInfo = {\n id,\n content,\n offset: Point.create(offset),\n relativePosition,\n options,\n renderRelativePosition: relativePosition,\n priority,\n targetDocument,\n };\n CursorPopupManager.pushPopup(newPopupInfo);\n CursorPopupManager.updatePosition(pt, targetDocument);\n }\n\n /** Called to update popup with a new set of properties\n */\n public static update(\n id: string,\n content: React.ReactNode,\n pt: XAndY,\n offset: XAndY,\n relativePosition: RelativePosition,\n priority: number = 0,\n targetDocument?: Document\n ) {\n const popupInfo = CursorPopupManager._popups.find(\n (info: CursorPopupInfo) => id === info.id\n );\n if (popupInfo) {\n popupInfo.content = content;\n popupInfo.offset = Point.create(offset);\n popupInfo.relativePosition = relativePosition;\n popupInfo.renderRelativePosition = relativePosition;\n popupInfo.priority = priority;\n popupInfo.targetDocument = targetDocument;\n } else {\n Logger.logError(\n UiFramework.loggerCategory(\"CursorPopupManager\"),\n `update: Could not find popup with id of '${id}'`\n );\n }\n\n CursorPopupManager.updatePosition(pt);\n }\n\n /** Called to move the open popup to new location\n */\n public static updatePosition(pt: XAndY, targetDocument?: Document) {\n CursorPopupManager.resetPopupsRenderRelativePosition(\n Point.create(pt),\n targetDocument\n );\n CursorPopupManager.onCursorPopupUpdatePositionEvent.emit({ pt });\n }\n\n /** Called when tool wants to close the popup\n */\n public static close(id: string, apply: boolean, fadeOut?: boolean) {\n const popupInfo = CursorPopupManager._popups.find(\n (info: CursorPopupInfo) => id === info.id\n );\n if (!popupInfo) {\n Logger.logError(\n UiFramework.loggerCategory(\"CursorPopupManager\"),\n `close: Could not find popup with id of '${id}'`\n );\n return;\n }\n\n if (apply) popupInfo.options?.onApply?.();\n popupInfo.options?.onClose?.();\n\n if (fadeOut) {\n // Already closing\n if (popupInfo.cancelFadeOut) return;\n\n let cancelled = false;\n popupInfo.cancelFadeOut = () => {\n cancelled = true;\n };\n CursorPopupManager.onCursorPopupFadeOutEvent.emit({ id });\n\n setTimeout(() => {\n if (cancelled) return;\n CursorPopupManager.removePopup(id);\n }, CursorPopup.fadeOutTime);\n return;\n }\n\n popupInfo.cancelFadeOut?.();\n popupInfo.cancelFadeOut = undefined;\n CursorPopupManager.removePopup(id);\n }\n\n private static removePopup(id: string): void {\n const index = CursorPopupManager._popups.findIndex(\n (popupInfo: CursorPopupInfo) => id === popupInfo.id\n );\n if (index >= 0) {\n CursorPopupManager._popups.splice(index, 1);\n CursorPopupManager.onCursorPopupsChangedEvent.emit({});\n }\n }\n\n private static resetPopupsRenderRelativePosition(\n pt: Point,\n targetDocument: Document | undefined\n ) {\n CursorPopupManager.popups.forEach((popupInfo) => {\n if (\n popupInfo.cancelFadeOut &&\n popupInfo.targetDocument !== targetDocument\n ) {\n // Popup if fading out - do not change target document.\n return;\n }\n\n popupInfo.renderRelativePosition = popupInfo.relativePosition;\n popupInfo.targetDocument = targetDocument;\n\n const flipped = CursorPopupManager.validateRenderRelativePosition(\n pt,\n popupInfo,\n targetDocument\n );\n\n // If flipped, call again to validate again.\n if (flipped) {\n CursorPopupManager.validateRenderRelativePosition(\n pt,\n popupInfo,\n targetDocument\n );\n }\n });\n }\n\n private static validateRenderRelativePosition(\n pt: Point,\n popupInfo: CursorPopupInfo,\n targetDocument: Document | undefined\n ): boolean {\n const popupRect = CursorPopup.getPopupRect(\n pt,\n Point.create(popupInfo.offset),\n popupInfo.popupSize,\n popupInfo.renderRelativePosition\n );\n const targetWindow = targetDocument?.defaultView ?? window;\n const { outPos, flipped } = CursorPopupManager.autoFlip(\n popupInfo.renderRelativePosition,\n popupRect,\n targetWindow.innerWidth,\n targetWindow.innerHeight\n );\n\n if (flipped) popupInfo.renderRelativePosition = outPos;\n\n return flipped;\n }\n\n private static autoFlip(\n inPos: RelativePosition,\n rect: RectangleProps,\n windowWidth: number,\n windowHeight: number\n ): { outPos: RelativePosition; flipped: boolean } {\n let flipped = false;\n let outPos = inPos;\n\n if (rect.right > windowWidth) {\n flipped = true;\n switch (inPos) {\n case RelativePosition.Top:\n case RelativePosition.TopRight:\n outPos = RelativePosition.TopLeft;\n break;\n case RelativePosition.Right:\n outPos = RelativePosition.Left;\n break;\n case RelativePosition.Bottom:\n case RelativePosition.BottomRight:\n outPos = RelativePosition.BottomLeft;\n break;\n }\n }\n\n if (rect.left < 0) {\n flipped = true;\n switch (inPos) {\n case RelativePosition.Top:\n case RelativePosition.TopLeft:\n outPos = RelativePosition.TopRight;\n break;\n case RelativePosition.Left:\n outPos = RelativePosition.Right;\n break;\n case RelativePosition.Bottom:\n case RelativePosition.BottomLeft:\n outPos = RelativePosition.BottomRight;\n break;\n }\n }\n\n if (rect.bottom > windowHeight) {\n flipped = true;\n switch (inPos) {\n case RelativePosition.Left:\n case RelativePosition.BottomLeft:\n outPos = RelativePosition.TopLeft;\n break;\n case RelativePosition.Bottom:\n outPos = RelativePosition.Top;\n break;\n case RelativePosition.Right:\n case RelativePosition.BottomRight:\n outPos = RelativePosition.TopRight;\n break;\n }\n }\n\n if (rect.top < 0) {\n flipped = true;\n switch (inPos) {\n case RelativePosition.Left:\n case RelativePosition.TopLeft:\n outPos = RelativePosition.BottomLeft;\n break;\n case RelativePosition.Top:\n outPos = RelativePosition.Bottom;\n break;\n case RelativePosition.Right:\n case RelativePosition.TopRight:\n outPos = RelativePosition.BottomRight;\n break;\n }\n }\n\n return { outPos, flipped };\n }\n}\n\nconst relativePositions = Object.values(RelativePosition).filter(\n (value): value is RelativePosition => typeof value !== \"string\"\n);\n\n/** CursorPopupRenderer React component.\n * @public\n */\nexport function CursorPopupRenderer() {\n const popupWindow = React.useContext(ChildWindowContext) ?? window;\n const [popups, setPopups] = React.useState(CursorPopupManager.popups);\n const [point, setPoint] = React.useState(new Point());\n\n React.useEffect(() => {\n return CursorPopupManager.onCursorPopupsChangedEvent.addListener(() => {\n const allPopups = CursorPopupManager.popups;\n const newPopups = allPopups.map((p) => ({ ...p }));\n setPopups(newPopups);\n });\n }, []);\n React.useEffect(() => {\n return CursorPopupManager.onCursorPopupUpdatePositionEvent.addListener(\n (args) => {\n const allPopups = CursorPopupManager.popups;\n const newPopups = allPopups.map((p) => ({ ...p }));\n setPopups(newPopups);\n setPoint(Point.create(args.pt));\n }\n );\n }, []);\n\n if (popups.length === 0) return undefined;\n return (\n <>\n {relativePositions.map((position) => {\n const filteredInfo = popups.filter(\n (popupInfo) => popupInfo.renderRelativePosition === position\n );\n if (filteredInfo.length === 0) return undefined;\n\n let totalDimension = 0;\n const positionPopups = filteredInfo\n .sort((a, b) => {\n const ascending =\n position === RelativePosition.Right ||\n position === RelativePosition.BottomRight ||\n position === RelativePosition.Bottom ||\n position === RelativePosition.BottomLeft;\n return ascending\n ? a.priority - b.priority\n : b.priority - a.priority;\n })\n .map((popupInfo, index) => {\n const targetDocument = popupInfo.targetDocument ?? window.document;\n if (popupWindow.document !== targetDocument) return undefined;\n\n const title =\n popupInfo.options !== undefined ? popupInfo.options.title : \"\";\n const shadow =\n popupInfo.options !== undefined\n ? popupInfo.options.shadow\n : false;\n let offset = popupInfo.offset;\n\n if (index > 0)\n offset = adjustOffset(\n offset,\n popupInfo.renderRelativePosition,\n totalDimension\n );\n\n if (popupInfo.popupSize)\n totalDimension += getDimension(popupInfo.popupSize, position);\n\n return (\n <CursorPopup\n key={popupInfo.id}\n id={popupInfo.id}\n content={popupInfo.content}\n pt={point}\n offset={offset}\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n relativePosition={popupInfo.renderRelativePosition}\n title={title}\n shadow={shadow}\n onSizeKnown={(size) => {\n popupInfo.popupSize = size;\n }}\n />\n );\n });\n\n return <React.Fragment key={position}>{positionPopups}</React.Fragment>;\n })}\n </>\n );\n}\n\nfunction adjustOffset(\n offset: Point,\n relativePosition: RelativePosition,\n dimension: number\n) {\n switch (relativePosition) {\n case RelativePosition.Top:\n case RelativePosition.Bottom:\n case RelativePosition.TopLeft:\n case RelativePosition.TopRight:\n case RelativePosition.BottomLeft:\n case RelativePosition.BottomRight:\n return Point.create({ x: offset.x, y: offset.y + dimension });\n case RelativePosition.Left:\n case RelativePosition.Right:\n return Point.create({ x: offset.x + dimension, y: offset.y });\n }\n\n return Point.create(offset.toProps());\n}\n\nfunction getDimension(\n popupSize: SizeProps,\n relativePosition: RelativePosition\n) {\n switch (relativePosition) {\n case RelativePosition.Top:\n case RelativePosition.Bottom:\n case RelativePosition.TopLeft:\n case RelativePosition.TopRight:\n case RelativePosition.BottomLeft:\n case RelativePosition.BottomRight:\n return popupSize.height;\n case RelativePosition.Left:\n case RelativePosition.Right:\n return popupSize.width;\n }\n\n return 0;\n}\n"]}
@@ -2,20 +2,17 @@
2
2
  * @module Notification
3
3
  */
4
4
  import "./CursorPrompt.scss";
5
- /** @internal */
6
- export declare class CursorPrompt {
7
- private _popupId;
8
- private _timer;
9
- private _removeListeners;
10
- open({ timeout, fadeout, iconSpec, instruction, promptAtContent, }: {
11
- timeout: number;
12
- fadeout: boolean;
13
- iconSpec: string;
14
- instruction: string;
15
- promptAtContent: boolean;
16
- }): void;
17
- close(fadeout: boolean): void;
18
- private show;
19
- private hide;
5
+ interface UseCursorPromptArgs {
6
+ show: boolean;
7
+ timeout: number;
8
+ iconSpec: string;
9
+ instruction: string | undefined;
10
+ fadeOut: boolean;
11
+ promptAtContent: boolean;
20
12
  }
13
+ /** @internal */
14
+ export declare function useCursorPrompt(args: UseCursorPromptArgs): {
15
+ open: () => void;
16
+ };
17
+ export {};
21
18
  //# sourceMappingURL=CursorPrompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CursorPrompt.d.ts","sourceRoot":"","sources":["../../../../src/appui-react/cursor/cursorprompt/CursorPrompt.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,qBAAqB,CAAC;AAY7B,gBAAgB;AAChB,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAmB;IAEnC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,gBAAgB,CAA2B;IAE5C,IAAI,CAAC,EACV,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAW,EACX,eAAe,GAChB,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;KAC1B;IAmCM,KAAK,CAAC,OAAO,EAAE,OAAO;IAS7B,OAAO,CAAC,IAAI;IAgCZ,OAAO,CAAC,IAAI;CAGb"}
1
+ {"version":3,"file":"CursorPrompt.d.ts","sourceRoot":"","sources":["../../../../src/appui-react/cursor/cursorprompt/CursorPrompt.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,qBAAqB,CAAC;AAe7B,UAAU,mBAAmB;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAKD,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB;;EA+FxD"}
@@ -8,64 +8,101 @@
8
8
  import "./CursorPrompt.scss";
9
9
  import * as React from "react";
10
10
  import { RelativePosition } from "@itwin/appui-abstract";
11
+ import { Logger } from "@itwin/core-bentley";
11
12
  import { Icon, Timer } from "@itwin/core-react";
12
13
  import { Point } from "@itwin/core-react/internal";
13
14
  import { Text } from "@itwin/itwinui-react";
14
15
  import { CursorInformation, useCursorInformationStore, } from "../CursorInformation.js";
15
16
  import { CursorPopupManager } from "../cursorpopup/CursorPopupManager.js";
17
+ import { UiFramework } from "../../UiFramework.js";
18
+ import { useDraggedItem } from "../../layout/base/DragManager.js";
19
+ const popupId = "cursor-prompt";
20
+ const getCategory = () => UiFramework.loggerCategory("useCursorPrompt");
16
21
  /** @internal */
17
- export class CursorPrompt {
18
- constructor() {
19
- this._popupId = "cursor-prompt";
20
- }
21
- open({ timeout, fadeout, iconSpec, instruction, promptAtContent, }) {
22
- if (!this._removeListeners) {
23
- const listeners = [
24
- CursorInformation.onCursorUpdatedEvent.addListener((args) => {
25
- CursorPopupManager.updatePosition(args.newPt);
26
- }),
27
- useCursorInformationStore.subscribe((state) => {
28
- if (!promptAtContent)
29
- return;
30
- if (state.contentHovered) {
31
- this.show({
32
- iconSpec,
33
- instruction,
34
- });
35
- return;
36
- }
37
- this.hide(fadeout);
38
- }),
39
- ];
40
- this._removeListeners = () => {
41
- listeners.forEach((remove) => remove());
42
- };
22
+ export function useCursorPrompt(args) {
23
+ const { show, timeout, instruction, iconSpec, promptAtContent } = args;
24
+ const lastArgsRef = React.useRef(args);
25
+ React.useEffect(() => {
26
+ lastArgsRef.current = args;
27
+ }, [args]);
28
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
29
+ const timerRef = React.useRef();
30
+ const [isOpen, setIsOpen] = React.useState(false);
31
+ const dragged = !!useDraggedItem();
32
+ // Workaround to make sure the prompt is not shown when dragging a widget.
33
+ const [draggedRecently, setDraggedRecently] = React.useState(false);
34
+ React.useEffect(() => {
35
+ if (dragged) {
36
+ Logger.logTrace(getCategory(), "dragged recently");
37
+ setDraggedRecently(true);
38
+ return;
43
39
  }
44
- this.show({ iconSpec, instruction });
40
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
41
+ const timer = new Timer(250);
42
+ timer.setOnExecute(() => {
43
+ Logger.logTrace(getCategory(), "reset dragged recently");
44
+ setDraggedRecently(false);
45
+ });
46
+ timer.start();
47
+ return () => {
48
+ timer.stop();
49
+ };
50
+ }, [dragged]);
51
+ const contentHovered = useCursorInformationStore((state) => state.contentHovered);
52
+ const shouldOpen = React.useMemo(() => {
53
+ if (!show)
54
+ return false;
55
+ if (!isOpen)
56
+ return false;
57
+ if (promptAtContent && (dragged || draggedRecently))
58
+ return false;
59
+ if (promptAtContent && !contentHovered)
60
+ return false;
61
+ return true;
62
+ }, [show, isOpen, dragged, draggedRecently, promptAtContent, contentHovered]);
63
+ React.useEffect(() => {
45
64
  if (timeout === Number.POSITIVE_INFINITY)
46
65
  return;
47
66
  // eslint-disable-next-line @typescript-eslint/no-deprecated
48
67
  const timer = new Timer(timeout);
49
- timer.setOnExecute(() => this.close(fadeout));
50
- timer.start();
51
- this._timer = timer;
52
- }
53
- close(fadeout) {
54
- this._timer?.stop();
55
- this._timer = undefined;
56
- this._removeListeners?.();
57
- this._removeListeners = undefined;
58
- this.hide(fadeout);
59
- }
60
- show({ iconSpec, instruction, }) {
61
- const promptElement = (React.createElement("div", { className: "uifw-cursor-prompt" },
62
- iconSpec && (React.createElement("span", { className: "uifw-cursor-prompt-icon" },
63
- React.createElement(Icon, { iconSpec: iconSpec }))),
64
- React.createElement(Text, { variant: "body", className: "uifw-cursor-prompt-text" }, instruction)));
65
- CursorPopupManager.open(this._popupId, promptElement, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomRight, 0, { shadow: true });
66
- }
67
- hide(fadeout) {
68
- CursorPopupManager.close(this._popupId, false, fadeout);
69
- }
68
+ timer.setOnExecute(() => {
69
+ Logger.logTrace(getCategory(), "timer expired");
70
+ setIsOpen(false);
71
+ });
72
+ timer.delay = timeout;
73
+ timerRef.current = timer;
74
+ return () => {
75
+ timer.stop();
76
+ };
77
+ }, [timeout]);
78
+ React.useEffect(() => {
79
+ if (!shouldOpen)
80
+ return;
81
+ if (!instruction)
82
+ return;
83
+ Logger.logTrace(getCategory(), "open");
84
+ CursorPopupManager.open(popupId, React.createElement(CursorPrompt, { iconSpec: iconSpec, instruction: instruction }), CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomRight, 0, { shadow: true }, CursorInformation.cursorDocument);
85
+ return () => {
86
+ Logger.logTrace(getCategory(), "close");
87
+ CursorPopupManager.close(popupId, false, lastArgsRef.current.fadeOut);
88
+ };
89
+ }, [shouldOpen, instruction, iconSpec]);
90
+ React.useEffect(() => {
91
+ return CursorInformation.onCursorUpdatedEvent.addListener((args) => {
92
+ CursorPopupManager.updatePosition(args.newPt, CursorInformation.cursorDocument);
93
+ });
94
+ }, []);
95
+ const open = React.useCallback(() => {
96
+ Logger.logTrace(getCategory(), "request open");
97
+ setIsOpen(true);
98
+ timerRef.current?.start();
99
+ }, []);
100
+ return { open };
101
+ }
102
+ function CursorPrompt({ iconSpec, instruction, }) {
103
+ return (React.createElement("div", { className: "uifw-cursor-prompt" },
104
+ iconSpec && (React.createElement("span", { className: "uifw-cursor-prompt-icon" },
105
+ React.createElement(Icon, { iconSpec: iconSpec }))),
106
+ React.createElement(Text, { variant: "body", className: "uifw-cursor-prompt-text" }, instruction)));
70
107
  }
71
108
  //# sourceMappingURL=CursorPrompt.js.map