@itwin/tree-widget-react 4.0.0-alpha.6 → 4.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -1
- package/README.md +2 -1
- package/lib/esm/tree-widget-react/TreeWidget.js +1 -1
- package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/SearchBox.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js +1 -0
- package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.css +2 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +9 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +50 -4
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +17 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +561 -161
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +6 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +115 -40
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +30 -15
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +192 -38
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +18 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +30 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.d.ts +24 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js +785 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.d.ts +39 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js +221 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +5 -17
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +5 -62
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.d.ts +2 -0
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +4 -2
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js +2 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js +2 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +33 -23
- package/lib/esm/tree-widget-react/components/trees/common/Utils.js +60 -47
- package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js +3 -3
- package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.css +2 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +4 -4
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.d.ts +44 -0
- package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/AlwaysAndNeverDrawnElementInfo.js +81 -31
- package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.d.ts +33 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js +37 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.d.ts +16 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +72 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.d.ts → internal/Rxjs.d.ts} +9 -2
- package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.js → internal/Rxjs.js} +9 -2
- package/lib/esm/tree-widget-react/components/trees/common/internal/Rxjs.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.d.ts → internal/Tooltip.d.ts} +5 -1
- package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.js → internal/Tooltip.js} +7 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Types.d.ts +14 -0
- package/lib/esm/tree-widget-react/components/trees/{categories-tree/internal/ClassNameDefinitions.js → common/internal/Types.js} +2 -7
- package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveViewport.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.d.ts → internal/UseHierarchiesLocalization.d.ts} +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.js → internal/UseHierarchiesLocalization.js} +6 -2
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchiesLocalization.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.d.ts → internal/UseHierarchyFiltering.d.ts} +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.js → internal/UseHierarchyFiltering.js} +4 -3
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchyFiltering.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.d.ts → internal/UseIModelChangeListener.d.ts} +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.js → internal/UseIModelChangeListener.js} +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelChangeListener.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +47 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +101 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.d.ts +20 -0
- package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/VisibilityChangeEventListener.js +17 -9
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +82 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +234 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +1 -0
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +3 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +13 -9
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +13 -0
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +39 -38
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +5 -5
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +25 -24
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +9 -5
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +7 -2
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +73 -70
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +47 -29
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +7 -9
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +4 -6
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -5
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +54 -104
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +0 -26
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +75 -291
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/lib/public/locales/en/TreeWidget.json +51 -6
- package/package.json +17 -18
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.d.ts +0 -37
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +0 -214
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +0 -7
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.d.ts +0 -11
- package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js +0 -24
- package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchiesLocalization.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyFiltering.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseIModelChangeListener.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +0 -7
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +0 -21
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +0 -29
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +0 -12
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +0 -1
- /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.d.ts → internal/UseActiveViewport.d.ts} +0 -0
- /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.js → internal/UseActiveViewport.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoriesTreeVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.ts"],"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\nimport {\n concat,\n concatAll,\n defaultIfEmpty,\n defer,\n EMPTY,\n filter,\n firstValueFrom,\n forkJoin,\n from,\n fromEventPattern,\n map,\n merge,\n mergeAll,\n mergeMap,\n of,\n reduce,\n shareReplay,\n startWith,\n Subject,\n take,\n takeUntil,\n tap,\n toArray,\n} from \"rxjs\";\nimport { assert, Id64 } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyNode, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { AlwaysAndNeverDrawnElementInfo } from \"../../common/internal/AlwaysAndNeverDrawnElementInfo.js\";\nimport { toVoidPromise } from \"../../common/internal/Rxjs.js\";\nimport { createVisibilityStatus, getTooltipOptions } from \"../../common/internal/Tooltip.js\";\nimport { getClassesByView, getDistinctMapValues, releaseMainThreadOnItemsCount, setDifference, setIntersection } from \"../../common/internal/Utils.js\";\nimport { createVisibilityChangeEventListener } from \"../../common/internal/VisibilityChangeEventListener.js\";\nimport {\n changeElementStateNoChildrenOperator,\n enableCategoryDisplay,\n enableSubCategoryDisplay,\n filterSubModeledElementIds,\n getElementOverriddenVisibility,\n getElementVisibility,\n getSubModeledElementsVisibilityStatus,\n getVisibilityFromAlwaysAndNeverDrawnElementsImpl,\n mergeVisibilityStatuses,\n} from \"../../common/internal/VisibilityUtils.js\";\nimport { createVisibilityHandlerResult } from \"../../common/UseHierarchyVisibility.js\";\nimport { CategoriesTreeNode } from \"./CategoriesTreeNode.js\";\nimport { createFilteredTree, parseCategoryKey, parseSubCategoryKey } from \"./FilteredTree.js\";\n\nimport type { CategoryAlwaysOrNeverDrawnElementsQueryProps } from \"../../common/internal/AlwaysAndNeverDrawnElementInfo.js\";\nimport type { GetVisibilityFromAlwaysAndNeverDrawnElementsProps } from \"../../common/internal/VisibilityUtils.js\";\nimport type { Observable, Subscription } from \"rxjs\";\nimport type { Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { GroupingHierarchyNode, HierarchyFilteringPath } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector } from \"@itwin/presentation-shared\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { NonPartialVisibilityStatus } from \"../../common/internal/Tooltip.js\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"../CategoriesTreeDefinition.js\";\nimport type { CategoriesTreeIdsCache } from \"./CategoriesTreeIdsCache.js\";\nimport type { FilteredTree } from \"./FilteredTree.js\";\nimport type { IVisibilityChangeEventListener } from \"../../common/internal/VisibilityChangeEventListener.js\";\nimport type { CategoryId, ElementId, ModelId } from \"../../common/internal/Types.js\";\n\n/** @alpha */\ninterface GetCategoryVisibilityStatusProps {\n categoryIds: Id64Array;\n modelId?: Id64String;\n ignoreSubCategories?: boolean;\n}\n\n/** @alpha */\ninterface ChangeCategoryVisibilityStateProps extends GetCategoryVisibilityStatusProps {\n on: boolean;\n}\n\n/** @alpha */\ninterface GetGeometricElementVisibilityStatusProps {\n elementId: Id64String;\n modelId: Id64String;\n categoryId: Id64String;\n}\n\n/** @alpha */\ninterface ChangeGeometricElementsDisplayStateProps {\n elementIds: Id64Set;\n modelId: Id64String;\n categoryId: Id64String;\n on: boolean;\n}\n\n/** @alpha */\ninterface ChangeModelVisibilityStateProps {\n ids: Id64Arg;\n on: boolean;\n}\n\n/** @alpha */\ninterface GetFilteredNodeVisibilityProps {\n node: HierarchyNode;\n}\n\n/** @alpha */\ninterface ChangeFilteredNodeVisibilityProps extends GetFilteredNodeVisibilityProps {\n on: boolean;\n}\n\n/**\n * Props for `createCategoriesTreeVisibilityHandler`.\n * @internal\n */\nexport interface CategoriesTreeVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: CategoriesTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector;\n filteredPaths?: HierarchyFilteringPath[];\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/**\n * Creates an instance if `CategoriesTreeVisibilityHandler`.\n * @internal\n */\nexport function createCategoriesTreeVisibilityHandler(props: CategoriesTreeVisibilityHandlerProps): HierarchyVisibilityHandler & Disposable {\n return new CategoriesTreeVisibilityHandlerImpl(props);\n}\n\nclass CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler {\n private readonly _eventListener: IVisibilityChangeEventListener;\n private readonly _alwaysAndNeverDrawnElements: AlwaysAndNeverDrawnElementInfo;\n private readonly _idsCache: CategoriesTreeIdsCache;\n private _filteredTree: Promise<FilteredTree> | undefined;\n private _elementChangeQueue = new Subject<Observable<void>>();\n private _subscriptions: Subscription[] = [];\n private _changeRequest = new Subject<{ key: HierarchyNodeKey; depth: number }>();\n\n constructor(private readonly _props: CategoriesTreeVisibilityHandlerProps) {\n this._eventListener = createVisibilityChangeEventListener({\n viewport: _props.viewport,\n listeners: {\n models: _props.hierarchyConfig.showElements,\n categories: true,\n elements: _props.hierarchyConfig.showElements,\n displayStyle: true,\n },\n });\n this._alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo(_props.viewport);\n this._idsCache = this._props.idsCache;\n const { categoryClass, elementClass, modelClass } = getClassesByView(_props.viewport.view.is2d() ? \"2d\" : \"3d\");\n if (_props.filteredPaths) {\n this._filteredTree = createFilteredTree({\n idsCache: this._idsCache,\n filteringPaths: _props.filteredPaths,\n categoryClassName: categoryClass,\n categoryElementClassName: elementClass,\n categoryModelClassName: modelClass,\n imodelAccess: this._props.imodelAccess,\n });\n }\n this._subscriptions.push(this._elementChangeQueue.pipe(concatAll()).subscribe());\n }\n\n public get onVisibilityChange() {\n return this._eventListener.onVisibilityChange;\n }\n\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n return firstValueFrom(\n this.getVisibilityStatusObs(node).pipe(\n // unsubscribe from the observable if the change request for this node is received\n takeUntil(this._changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),\n // unsubscribe if visibility changes\n takeUntil(\n fromEventPattern(\n (handler) => {\n this._eventListener.onVisibilityChange.addListener(handler);\n },\n (handler) => {\n this._eventListener.onVisibilityChange.removeListener(handler);\n },\n ),\n ),\n defaultIfEmpty(createVisibilityStatus(\"hidden\")),\n ),\n );\n }\n\n public async changeVisibility(node: HierarchyNode, shouldDisplay: boolean): Promise<void> {\n // notify about new change request\n this._changeRequest.next({ key: node.key, depth: node.parentKeys.length });\n\n const changeObservable = this.changeVisibilityObs(node, shouldDisplay).pipe(\n // unsubscribe from the observable if the change request for this node is received\n takeUntil(this._changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),\n tap({\n subscribe: () => {\n this._eventListener.suppressChangeEvents();\n this._alwaysAndNeverDrawnElements.suppressChangeEvents();\n },\n finalize: () => {\n this._eventListener.resumeChangeEvents();\n this._alwaysAndNeverDrawnElements.resumeChangeEvents();\n },\n }),\n );\n\n return toVoidPromise(changeObservable);\n }\n\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public [Symbol.dispose]() {\n this._eventListener[Symbol.dispose]();\n this._alwaysAndNeverDrawnElements[Symbol.dispose]();\n this._subscriptions.forEach((x) => x.unsubscribe());\n }\n\n private getVisibilityStatusObs(node: HierarchyNode): Observable<VisibilityStatus> {\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.getFilteredNodeVisibility({ node });\n }\n\n if (HierarchyNode.isClassGroupingNode(node)) {\n return this.getClassGroupingNodeDisplayStatus(node);\n }\n\n if (!HierarchyNode.isInstancesNode(node)) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return this.getDefinitionContainerDisplayStatus({\n definitionContainerIds: node.key.instanceKeys.map((instanceKey) => instanceKey.id),\n });\n }\n\n if (CategoriesTreeNode.isModelNode(node)) {\n return this.getModelVisibilityStatus({\n modelId: node.key.instanceKeys[0].id,\n });\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return this.getCategoryDisplayStatus({\n categoryIds: node.key.instanceKeys.map((instanceKey) => instanceKey.id),\n modelId: CategoriesTreeNode.getModelId(node),\n ignoreSubCategories: node.extendedData?.isCategoryOfSubModel,\n });\n }\n\n const categoryId = CategoriesTreeNode.getCategoryId(node);\n if (!categoryId) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n return this.getSubCategoryDisplayStatus({\n categoryId,\n subCategoryIds: node.key.instanceKeys.map((instanceKey) => instanceKey.id),\n });\n }\n\n const modelId = CategoriesTreeNode.getModelId(node);\n if (!modelId) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n return this.getElementDisplayStatus({\n elementId: node.key.instanceKeys[0].id,\n modelId,\n categoryId,\n });\n }\n\n private getFilteredNodeVisibility(props: GetFilteredNodeVisibilityProps) {\n return from(this.getVisibilityChangeTargets(props)).pipe(\n mergeMap(({ definitionContainerIds: definitionContainers, subCategories, modelIds: models, categories, elements }) => {\n const observables = new Array<Observable<VisibilityStatus>>();\n if (definitionContainers?.size) {\n observables.push(\n from(definitionContainers).pipe(\n mergeMap((definitionContainerId) =>\n this.getDefinitionContainerDisplayStatus({ definitionContainerIds: [definitionContainerId], ignoreTooltip: true }),\n ),\n ),\n );\n }\n\n if (models?.size) {\n observables.push(from(models).pipe(mergeMap((modelId) => this.getModelVisibilityStatus({ modelId }))));\n }\n\n if (categories?.size) {\n observables.push(\n from(categories).pipe(\n mergeMap((key) => {\n const { modelId, categoryId } = parseCategoryKey(key);\n return this.getCategoryDisplayStatus({ ignoreTooltip: true, ignoreSubCategories: !!modelId, modelId, categoryIds: [categoryId] });\n }),\n ),\n );\n }\n\n if (subCategories?.size) {\n observables.push(\n from(subCategories).pipe(\n mergeMap((key) => {\n const { subCategoryId, categoryId } = parseSubCategoryKey(key);\n return this.getSubCategoryDisplayStatus({ subCategoryIds: [subCategoryId], categoryId, ignoreTooltip: true });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n observables.push(\n from(elements).pipe(\n releaseMainThreadOnItemsCount(50),\n mergeMap(([categoryKey, elementIds]) => {\n const { modelId, categoryId } = parseCategoryKey(categoryKey);\n assert(modelId !== undefined);\n return from(elementIds).pipe(\n releaseMainThreadOnItemsCount(1000),\n mergeMap((elementId) => this.getElementDisplayStatus({ modelId, categoryId, elementId, ignoreTooltip: true })),\n );\n }),\n ),\n );\n }\n\n return merge(...observables);\n }),\n mergeVisibilityStatuses({ visible: undefined, hidden: undefined, partial: undefined }),\n );\n }\n\n private getModelVisibilityStatus({ modelId }: { modelId: Id64String }): Observable<VisibilityStatus> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n\n if (!viewport.view.viewsModel(modelId)) {\n return from(this._idsCache.getModelCategoryIds(modelId)).pipe(\n mergeMap((categoryIds) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))),\n getSubModeledElementsVisibilityStatus({\n ignoreTooltips: true,\n tooltips: { visible: undefined, hidden: undefined, partial: undefined },\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),\n }),\n );\n }\n\n return from(this._idsCache.getModelCategoryIds(modelId)).pipe(\n mergeAll(),\n mergeMap((categoryId) => this.getCategoryDisplayStatus({ modelId, categoryIds: [categoryId], ignoreSubCategories: true, ignoreTooltip: true })),\n mergeVisibilityStatuses(\n {\n visible: undefined,\n hidden: undefined,\n partial: undefined,\n },\n true,\n ),\n );\n });\n return createVisibilityHandlerResult(this, { id: modelId }, result, undefined);\n }\n\n private getDefinitionContainerDisplayStatus(props: { definitionContainerIds: Id64Array; ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n return from(this._idsCache.getAllContainedCategories(props.definitionContainerIds)).pipe(\n mergeAll(),\n mergeMap((categoryId) => {\n return this.getCategoryDisplayStatus({ categoryIds: [categoryId], ignoreTooltip: true });\n }),\n mergeVisibilityStatuses({\n visible: \"categoriesTree.definitionContainer.visibleThroughCategories\",\n hidden: \"categoriesTree.definitionContainer.hiddenThroughCategories\",\n partial: \"categoriesTree.definitionContainer.partialThroughCategories\",\n }),\n );\n });\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n private getSubCategoryDisplayStatus(props: { categoryId: Id64String; subCategoryIds: Id64Array; ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n const { categoryId, subCategoryIds, ignoreTooltip } = props;\n const categoryOverrideResult = this.getCategoryVisibilityFromOverrides([categoryId], ignoreTooltip);\n if (categoryOverrideResult !== \"none\" && (categoryOverrideResult.state === \"hidden\" || categoryOverrideResult.state === \"visible\")) {\n return of(\n createVisibilityStatus(\n categoryOverrideResult.state,\n getTooltipOptions(`categoriesTree.subCategory.${categoryOverrideResult.state}ThroughCategoryOverride`),\n ),\n );\n }\n\n if (!this._props.viewport.view.viewsCategory(categoryId)) {\n return of(createVisibilityStatus(\"hidden\", getTooltipOptions(\"categoriesTree.subCategory.hiddenThroughCategory\", ignoreTooltip)));\n }\n\n let visibleCount = 0;\n let hiddenCount = 0;\n for (const subCategoryId of subCategoryIds) {\n const isVisible = this._props.viewport.isSubCategoryVisible(subCategoryId);\n if (isVisible) {\n ++visibleCount;\n } else {\n ++hiddenCount;\n }\n if (visibleCount > 0 && hiddenCount > 0) {\n return of(createVisibilityStatus(\"partial\", getTooltipOptions(\"categoriesTree.subCategory.partialThroughSubCategory\", ignoreTooltip)));\n }\n }\n return of(visibleCount > 0 ? createVisibilityStatus(\"visible\") : createVisibilityStatus(\"hidden\"));\n });\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n private getCategoryVisibilityFromOverrides(categoryIds: Id64Array, ignoreTooltip?: boolean): VisibilityStatus | \"none\" {\n let showOverrides = 0;\n let hideOverrides = 0;\n\n for (const currentOverride of this._props.viewport.perModelCategoryVisibility) {\n if (categoryIds.includes(currentOverride.categoryId)) {\n if (currentOverride.visible) {\n ++showOverrides;\n } else {\n ++hideOverrides;\n }\n\n if (showOverrides > 0 && hideOverrides > 0) {\n return createVisibilityStatus(\"partial\", getTooltipOptions(\"categoriesTree.category.partialThroughOverrides\", ignoreTooltip));\n }\n }\n }\n\n if (showOverrides === 0 && hideOverrides === 0) {\n return \"none\";\n }\n const visibility = showOverrides > 0 ? \"visible\" : \"hidden\";\n return createVisibilityStatus(visibility, getTooltipOptions(`categoriesTree.category.${visibility}ThroughOverrides`, ignoreTooltip));\n }\n\n private getDefaultModelsCategoryVisibilityStatus({\n modelId,\n categoryIds,\n ignoreTooltip,\n }: {\n categoryIds: Id64Array;\n modelId: Id64String;\n ignoreTooltip?: boolean;\n }): VisibilityStatus {\n const viewport = this._props.viewport;\n\n if (!viewport.view.viewsModel(modelId)) {\n return createVisibilityStatus(\"hidden\", getTooltipOptions(\"categoriesTree.category.hiddenThroughModel\", ignoreTooltip));\n }\n\n let visibleCount = 0;\n let hiddenCount = 0;\n let visibleThroughCategorySelectorCount = 0;\n for (const categoryId of categoryIds) {\n if (viewport.view.viewsCategory(categoryId)) {\n ++visibleThroughCategorySelectorCount;\n }\n\n const override = this._props.viewport.perModelCategoryVisibility.getOverride(modelId, categoryId);\n if (override === PerModelCategoryVisibility.Override.Show) {\n ++visibleCount;\n continue;\n }\n if (override === PerModelCategoryVisibility.Override.Hide) {\n ++hiddenCount;\n continue;\n }\n if (visibleCount > 0 && hiddenCount > 0) {\n return createVisibilityStatus(\"partial\", getTooltipOptions(\"categoriesTree.category.partialThroughOverrides\", ignoreTooltip));\n }\n }\n if (hiddenCount + visibleCount > 0) {\n const overridenVisibility = hiddenCount > 0 ? \"hidden\" : \"visible\";\n return createVisibilityStatus(overridenVisibility, getTooltipOptions(`categoriesTree.category.${overridenVisibility}ThroughOverrides`, ignoreTooltip));\n }\n\n const visbility = visibleThroughCategorySelectorCount > 0 ? \"visible\" : \"hidden\";\n\n return createVisibilityStatus(visbility, getTooltipOptions(`categoriesTree.category.${visbility}ThroughCategorySelector`, ignoreTooltip));\n }\n\n private async getDefaultCategoryVisibilityStatus({\n categoryIds,\n ignoreTooltip,\n ignoreSubCategories,\n }: {\n categoryIds: Array<CategoryId>;\n ignoreTooltip?: boolean;\n ignoreSubCategories?: boolean;\n }): Promise<VisibilityStatus> {\n const overrideResult = this.getCategoryVisibilityFromOverrides(categoryIds);\n if (overrideResult !== \"none\") {\n return overrideResult;\n }\n let hiddenCount = 0;\n for (const categoryId of categoryIds) {\n const isVisible = this._props.viewport.view.viewsCategory(categoryId);\n if (!isVisible) {\n ++hiddenCount;\n }\n }\n\n if (hiddenCount > 0 || this._props.hierarchyConfig.hideSubCategories || ignoreSubCategories) {\n const visibility = hiddenCount > 0 ? \"hidden\" : \"visible\";\n return createVisibilityStatus(visibility, getTooltipOptions(`categoriesTree.category.${visibility}ThroughCategorySelector`, ignoreTooltip));\n }\n\n const subCategories = getDistinctMapValues(await this._idsCache.getSubCategories(categoryIds));\n let visibleSubCategoryCount = 0;\n let hiddenSubCategoryCount = 0;\n\n for (const subCategory of subCategories) {\n const isVisible = this._props.viewport.isSubCategoryVisible(subCategory);\n if (isVisible) {\n ++visibleSubCategoryCount;\n } else {\n ++hiddenSubCategoryCount;\n }\n if (hiddenSubCategoryCount > 0 && visibleSubCategoryCount > 0) {\n return createVisibilityStatus(\"partial\", getTooltipOptions(\"categoriesTree.category.partialThroughSubCategories\", ignoreTooltip));\n }\n }\n const subCategoryVisiblity = hiddenSubCategoryCount > 0 ? \"hidden\" : \"visible\";\n const reason = subCategories.size > 0 ? \"ThroughSubCategories\" : \"ThroughCategorySelector\";\n\n return createVisibilityStatus(subCategoryVisiblity, getTooltipOptions(`categoriesTree.category.${subCategoryVisiblity}${reason}`, ignoreTooltip));\n }\n\n private getCategoryDisplayStatus({ ignoreTooltip, ...props }: GetCategoryVisibilityStatusProps & { ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this._props.hierarchyConfig.showElements) {\n return from(this.getDefaultCategoryVisibilityStatus({ categoryIds: props.categoryIds, ignoreTooltip }));\n }\n\n const modelsObservable = props.modelId\n ? of(new Map(props.categoryIds.map((id) => [id, [props.modelId as string]])))\n : from(this._idsCache.getCategoriesElementModels(props.categoryIds));\n return merge(\n // get visibility status from always and never drawn elements\n this._props.hierarchyConfig.showElements\n ? modelsObservable.pipe(\n mergeMap((categoryModelsMap) => {\n if (categoryModelsMap.size === 0) {\n return props.modelId\n ? of(this.getDefaultModelsCategoryVisibilityStatus({ modelId: props.modelId, categoryIds: props.categoryIds, ignoreTooltip }))\n : from(this.getDefaultCategoryVisibilityStatus({ categoryIds: props.categoryIds, ignoreTooltip }));\n }\n return from(categoryModelsMap).pipe(\n mergeMap(([category, models]) =>\n from(models).pipe(\n mergeMap((model) => {\n if (this._props.viewport.view.viewsModel(model)) {\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n queryProps: props,\n tooltips: {\n allElementsInAlwaysDrawnList: \"categoriesTree.category.allElementsVisible\",\n allElementsInNeverDrawnList: \"categoriesTree.category.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"categoriesTree.category.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"categoriesTree.category.allElementsHidden\",\n },\n defaultStatus: () => this.getDefaultModelsCategoryVisibilityStatus({ modelId: model, categoryIds: [category], ignoreTooltip }),\n ignoreTooltip: true,\n }).pipe(\n mergeMap((visibilityStatusAlwaysAndNeverDraw) => {\n return from(this._idsCache.getCategoriesModeledElements(model, [category])).pipe(\n getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: undefined,\n partial: undefined,\n },\n parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,\n ignoreTooltips: true,\n getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),\n }),\n );\n }),\n );\n }\n return from(this._idsCache.getCategoriesModeledElements(model, [category])).pipe(\n getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: undefined,\n partial: undefined,\n },\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n ignoreTooltips: true,\n getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),\n }),\n );\n }),\n mergeVisibilityStatuses({ visible: undefined, hidden: undefined, partial: undefined }),\n ),\n ),\n mergeVisibilityStatuses(\n {\n visible: \"categoriesTree.category.allElementsVisible\",\n hidden: \"categoriesTree.category.allElementsHidden\",\n partial: \"categoriesTree.category.someElementsHidden\",\n },\n ignoreTooltip,\n ),\n );\n }),\n map((visibilityStatus) => {\n return { visibilityStatus, type: 0 as const };\n }),\n )\n : EMPTY,\n // get category status\n (props.modelId\n ? of(this.getDefaultModelsCategoryVisibilityStatus({ modelId: props.modelId, categoryIds: props.categoryIds, ignoreTooltip }))\n : from(this.getDefaultCategoryVisibilityStatus({ categoryIds: props.categoryIds, ignoreTooltip }))\n ).pipe(\n map((visibilityStatus) => {\n return { visibilityStatus, type: 1 as const };\n }),\n ),\n ).pipe(\n toArray(),\n mergeMap(\n async (\n visibilityStatusesInfo: Array<{ visibilityStatus: VisibilityStatus; type: 1 } | { visibilityStatus: VisibilityStatus | undefined; type: 0 }>,\n ) => {\n let defaultStatus: VisibilityStatus | undefined;\n let alwaysNeverDrawStatus: VisibilityStatus | undefined;\n visibilityStatusesInfo.forEach((visibilityStatusInfo) => {\n switch (visibilityStatusInfo.type) {\n case 0:\n alwaysNeverDrawStatus = visibilityStatusInfo.visibilityStatus;\n break;\n case 1:\n defaultStatus = visibilityStatusInfo.visibilityStatus;\n break;\n }\n });\n assert(defaultStatus !== undefined);\n\n if (defaultStatus.state === \"partial\") {\n return defaultStatus;\n }\n\n // This can happen if:\n // a) showElements is set to false\n // b) root category does not have any elements (that dont have Parent)\n // In both cases we don't need to look at modeled elements visibility\n if (alwaysNeverDrawStatus === undefined) {\n return defaultStatus;\n }\n // In cases where\n // a) SubCategories are hidden\n // b) Category needs to ignore subCategories\n // c) Category has model (it means that category is under hidden subModel)\n // We dont need to look at default category status, it is already accounted for in always/never drawn visibility\n if (this._props.hierarchyConfig.hideSubCategories || props.ignoreSubCategories || props.modelId) {\n return alwaysNeverDrawStatus;\n }\n if ((await this._idsCache.getSubCategories(props.categoryIds)).size === 0) {\n return alwaysNeverDrawStatus;\n }\n\n if (alwaysNeverDrawStatus.state === \"partial\") {\n return createVisibilityStatus(\"partial\", getTooltipOptions(\"categoriesTree.category.someChildrenVisible\", ignoreTooltip));\n }\n if (alwaysNeverDrawStatus.state === \"hidden\") {\n if (defaultStatus.state === \"hidden\") {\n return createVisibilityStatus(\"hidden\", getTooltipOptions(\"categoriesTree.category.allChildrenHidden\", ignoreTooltip));\n }\n return createVisibilityStatus(\"partial\", getTooltipOptions(\"categoriesTree.category.partialThroughSubCategories\", ignoreTooltip));\n }\n if (defaultStatus.state === \"hidden\") {\n return createVisibilityStatus(\"partial\", getTooltipOptions(\"categoriesTree.category.someChildrenVisible\", ignoreTooltip));\n }\n return createVisibilityStatus(\"visible\", getTooltipOptions(\"categoriesTree.category.allChildrenVisible\", ignoreTooltip));\n },\n ),\n );\n });\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n private getClassGroupingNodeDisplayStatus(node: GroupingHierarchyNode): Observable<VisibilityStatus> {\n const result = defer(() => {\n const info = this.getGroupingNodeInfo(node);\n\n const { modelElementsMap, categoryId } = info;\n return from(modelElementsMap).pipe(\n mergeMap(([modelId, elementIds]) => {\n if (!this._props.viewport.view.viewsModel(modelId)) {\n return of([...elementIds]).pipe(\n filterSubModeledElementIds({ doesSubModelExist: async (id) => this._idsCache.hasSubModel(id) }),\n getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: undefined,\n partial: undefined,\n },\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),\n }),\n );\n }\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n elements: elementIds,\n defaultStatus: () => {\n const status = this.getDefaultModelsCategoryVisibilityStatus({ categoryIds: [categoryId], modelId, ignoreTooltip: true });\n return createVisibilityStatus(status.state, getTooltipOptions(`categoriesTree.groupingNode.${status.state}ThroughCategory`));\n },\n tooltips: {\n allElementsInAlwaysDrawnList: \"categoriesTree.groupingNode.allElementsVisible\",\n allElementsInNeverDrawnList: \"categoriesTree.groupingNode.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"categoriesTree.groupingNode.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"categoriesTree.groupingNode.allElementsHidden\",\n },\n }).pipe(\n mergeMap((visibilityStatusAlwaysAndNeverDraw) => {\n return of([...elementIds]).pipe(\n filterSubModeledElementIds({ doesSubModelExist: async (id) => this._idsCache.hasSubModel(id) }),\n getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: undefined,\n partial: undefined,\n },\n parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,\n getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),\n }),\n );\n }),\n );\n }),\n mergeVisibilityStatuses(\n {\n visible: undefined,\n hidden: undefined,\n partial: undefined,\n },\n true,\n ),\n );\n });\n return createVisibilityHandlerResult(this, { node }, result, undefined);\n }\n\n private getElementDisplayStatus({\n ignoreTooltip,\n ...props\n }: GetGeometricElementVisibilityStatusProps & { ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result: Observable<VisibilityStatus> = defer(() => {\n const viewport = this._props.viewport;\n const { elementId, modelId, categoryId } = props;\n\n const viewsModel = viewport.view.viewsModel(modelId);\n const elementStatus = getElementOverriddenVisibility({\n elementId,\n ignoreTooltip,\n viewport,\n tooltips: {\n visibileThorughAlwaysDrawn: \"categoriesTree.element.displayedThroughAlwaysDrawnList\",\n hiddenThroughAlwaysDrawnExclusive: \"categoriesTree.element.hiddenDueToOtherElementsExclusivelyAlwaysDrawn\",\n hiddenThroughNeverDrawn: \"categoriesTree.element.hiddenThroughNeverDrawnList\",\n },\n });\n\n return from(this._idsCache.hasSubModel(elementId)).pipe(\n mergeMap((hasSubModel) => (hasSubModel ? this.getModelVisibilityStatus({ modelId: elementId }) : of(undefined))),\n map((subModelVisibilityStatus) =>\n getElementVisibility(\n ignoreTooltip,\n viewsModel,\n elementStatus,\n this.getDefaultModelsCategoryVisibilityStatus({ categoryIds: [categoryId], modelId, ignoreTooltip: true }) as unknown as NonPartialVisibilityStatus,\n \"categoriesTree\",\n subModelVisibilityStatus,\n ),\n ),\n );\n });\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n /** Changes visibility of the items represented by the tree node. */\n private changeVisibilityObs(node: HierarchyNode, on: boolean): Observable<void> {\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n\n if (HierarchyNode.isClassGroupingNode(node)) {\n return this.changeElementGroupingNodeState(node, on);\n }\n\n if (!HierarchyNode.isInstancesNode(node)) {\n return EMPTY;\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return this.changeDefinitionContainerState({\n definitionContainerIds: node.key.instanceKeys.map((instanceKey) => instanceKey.id),\n on,\n });\n }\n\n if (CategoriesTreeNode.isModelNode(node)) {\n return this.changeModelState({\n ids: node.key.instanceKeys.map(({ id }) => id),\n on,\n });\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return this.changeCategoryState({\n categoryIds: node.key.instanceKeys.map((instanceKey) => instanceKey.id),\n modelId: CategoriesTreeNode.getModelId(node),\n on,\n ignoreSubCategories: node.extendedData?.isCategoryOfSubModel,\n });\n }\n\n const categoryId = CategoriesTreeNode.getCategoryId(node);\n if (!categoryId) {\n return EMPTY;\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n if (this._props.hierarchyConfig.hideSubCategories) {\n return EMPTY;\n }\n return this.changeSubCategoryState({\n categoryId,\n subCategoryIds: node.key.instanceKeys.map((instanceKey) => instanceKey.id),\n on,\n });\n }\n\n if (!this._props.hierarchyConfig.showElements) {\n return EMPTY;\n }\n\n const modelId = CategoriesTreeNode.getModelId(node);\n if (!modelId) {\n return EMPTY;\n }\n\n return this.changeElementsState({\n elementIds: new Set([...node.key.instanceKeys.map(({ id }) => id)]),\n modelId,\n categoryId,\n on,\n });\n }\n\n private async getVisibilityChangeTargets({ node }: GetFilteredNodeVisibilityProps) {\n const filteredTree = await this._filteredTree;\n return filteredTree ? filteredTree.getVisibilityChangeTargets(node) : {};\n }\n\n private changeFilteredNodeVisibility({ on, ...props }: ChangeFilteredNodeVisibilityProps) {\n return from(this.getVisibilityChangeTargets(props)).pipe(\n mergeMap(({ definitionContainerIds: definitionContainers, subCategories, modelIds: models, categories, elements }) => {\n const observables = new Array<Observable<void>>();\n if (definitionContainers?.size) {\n observables.push(this.changeDefinitionContainerState({ definitionContainerIds: [...definitionContainers], on }));\n }\n\n if (models?.size) {\n observables.push(this.changeModelState({ ids: models, on }));\n }\n\n if (categories?.size) {\n observables.push(\n from(categories).pipe(\n mergeMap((key) => {\n const { modelId, categoryId } = parseCategoryKey(key);\n return this.changeCategoryState({ modelId, categoryIds: [categoryId], ignoreSubCategories: false, on });\n }),\n ),\n );\n }\n\n if (subCategories?.size) {\n observables.push(\n from(subCategories).pipe(\n mergeMap((key) => {\n const { subCategoryId, categoryId } = parseSubCategoryKey(key);\n return this.changeSubCategoryState({ categoryId, subCategoryIds: [subCategoryId], on });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n observables.push(\n from(elements).pipe(\n mergeMap(([categoryKey, elementIds]) => {\n const { modelId, categoryId } = parseCategoryKey(categoryKey);\n assert(modelId !== undefined);\n return this.changeElementsState({ modelId, categoryId, elementIds, on });\n }),\n ),\n );\n }\n\n return merge(...observables);\n }),\n );\n }\n\n private changeModelState(props: ChangeModelVisibilityStateProps): Observable<void> {\n const { ids, on } = props;\n\n if (Id64.sizeOf(ids) === 0) {\n return EMPTY;\n }\n\n const result = defer(() => {\n const viewport = this._props.viewport;\n\n viewport.perModelCategoryVisibility.clearOverrides(ids);\n const idsObs = from(Id64.iterable(ids));\n if (!on) {\n viewport.changeModelDisplay(ids, false);\n return idsObs.pipe(\n mergeMap(async (modelId) => ({ modelId, categoryIds: await this._idsCache.getModelCategoryIds(modelId) })),\n mergeMap(({ modelId, categoryIds }) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))),\n mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on })),\n );\n }\n\n return concat(\n from(viewport.addViewedModels(ids)),\n idsObs.pipe(\n mergeMap((modelId) => {\n return from(this._idsCache.getModelCategoryIds(modelId)).pipe(\n mergeAll(),\n mergeMap((categoryId) => this.changeCategoryState({ categoryIds: [categoryId], modelId, on, ignoreSubCategories: true })),\n );\n }),\n ),\n );\n });\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n private showModelWithoutAnyCategoriesOrElements(modelId: Id64String): Observable<void> {\n const viewport = this._props.viewport;\n return forkJoin({\n categories: this._idsCache.getModelCategoryIds(modelId),\n alwaysDrawnElements: this._alwaysAndNeverDrawnElements.getAlwaysDrawnElements({ modelId }),\n }).pipe(\n mergeMap(async ({ categories, alwaysDrawnElements }) => {\n const alwaysDrawn = this._props.viewport.alwaysDrawn;\n if (alwaysDrawn && alwaysDrawnElements) {\n viewport.setAlwaysDrawn(setDifference(alwaysDrawn, alwaysDrawnElements));\n }\n categories.forEach((categoryId) => {\n this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, false, false);\n });\n await viewport.addViewedModels(modelId);\n }),\n );\n }\n\n private changeCategoryStateInViewportAccordingToModelVisibility(modelId: string, categoryId: string, on: boolean, changeSubCategories: boolean) {\n const viewport = this._props.viewport;\n const isDisplayedInSelector = viewport.view.viewsCategory(categoryId);\n const override =\n on === isDisplayedInSelector\n ? PerModelCategoryVisibility.Override.None\n : on\n ? PerModelCategoryVisibility.Override.Show\n : PerModelCategoryVisibility.Override.Hide;\n viewport.perModelCategoryVisibility.setOverride(modelId, categoryId, override);\n\n if (override === PerModelCategoryVisibility.Override.None && on) {\n // we took off the override which means the category is displayed in selector, but\n // doesn't mean all its subcategories are displayed - this call ensures that\n viewport.changeCategoryDisplay(categoryId, true, changeSubCategories);\n }\n }\n\n private changeSubCategoryState(props: { categoryId: Id64String; subCategoryIds: Id64Array; on: boolean }): Observable<void> {\n const result = defer(() => {\n return concat(\n // make sure parent category is enabled\n props.on ? from(enableCategoryDisplay(this._props.viewport, [props.categoryId], props.on, false)) : EMPTY,\n from(props.subCategoryIds).pipe(map((subCategoryId) => enableSubCategoryDisplay(this._props.viewport, subCategoryId, props.on))),\n );\n });\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n private changeDefinitionContainerState(props: { definitionContainerIds: Id64Array; on: boolean }): Observable<void> {\n const result = defer(() => {\n return from(this._idsCache.getAllContainedCategories(props.definitionContainerIds)).pipe(\n mergeAll(),\n mergeMap((categoryId) => {\n return this.changeCategoryState({ categoryIds: [categoryId], on: props.on });\n }),\n );\n });\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n private changeCategoryState(props: ChangeCategoryVisibilityStateProps): Observable<void> {\n const result = defer(() => {\n const { modelId, categoryIds, on, ignoreSubCategories } = props;\n const viewport = this._props.viewport;\n if (!this._props.hierarchyConfig.showElements) {\n return from(enableCategoryDisplay(viewport, categoryIds, on, on));\n }\n\n const modelIdsObservable = modelId\n ? of(new Map(categoryIds.map((id) => [id, [modelId]])))\n : from(this._idsCache.getCategoriesElementModels(categoryIds, true));\n return concat(\n modelId ? EMPTY : from(enableCategoryDisplay(viewport, categoryIds, on, ignoreSubCategories ? false : on)),\n on\n ? modelIdsObservable.pipe(\n mergeMap((categoriesMap) => from(categoriesMap.values())),\n mergeAll(),\n filter((modelIdToCheck) => !viewport.view.viewsModel(modelIdToCheck)),\n mergeMap((modelIdToCheck) => this.showModelWithoutAnyCategoriesOrElements(modelIdToCheck)),\n )\n : EMPTY,\n modelIdsObservable.pipe(\n mergeMap((categoriesMap) => from(categoriesMap.entries())),\n mergeMap(([categoryId, modelIds]) => {\n return from(modelIds).pipe(\n mergeMap((modelOfCategory) => {\n this.changeCategoryStateInViewportAccordingToModelVisibility(modelOfCategory, categoryId, on, !!ignoreSubCategories);\n return this._alwaysAndNeverDrawnElements.clearAlwaysAndNeverDrawnElements({ modelId: modelOfCategory, categoryIds: [categoryId] });\n }),\n );\n }),\n ),\n modelIdsObservable.pipe(\n mergeMap((categoriesMap) => from(categoriesMap.entries())),\n mergeMap(([categoryId, modelIds]) => {\n return from(modelIds).pipe(\n mergeMap((modelOfCategory) =>\n from(this._idsCache.getCategoriesModeledElements(modelOfCategory, [categoryId])).pipe(\n mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on })),\n ),\n ),\n );\n }),\n ),\n );\n });\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n private doChangeElementsState(props: ChangeGeometricElementsDisplayStateProps): Observable<void | undefined> {\n return defer(() => {\n const { modelId, categoryId, elementIds, on } = props;\n const viewport = this._props.viewport;\n return concat(\n on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n defer(() => {\n const categoryVisibility = this.getDefaultModelsCategoryVisibilityStatus({ categoryIds: [categoryId], modelId, ignoreTooltip: true });\n const isDisplayedByDefault = categoryVisibility.state === \"visible\";\n return this.queueElementsVisibilityChange(elementIds, on, isDisplayedByDefault);\n }),\n from(elementIds).pipe(\n mergeMap(async (elementId) => ({ elementId, isSubModel: await this._idsCache.hasSubModel(elementId) })),\n filter(({ isSubModel }) => isSubModel),\n map(({ elementId }) => elementId),\n toArray(),\n mergeMap((subModelIds) => this.changeModelState({ ids: subModelIds, on })),\n ),\n );\n });\n }\n\n /**\n * Updates visibility of all grouping node's elements.\n * @see `changeElementState`\n */\n private changeElementGroupingNodeState(node: GroupingHierarchyNode, on: boolean): Observable<void> {\n const info = this.getGroupingNodeInfo(node);\n const result = from(info.modelElementsMap).pipe(\n mergeMap(([modelId, elementIds]) => {\n return this.doChangeElementsState({ modelId, elementIds, categoryId: info.categoryId, on });\n }),\n );\n return createVisibilityHandlerResult(this, { node, on }, result, undefined);\n }\n\n /**\n * Updates visibility of an element and all its child elements by adding them to the always/never drawn list.\n * @note If element is to be enabled and model is hidden, it will be enabled.\n */\n private changeElementsState(props: ChangeGeometricElementsDisplayStateProps): Observable<void> {\n const result = this.doChangeElementsState(props);\n return createVisibilityHandlerResult(this, props, result, undefined);\n }\n\n private queueElementsVisibilityChange(elementIds: Id64Set, on: boolean, visibleByDefault: boolean) {\n const finishedSubject = new Subject<boolean>();\n // observable to track if visibility change is finished/cancelled\n const changeFinished = finishedSubject.pipe(\n startWith(false),\n shareReplay(1),\n filter((finished) => finished),\n );\n\n const changeObservable = from(elementIds).pipe(\n // check if visibility change is not finished (cancelled) due to change overall change request being cancelled\n takeUntil(changeFinished),\n changeElementStateNoChildrenOperator({ on, isDisplayedByDefault: visibleByDefault, viewport: this._props.viewport }),\n tap({\n next: () => {\n // notify that visibility change is finished\n finishedSubject.next(true);\n },\n }),\n );\n\n // queue visibility change. `changeObservable` will be subscribed to when other queue changes are finished\n this._elementChangeQueue.next(changeObservable);\n\n // return observable that will emit when visibility change is finished\n return changeFinished.pipe(\n take(1),\n tap({\n unsubscribe: () => {\n // if this observable is unsubscribed before visibility change is finished, we have to notify that it queued change request is cancelled\n finishedSubject.next(true);\n },\n }),\n map(() => undefined),\n );\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElements({\n ignoreTooltip,\n ...props\n }: GetVisibilityFromAlwaysAndNeverDrawnElementsProps &\n ({ elements: Set<ElementId> } | { queryProps: CategoryAlwaysOrNeverDrawnElementsQueryProps }) & { ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const viewport = this._props.viewport;\n if (viewport.isAlwaysDrawnExclusive) {\n if (!viewport?.alwaysDrawn?.size) {\n return of(createVisibilityStatus(\"hidden\", getTooltipOptions(props.tooltips.noElementsInExclusiveAlwaysDrawnList, ignoreTooltip)));\n }\n } else if (!viewport?.neverDrawn?.size && !viewport?.alwaysDrawn?.size) {\n return of(props.defaultStatus());\n }\n\n if (\"elements\" in props) {\n return of(\n getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n alwaysDrawn: viewport.alwaysDrawn?.size ? setIntersection(props.elements, viewport.alwaysDrawn) : undefined,\n neverDrawn: viewport.neverDrawn?.size ? setIntersection(props.elements, viewport.neverDrawn) : undefined,\n totalCount: props.elements.size,\n ignoreTooltip,\n viewport,\n }),\n );\n }\n const { modelId, categoryIds } = props.queryProps;\n\n const totalCount = (\n modelId ? of(new Map(categoryIds.map((categoryId) => [categoryId, [modelId]]))) : from(this._idsCache.getCategoriesElementModels(categoryIds))\n ).pipe(\n mergeMap((categoriesMap) => from(categoriesMap)),\n mergeMap(([categoryId, modelIds]) => {\n return from(modelIds).pipe(\n mergeMap((modelOfCategory) => from(this._idsCache.getCategoryElementsCount(modelOfCategory, categoryId))),\n reduce((acc, specificModelCategoryCount) => {\n return acc + specificModelCategoryCount;\n }, 0),\n );\n }),\n );\n return forkJoin({\n totalCount,\n alwaysDrawn: this._alwaysAndNeverDrawnElements.getAlwaysDrawnElements(props.queryProps),\n neverDrawn: this._alwaysAndNeverDrawnElements.getNeverDrawnElements(props.queryProps),\n }).pipe(\n map((state) => {\n return getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n ...state,\n ignoreTooltip,\n viewport,\n });\n }),\n );\n }\n\n private getGroupingNodeInfo(node: GroupingHierarchyNode) {\n const modelElementsMap: Map<ModelId, Set<ElementId>> = node.extendedData?.modelElementsMap;\n const categoryId = node.extendedData?.categoryId;\n assert(!!modelElementsMap && !!categoryId);\n\n return { modelElementsMap, categoryId };\n }\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { HierarchyFilteringPath } from "@itwin/presentation-hierarchies";
|
|
2
|
+
import type { Id64Set, Id64String } from "@itwin/core-bentley";
|
|
3
|
+
import type { HierarchyNode } from "@itwin/presentation-hierarchies";
|
|
4
|
+
import type { ECClassHierarchyInspector } from "@itwin/presentation-shared";
|
|
5
|
+
import type { CategoriesTreeIdsCache } from "./CategoriesTreeIdsCache.js";
|
|
6
|
+
import type { CategoryId, ElementId, ModelId, SubCategoryId } from "../../common/internal/Types.js";
|
|
7
|
+
export interface FilteredTree {
|
|
8
|
+
getVisibilityChangeTargets(node: HierarchyNode): VisibilityChangeTargets;
|
|
9
|
+
}
|
|
10
|
+
type CategoryKey = `${ModelId}-${CategoryId}`;
|
|
11
|
+
type SubCategoryKey = `${CategoryId}-${SubCategoryId}`;
|
|
12
|
+
/** @internal */
|
|
13
|
+
export declare function parseCategoryKey(key: CategoryKey): {
|
|
14
|
+
modelId: Id64String | undefined;
|
|
15
|
+
categoryId: Id64String;
|
|
16
|
+
};
|
|
17
|
+
/** @internal */
|
|
18
|
+
export declare function parseSubCategoryKey(key: SubCategoryKey): {
|
|
19
|
+
categoryId: string;
|
|
20
|
+
subCategoryId: string;
|
|
21
|
+
};
|
|
22
|
+
interface VisibilityChangeTargets {
|
|
23
|
+
definitionContainerIds?: Id64Set;
|
|
24
|
+
modelIds?: Id64Set;
|
|
25
|
+
categories?: Set<CategoryKey>;
|
|
26
|
+
elements?: Map<CategoryKey, Set<ElementId>>;
|
|
27
|
+
subCategories?: Set<SubCategoryKey>;
|
|
28
|
+
}
|
|
29
|
+
/** @internal */
|
|
30
|
+
export declare function createFilteredTree(props: {
|
|
31
|
+
imodelAccess: ECClassHierarchyInspector;
|
|
32
|
+
filteringPaths: HierarchyFilteringPath[];
|
|
33
|
+
categoryClassName: string;
|
|
34
|
+
categoryElementClassName: string;
|
|
35
|
+
categoryModelClassName: string;
|
|
36
|
+
idsCache: CategoriesTreeIdsCache;
|
|
37
|
+
}): Promise<FilteredTree>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=FilteredTree.d.ts.map
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { assert } from "@itwin/core-bentley";
|
|
6
|
+
import { HierarchyFilteringPath, HierarchyNodeIdentifier, HierarchyNodeKey } from "@itwin/presentation-hierarchies";
|
|
7
|
+
import { SUB_CATEGORY_CLASS_NAME } from "../../common/internal/ClassNameDefinitions.js";
|
|
8
|
+
function createCategoryKey(modelId, categoryId) {
|
|
9
|
+
return `${modelId ?? ""}-${categoryId}`;
|
|
10
|
+
}
|
|
11
|
+
function createSubCategoryKey(categoryId, subCategoryId) {
|
|
12
|
+
return `${categoryId}-${subCategoryId}`;
|
|
13
|
+
}
|
|
14
|
+
/** @internal */
|
|
15
|
+
export function parseCategoryKey(key) {
|
|
16
|
+
const [modelId, categoryId] = key.split("-");
|
|
17
|
+
return { modelId: modelId !== "" ? modelId : undefined, categoryId };
|
|
18
|
+
}
|
|
19
|
+
/** @internal */
|
|
20
|
+
export function parseSubCategoryKey(key) {
|
|
21
|
+
const [categoryId, subCategoryId] = key.split("-");
|
|
22
|
+
return { categoryId, subCategoryId };
|
|
23
|
+
}
|
|
24
|
+
/** @internal */
|
|
25
|
+
export async function createFilteredTree(props) {
|
|
26
|
+
const { imodelAccess, filteringPaths, categoryClassName, categoryElementClassName, categoryModelClassName, idsCache } = props;
|
|
27
|
+
const root = {
|
|
28
|
+
children: new Map(),
|
|
29
|
+
};
|
|
30
|
+
const filteredElements = new Array();
|
|
31
|
+
for (const filteringPath of filteringPaths) {
|
|
32
|
+
const normalizedPath = HierarchyFilteringPath.normalize(filteringPath).path;
|
|
33
|
+
let parentNode = root;
|
|
34
|
+
for (let i = 0; i < normalizedPath.length; i++) {
|
|
35
|
+
if ("type" in parentNode && parentNode.isFilterTarget) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
const identifier = normalizedPath[i];
|
|
39
|
+
if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(identifier)) {
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
const currentNode = parentNode.children?.get(identifier.id);
|
|
43
|
+
if (currentNode !== undefined) {
|
|
44
|
+
parentNode = currentNode;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const type = await getType(imodelAccess, identifier.className, categoryClassName, categoryElementClassName, categoryModelClassName);
|
|
48
|
+
const newNode = createFilteredTreeNode({
|
|
49
|
+
type,
|
|
50
|
+
id: identifier.id,
|
|
51
|
+
isFilterTarget: i === normalizedPath.length - 1,
|
|
52
|
+
parent: parentNode,
|
|
53
|
+
});
|
|
54
|
+
(parentNode.children ??= new Map()).set(identifier.id, newNode);
|
|
55
|
+
parentNode = newNode;
|
|
56
|
+
if (newNode.type === "element") {
|
|
57
|
+
filteredElements.push(newNode);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const filteredElementsModels = await idsCache.getFilteredElementsModels(filteredElements.map(({ id }) => id));
|
|
62
|
+
// We populate filtered elements array with references, this causes root to change accordingly
|
|
63
|
+
filteredElements.forEach((element) => {
|
|
64
|
+
element.modelId = filteredElementsModels.get(element.id);
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
getVisibilityChangeTargets: (node) => getVisibilityChangeTargets(root, node),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function getVisibilityChangeTargets(root, node) {
|
|
71
|
+
let lookupParents = [root];
|
|
72
|
+
const changeTargets = {};
|
|
73
|
+
const nodeKey = node.key;
|
|
74
|
+
if (!HierarchyNodeKey.isInstances(nodeKey)) {
|
|
75
|
+
return changeTargets;
|
|
76
|
+
}
|
|
77
|
+
// find the filtered parent nodes of the `node`
|
|
78
|
+
for (const parentKey of node.parentKeys) {
|
|
79
|
+
if (!HierarchyNodeKey.isInstances(parentKey)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// tree node might be merged from multiple instances. As filtered tree stores only one instance per node, we need to find all matching nodes
|
|
83
|
+
// and use them when checking for matching node in one level deeper.
|
|
84
|
+
const parentNodes = findMatchingFilteredNodes(lookupParents, parentKey.instanceKeys);
|
|
85
|
+
if (parentNodes.length === 0) {
|
|
86
|
+
return changeTargets;
|
|
87
|
+
}
|
|
88
|
+
lookupParents = parentNodes;
|
|
89
|
+
}
|
|
90
|
+
// find filtered nodes that match the `node`
|
|
91
|
+
const filteredNodes = findMatchingFilteredNodes(lookupParents, nodeKey.instanceKeys);
|
|
92
|
+
if (filteredNodes.length === 0) {
|
|
93
|
+
return changeTargets;
|
|
94
|
+
}
|
|
95
|
+
for (const filteredNode of filteredNodes) {
|
|
96
|
+
collectVisibilityChangeTargets(changeTargets, filteredNode);
|
|
97
|
+
}
|
|
98
|
+
return changeTargets;
|
|
99
|
+
}
|
|
100
|
+
function findMatchingFilteredNodes(lookupParents, keys) {
|
|
101
|
+
return lookupParents
|
|
102
|
+
.flatMap((lookup) => keys.map((key) => lookup.children?.get(key.id)))
|
|
103
|
+
.filter((lookupNode) => lookupNode !== undefined);
|
|
104
|
+
}
|
|
105
|
+
function collectVisibilityChangeTargets(changeTargets, filteredNode) {
|
|
106
|
+
if (filteredNode.isFilterTarget) {
|
|
107
|
+
addTarget(changeTargets, filteredNode);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (filteredNode.type === "element") {
|
|
111
|
+
// need to add parent ids as filter target will be an element
|
|
112
|
+
addTarget(changeTargets, filteredNode);
|
|
113
|
+
}
|
|
114
|
+
if (!filteredNode.children) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
for (const child of filteredNode.children.values()) {
|
|
118
|
+
collectVisibilityChangeTargets(changeTargets, child);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function addTarget(filterTargets, node) {
|
|
122
|
+
switch (node.type) {
|
|
123
|
+
case "definitionContainer":
|
|
124
|
+
(filterTargets.definitionContainerIds ??= new Set()).add(node.id);
|
|
125
|
+
return;
|
|
126
|
+
case "model":
|
|
127
|
+
(filterTargets.modelIds ??= new Set()).add(node.id);
|
|
128
|
+
return;
|
|
129
|
+
case "subCategory":
|
|
130
|
+
(filterTargets.subCategories ??= new Set()).add(createSubCategoryKey(node.categoryId, node.id));
|
|
131
|
+
return;
|
|
132
|
+
case "category":
|
|
133
|
+
(filterTargets.categories ??= new Set()).add(createCategoryKey(node.modelId, node.id));
|
|
134
|
+
return;
|
|
135
|
+
case "element":
|
|
136
|
+
const categoryKey = createCategoryKey(node.modelId, node.categoryId);
|
|
137
|
+
const elements = (filterTargets.elements ??= new Map()).get(categoryKey);
|
|
138
|
+
if (elements) {
|
|
139
|
+
elements.add(node.id);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
filterTargets.elements.set(categoryKey, new Set([node.id]));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function createFilteredTreeNode({ type, id, isFilterTarget, parent, }) {
|
|
147
|
+
if (type === "definitionContainer") {
|
|
148
|
+
return {
|
|
149
|
+
id,
|
|
150
|
+
isFilterTarget,
|
|
151
|
+
type,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
if (type === "subCategory") {
|
|
155
|
+
assert("id" in parent);
|
|
156
|
+
return {
|
|
157
|
+
id,
|
|
158
|
+
isFilterTarget,
|
|
159
|
+
type,
|
|
160
|
+
categoryId: parent.id,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (type === "category") {
|
|
164
|
+
if ("type" in parent && parent.type === "model") {
|
|
165
|
+
return {
|
|
166
|
+
id,
|
|
167
|
+
isFilterTarget,
|
|
168
|
+
type,
|
|
169
|
+
modelId: parent.id,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
id,
|
|
174
|
+
isFilterTarget,
|
|
175
|
+
type,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
if (type === "model") {
|
|
179
|
+
assert("id" in parent);
|
|
180
|
+
return {
|
|
181
|
+
id,
|
|
182
|
+
isFilterTarget,
|
|
183
|
+
type,
|
|
184
|
+
categoryId: parent.type === "category" ? parent.id : undefined,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if ("type" in parent) {
|
|
188
|
+
if (parent.type === "category") {
|
|
189
|
+
return {
|
|
190
|
+
id,
|
|
191
|
+
isFilterTarget,
|
|
192
|
+
type,
|
|
193
|
+
categoryId: parent.id,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
assert(parent.type === "element");
|
|
197
|
+
return {
|
|
198
|
+
id,
|
|
199
|
+
isFilterTarget,
|
|
200
|
+
type,
|
|
201
|
+
categoryId: parent.categoryId,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
throw new Error("Invalid parent node type");
|
|
205
|
+
}
|
|
206
|
+
async function getType(hierarchyChecker, className, categoryClassName, categoryElementClass, categoryModelClassName) {
|
|
207
|
+
if (await hierarchyChecker.classDerivesFrom(className, SUB_CATEGORY_CLASS_NAME)) {
|
|
208
|
+
return "subCategory";
|
|
209
|
+
}
|
|
210
|
+
if (await hierarchyChecker.classDerivesFrom(className, categoryElementClass)) {
|
|
211
|
+
return "element";
|
|
212
|
+
}
|
|
213
|
+
if (await hierarchyChecker.classDerivesFrom(className, categoryClassName)) {
|
|
214
|
+
return "category";
|
|
215
|
+
}
|
|
216
|
+
if (await hierarchyChecker.classDerivesFrom(className, categoryModelClassName)) {
|
|
217
|
+
return "model";
|
|
218
|
+
}
|
|
219
|
+
return "definitionContainer";
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=FilteredTree.js.map
|
package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilteredTree.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.ts"],"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\nimport { assert } from \"@itwin/core-bentley\";\nimport { HierarchyFilteringPath, HierarchyNodeIdentifier, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { SUB_CATEGORY_CLASS_NAME } from \"../../common/internal/ClassNameDefinitions.js\";\n\nimport type { Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport type { CategoriesTreeIdsCache } from \"./CategoriesTreeIdsCache.js\";\nimport type { CategoryId, ElementId, ModelId, SubCategoryId } from \"../../common/internal/Types.js\";\n\ninterface FilteredTreeRootNode {\n children: Map<Id64String, FilteredTreeNode>;\n}\n\ninterface BaseFilteredTreeNode {\n id: Id64String;\n children?: Map<Id64String, FilteredTreeNode>;\n isFilterTarget: boolean;\n}\n\ninterface CategoryFilteredTreeNode extends BaseFilteredTreeNode {\n type: \"category\";\n modelId?: Id64String;\n}\n\ninterface ModelFilteredTreeNode extends BaseFilteredTreeNode {\n type: \"model\";\n categoryId?: Id64String;\n}\ninterface SubCategoryFilteredTreeNode extends BaseFilteredTreeNode {\n type: \"subCategory\";\n categoryId: Id64String;\n}\n\ninterface DefinitionContainerFilteredTreeNode extends BaseFilteredTreeNode {\n type: \"definitionContainer\";\n}\n\ninterface ElementFilteredTreeNode extends BaseFilteredTreeNode {\n type: \"element\";\n categoryId: Id64String;\n modelId?: Id64String;\n}\n\ntype FilteredTreeNode =\n | DefinitionContainerFilteredTreeNode\n | SubCategoryFilteredTreeNode\n | CategoryFilteredTreeNode\n | ElementFilteredTreeNode\n | ModelFilteredTreeNode;\n\nexport interface FilteredTree {\n getVisibilityChangeTargets(node: HierarchyNode): VisibilityChangeTargets;\n}\n\ntype CategoryKey = `${ModelId}-${CategoryId}`;\ntype SubCategoryKey = `${CategoryId}-${SubCategoryId}`;\n\nfunction createCategoryKey(modelId: Id64String | undefined, categoryId: Id64String): CategoryKey {\n return `${modelId ?? \"\"}-${categoryId}`;\n}\n\nfunction createSubCategoryKey(categoryId: Id64String, subCategoryId: Id64String): SubCategoryKey {\n return `${categoryId}-${subCategoryId}`;\n}\n\n/** @internal */\nexport function parseCategoryKey(key: CategoryKey): { modelId: Id64String | undefined; categoryId: Id64String } {\n const [modelId, categoryId] = key.split(\"-\");\n return { modelId: modelId !== \"\" ? modelId : undefined, categoryId };\n}\n\n/** @internal */\nexport function parseSubCategoryKey(key: SubCategoryKey) {\n const [categoryId, subCategoryId] = key.split(\"-\");\n return { categoryId, subCategoryId };\n}\n\ninterface VisibilityChangeTargets {\n definitionContainerIds?: Id64Set;\n modelIds?: Id64Set;\n categories?: Set<CategoryKey>;\n elements?: Map<CategoryKey, Set<ElementId>>;\n subCategories?: Set<SubCategoryKey>;\n}\n\n/** @internal */\nexport async function createFilteredTree(props: {\n imodelAccess: ECClassHierarchyInspector;\n filteringPaths: HierarchyFilteringPath[];\n categoryClassName: string;\n categoryElementClassName: string;\n categoryModelClassName: string;\n idsCache: CategoriesTreeIdsCache;\n}): Promise<FilteredTree> {\n const { imodelAccess, filteringPaths, categoryClassName, categoryElementClassName, categoryModelClassName, idsCache } = props;\n const root: FilteredTreeRootNode = {\n children: new Map(),\n };\n\n const filteredElements = new Array<ElementFilteredTreeNode>();\n for (const filteringPath of filteringPaths) {\n const normalizedPath = HierarchyFilteringPath.normalize(filteringPath).path;\n\n let parentNode: FilteredTreeRootNode | FilteredTreeNode = root;\n for (let i = 0; i < normalizedPath.length; i++) {\n if (\"type\" in parentNode && parentNode.isFilterTarget) {\n break;\n }\n\n const identifier = normalizedPath[i];\n\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(identifier)) {\n break;\n }\n\n const currentNode: FilteredTreeNode | undefined = parentNode.children?.get(identifier.id);\n if (currentNode !== undefined) {\n parentNode = currentNode;\n continue;\n }\n\n const type = await getType(imodelAccess, identifier.className, categoryClassName, categoryElementClassName, categoryModelClassName);\n\n const newNode: FilteredTreeNode = createFilteredTreeNode({\n type,\n id: identifier.id,\n isFilterTarget: i === normalizedPath.length - 1,\n parent: parentNode,\n });\n (parentNode.children ??= new Map()).set(identifier.id, newNode);\n parentNode = newNode;\n if (newNode.type === \"element\") {\n filteredElements.push(newNode);\n }\n }\n }\n const filteredElementsModels = await idsCache.getFilteredElementsModels(filteredElements.map(({ id }) => id));\n // We populate filtered elements array with references, this causes root to change accordingly\n filteredElements.forEach((element) => {\n element.modelId = filteredElementsModels.get(element.id);\n });\n\n return {\n getVisibilityChangeTargets: (node: HierarchyNode) => getVisibilityChangeTargets(root, node),\n };\n}\n\nfunction getVisibilityChangeTargets(root: FilteredTreeRootNode, node: HierarchyNode) {\n let lookupParents: Array<{ children?: Map<Id64String, FilteredTreeNode> }> = [root];\n const changeTargets: VisibilityChangeTargets = {};\n\n const nodeKey = node.key;\n if (!HierarchyNodeKey.isInstances(nodeKey)) {\n return changeTargets;\n }\n\n // find the filtered parent nodes of the `node`\n for (const parentKey of node.parentKeys) {\n if (!HierarchyNodeKey.isInstances(parentKey)) {\n continue;\n }\n\n // tree node might be merged from multiple instances. As filtered tree stores only one instance per node, we need to find all matching nodes\n // and use them when checking for matching node in one level deeper.\n const parentNodes = findMatchingFilteredNodes(lookupParents, parentKey.instanceKeys);\n if (parentNodes.length === 0) {\n return changeTargets;\n }\n lookupParents = parentNodes;\n }\n\n // find filtered nodes that match the `node`\n const filteredNodes = findMatchingFilteredNodes(lookupParents, nodeKey.instanceKeys);\n if (filteredNodes.length === 0) {\n return changeTargets;\n }\n\n for (const filteredNode of filteredNodes) {\n collectVisibilityChangeTargets(changeTargets, filteredNode);\n }\n return changeTargets;\n}\n\nfunction findMatchingFilteredNodes(lookupParents: Array<{ children?: Map<Id64String, FilteredTreeNode> }>, keys: InstanceKey[]) {\n return lookupParents\n .flatMap((lookup) => keys.map((key) => lookup.children?.get(key.id)))\n .filter((lookupNode): lookupNode is FilteredTreeNode => lookupNode !== undefined);\n}\n\nfunction collectVisibilityChangeTargets(changeTargets: VisibilityChangeTargets, filteredNode: FilteredTreeNode) {\n if (filteredNode.isFilterTarget) {\n addTarget(changeTargets, filteredNode);\n return;\n }\n\n if (filteredNode.type === \"element\") {\n // need to add parent ids as filter target will be an element\n addTarget(changeTargets, filteredNode);\n }\n\n if (!filteredNode.children) {\n return;\n }\n\n for (const child of filteredNode.children.values()) {\n collectVisibilityChangeTargets(changeTargets, child);\n }\n}\n\nfunction addTarget(filterTargets: VisibilityChangeTargets, node: FilteredTreeNode) {\n switch (node.type) {\n case \"definitionContainer\":\n (filterTargets.definitionContainerIds ??= new Set()).add(node.id);\n return;\n case \"model\":\n (filterTargets.modelIds ??= new Set()).add(node.id);\n return;\n case \"subCategory\":\n (filterTargets.subCategories ??= new Set()).add(createSubCategoryKey(node.categoryId, node.id));\n return;\n case \"category\":\n (filterTargets.categories ??= new Set()).add(createCategoryKey(node.modelId, node.id));\n return;\n case \"element\":\n const categoryKey = createCategoryKey(node.modelId, node.categoryId);\n const elements = (filterTargets.elements ??= new Map()).get(categoryKey);\n if (elements) {\n elements.add(node.id);\n return;\n }\n filterTargets.elements.set(categoryKey, new Set([node.id]));\n return;\n }\n}\n\nfunction createFilteredTreeNode({\n type,\n id,\n isFilterTarget,\n parent,\n}: {\n type: FilteredTreeNode[\"type\"];\n id: Id64String;\n isFilterTarget: boolean;\n parent: FilteredTreeNode | FilteredTreeRootNode;\n}): FilteredTreeNode {\n if (type === \"definitionContainer\") {\n return {\n id,\n isFilterTarget,\n type,\n };\n }\n if (type === \"subCategory\") {\n assert(\"id\" in parent);\n return {\n id,\n isFilterTarget,\n type,\n categoryId: parent.id,\n };\n }\n if (type === \"category\") {\n if (\"type\" in parent && parent.type === \"model\") {\n return {\n id,\n isFilterTarget,\n type,\n modelId: parent.id,\n };\n }\n return {\n id,\n isFilterTarget,\n type,\n };\n }\n if (type === \"model\") {\n assert(\"id\" in parent);\n return {\n id,\n isFilterTarget,\n type,\n categoryId: parent.type === \"category\" ? parent.id : undefined,\n };\n }\n\n if (\"type\" in parent) {\n if (parent.type === \"category\") {\n return {\n id,\n isFilterTarget,\n type,\n categoryId: parent.id,\n };\n }\n assert(parent.type === \"element\");\n return {\n id,\n isFilterTarget,\n type,\n categoryId: parent.categoryId,\n };\n }\n\n throw new Error(\"Invalid parent node type\");\n}\n\nasync function getType(\n hierarchyChecker: ECClassHierarchyInspector,\n className: string,\n categoryClassName: string,\n categoryElementClass: string,\n categoryModelClassName: string,\n) {\n if (await hierarchyChecker.classDerivesFrom(className, SUB_CATEGORY_CLASS_NAME)) {\n return \"subCategory\";\n }\n if (await hierarchyChecker.classDerivesFrom(className, categoryElementClass)) {\n return \"element\";\n }\n if (await hierarchyChecker.classDerivesFrom(className, categoryClassName)) {\n return \"category\";\n }\n if (await hierarchyChecker.classDerivesFrom(className, categoryModelClassName)) {\n return \"model\";\n }\n return \"definitionContainer\";\n}\n"]}
|
|
@@ -1,35 +1,23 @@
|
|
|
1
|
+
import type { Id64Array, Id64String } from "@itwin/core-bentley";
|
|
1
2
|
import type { Viewport } from "@itwin/core-frontend";
|
|
2
3
|
/**
|
|
3
4
|
* Data structure that describes category.
|
|
4
5
|
* @beta
|
|
5
6
|
*/
|
|
6
7
|
export interface CategoryInfo {
|
|
7
|
-
categoryId:
|
|
8
|
-
subCategoryIds?:
|
|
8
|
+
categoryId: Id64String;
|
|
9
|
+
subCategoryIds?: Id64Array;
|
|
9
10
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Toggles visibility of categories to show or hide.
|
|
12
|
-
*/
|
|
13
|
-
export declare function toggleAllCategories(viewport: Viewport, display: boolean): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* Changes category display in the viewport.
|
|
16
|
-
*/
|
|
17
|
-
export declare function enableCategoryDisplay(viewport: Viewport, ids: string[], enabled: boolean, enableAllSubCategories?: boolean): Promise<void>;
|
|
18
|
-
/**
|
|
19
|
-
* Changes subcategory display in the viewport
|
|
20
|
-
*/
|
|
21
|
-
export declare function enableSubCategoryDisplay(viewport: Viewport, key: string, enabled: boolean): void;
|
|
22
|
-
export declare function loadCategoriesFromViewport(vp: Viewport): Promise<CategoryInfo[]>;
|
|
23
11
|
/**
|
|
24
12
|
* Enable display of all given categories.
|
|
25
13
|
* @public
|
|
26
14
|
*/
|
|
27
|
-
export declare function showAllCategories(categories:
|
|
15
|
+
export declare function showAllCategories(categories: Id64Array, viewport: Viewport): Promise<void>;
|
|
28
16
|
/**
|
|
29
17
|
* Disable display of all given categories.
|
|
30
18
|
* @public
|
|
31
19
|
*/
|
|
32
|
-
export declare function hideAllCategories(categories:
|
|
20
|
+
export declare function hideAllCategories(categories: Id64Array, viewport: Viewport): Promise<void>;
|
|
33
21
|
/**
|
|
34
22
|
* Invert display of all given categories.
|
|
35
23
|
* @public
|
|
@@ -2,64 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import {
|
|
6
|
-
import { PerModelCategoryVisibility } from "@itwin/core-frontend";
|
|
7
|
-
/**
|
|
8
|
-
* Toggles visibility of categories to show or hide.
|
|
9
|
-
*/
|
|
10
|
-
export async function toggleAllCategories(viewport, display) {
|
|
11
|
-
const ids = await getCategories(viewport);
|
|
12
|
-
if (ids.length === 0) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
await enableCategoryDisplay(viewport, ids, display);
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Gets ids of all categories from specified imodel and viewport.
|
|
19
|
-
*/
|
|
20
|
-
async function getCategories(viewport) {
|
|
21
|
-
const categories = await loadCategoriesFromViewport(viewport);
|
|
22
|
-
return categories.map((category) => category.categoryId);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Changes category display in the viewport.
|
|
26
|
-
*/
|
|
27
|
-
export async function enableCategoryDisplay(viewport, ids, enabled, enableAllSubCategories = true) {
|
|
28
|
-
viewport.changeCategoryDisplay(ids, enabled, enableAllSubCategories);
|
|
29
|
-
// remove category overrides per model
|
|
30
|
-
const modelsContainingOverrides = [];
|
|
31
|
-
for (const ovr of viewport.perModelCategoryVisibility) {
|
|
32
|
-
if (ids.findIndex((id) => id === ovr.categoryId) !== -1) {
|
|
33
|
-
modelsContainingOverrides.push(ovr.modelId);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
viewport.perModelCategoryVisibility.setOverride(modelsContainingOverrides, ids, PerModelCategoryVisibility.Override.None);
|
|
37
|
-
// changeCategoryDisplay only enables subcategories, it does not disabled them. So we must do that ourselves.
|
|
38
|
-
if (false === enabled) {
|
|
39
|
-
(await viewport.iModel.categories.getCategoryInfo(ids)).forEach((categoryInfo) => {
|
|
40
|
-
categoryInfo.subCategories.forEach((value) => enableSubCategoryDisplay(viewport, value.id, false));
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Changes subcategory display in the viewport
|
|
46
|
-
*/
|
|
47
|
-
export function enableSubCategoryDisplay(viewport, key, enabled) {
|
|
48
|
-
viewport.changeSubCategoryDisplay(key, enabled);
|
|
49
|
-
}
|
|
50
|
-
export async function loadCategoriesFromViewport(vp) {
|
|
51
|
-
// Query categories and add them to state
|
|
52
|
-
const selectUsedSpatialCategoryIds = "SELECT DISTINCT Category.Id as id from BisCore.GeometricElement3d WHERE Category.Id IN (SELECT ECInstanceId from BisCore.SpatialCategory)";
|
|
53
|
-
const selectUsedDrawingCategoryIds = "SELECT DISTINCT Category.Id as id from BisCore.GeometricElement2d WHERE Model.Id=? AND Category.Id IN (SELECT ECInstanceId from BisCore.DrawingCategory)";
|
|
54
|
-
const ecsql = vp.view.is3d() ? selectUsedSpatialCategoryIds : selectUsedDrawingCategoryIds;
|
|
55
|
-
const ecsql2 = `SELECT ECInstanceId as id FROM ${vp.view.is3d() ? "BisCore.SpatialCategory" : "BisCore.DrawingCategory"} WHERE ECInstanceId IN (${ecsql})`;
|
|
56
|
-
const categories = [];
|
|
57
|
-
const rows = await vp.iModel.createQueryReader(ecsql2, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames }).toArray();
|
|
58
|
-
(await vp.iModel.categories.getCategoryInfo(rows.map((row) => row.id))).forEach((val) => {
|
|
59
|
-
categories.push({ categoryId: val.id, subCategoryIds: val.subCategories.size ? [...val.subCategories.keys()] : undefined });
|
|
60
|
-
});
|
|
61
|
-
return categories;
|
|
62
|
-
}
|
|
5
|
+
import { enableCategoryDisplay, enableSubCategoryDisplay } from "./internal/VisibilityUtils.js";
|
|
63
6
|
/**
|
|
64
7
|
* Enable display of all given categories.
|
|
65
8
|
* @public
|
|
@@ -79,10 +22,10 @@ export async function hideAllCategories(categories, viewport) {
|
|
|
79
22
|
* @public
|
|
80
23
|
*/
|
|
81
24
|
export async function invertAllCategories(categories, viewport) {
|
|
82
|
-
const enabled =
|
|
83
|
-
const disabled =
|
|
84
|
-
const enabledSubCategories =
|
|
85
|
-
const disabledSubCategories =
|
|
25
|
+
const enabled = new Array();
|
|
26
|
+
const disabled = new Array();
|
|
27
|
+
const enabledSubCategories = new Array();
|
|
28
|
+
const disabledSubCategories = new Array();
|
|
86
29
|
for (const category of categories) {
|
|
87
30
|
if (!viewport.view.viewsCategory(category.categoryId)) {
|
|
88
31
|
disabled.push(category.categoryId);
|