@itwin/tree-widget-react 3.17.6 → 3.17.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.
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesVisibilityUtils.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAc1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAkB,EAAE,WAAsB,EAAE,OAAgB,EAAE,sBAAsB,GAAG,IAAI;IACrI,MAAM,eAAe,GAAG,CAAC,kBAA6B,EAAE,EAAE;QACxD,MAAM,yBAAyB,GAAa,EAAE,CAAC;QAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,0BAA0B,EAAE,CAAC;YACtD,IAAI,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjD,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,0BAA0B,CAAC,WAAW,CAAC,yBAAyB,EAAE,kBAAkB,EAAE,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3I,CAAC,CAAC;IACF,MAAM,oBAAoB,GAAG,KAAK,EAAE,kBAA6B,EAAE,EAAE;QACnE,6GAA6G;QAC7G,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;YAC9F,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QACrG,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,OAAO,aAAa,CAClB,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CACpB,6BAA6B,CAAC,GAAG,CAAC,EAClC,WAAW,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAC1F,QAAQ,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE;QACpC,QAAQ,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC;QACpF,eAAe,CAAC,kBAAkB,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CACH,CACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAkB,EAAE,GAAW,EAAE,OAAgB;IACxF,QAAQ,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAAY,EAAE,WAAwB;IACrF,yCAAyC;IACzC,MAAM,4BAA4B,GAChC,2IAA2I,CAAC;IAC9I,MAAM,4BAA4B,GAChC,0JAA0J,CAAC;IAC7J,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,4BAA4B,CAAC;IAC3F,MAAM,MAAM,GAAG,kCAAkC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,yBAAyB,2BAA2B,KAAK,GAAG,CAAC;IAE3J,MAAM,UAAU,GAAmB,EAAE,CAAC;IAEtC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM;SACzB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE;QACpC,SAAS,EAAE,cAAc,CAAC,kBAAkB;QAC5C,YAAY,EAAE,6BAA6B,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,aAAa;KAC1F,CAAC;SACD,OAAO,EAAE,CAAC;IACb,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACtF,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9H,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAoB,EAAE,QAAkB;IAC9E,MAAM,qBAAqB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAoB,EAAE,QAAkB;IAC9E,MAAM,qBAAqB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAA0B,EAAE,QAAkB;IACtF,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAc,CAAC;IACjD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAc,CAAC;IAElD,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,wCAAwC;QACxC,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YAChG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,KAAK,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,0BAA0B,EAAE,CAAC;QAC1E,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACpD,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACnC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,MAAM,qBAAqB,CAAC,QAAQ,EAAE,CAAC,GAAG,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7E,MAAM,qBAAqB,CAAC,QAAQ,EAAE,CAAC,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7E,CAAC","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 { bufferCount, from, mergeMap } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { QueryRowFormat } from \"@itwin/core-common\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { getOptimalBatchSize, releaseMainThreadOnItemsCount } from \"./internal/Utils.js\";\nimport { toVoidPromise } from \"./Rxjs.js\";\n\nimport type { GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\n\n/**\n * Data structure that describes category.\n * @beta\n */\nexport interface CategoryInfo {\n categoryId: string;\n subCategoryIds?: string[];\n}\n\n/**\n * Changes category display in the viewport.\n * @internal\n */\nexport async function enableCategoryDisplay(viewport: Viewport, categoryIds: Id64Array, enabled: boolean, enableAllSubCategories = true) {\n const removeOverrides = (bufferedCategories: Id64Array) => {\n const modelsContainingOverrides: string[] = [];\n for (const ovr of viewport.perModelCategoryVisibility) {\n if (Id64.has(bufferedCategories, ovr.categoryId)) {\n modelsContainingOverrides.push(ovr.modelId);\n }\n }\n viewport.perModelCategoryVisibility.setOverride(modelsContainingOverrides, bufferedCategories, PerModelCategoryVisibility.Override.None);\n };\n const disableSubCategories = async (bufferedCategories: Id64Array) => {\n // changeCategoryDisplay only enables subcategories, it does not disabled them. So we must do that ourselves.\n (await viewport.iModel.categories.getCategoryInfo(bufferedCategories)).forEach((categoryInfo) => {\n categoryInfo.subCategories.forEach((value) => enableSubCategoryDisplay(viewport, value.id, false));\n });\n };\n return toVoidPromise(\n from(categoryIds).pipe(\n releaseMainThreadOnItemsCount(500),\n bufferCount(getOptimalBatchSize({ totalSize: categoryIds.length, maximumBatchSize: 500 })),\n mergeMap(async (bufferedCategories) => {\n viewport.changeCategoryDisplay(bufferedCategories, enabled, enableAllSubCategories);\n removeOverrides(bufferedCategories);\n if (!enabled) {\n await disableSubCategories(bufferedCategories);\n }\n }),\n ),\n );\n}\n\n/**\n * Changes subcategory display in the viewport\n * @internal\n */\nexport function enableSubCategoryDisplay(viewport: Viewport, key: string, enabled: boolean) {\n viewport.changeSubCategoryDisplay(key, enabled);\n}\n\n/** @internal */\nexport async function loadCategoriesFromViewport(vp: Viewport, componentId?: GuidString) {\n // Query categories and add them to state\n const selectUsedSpatialCategoryIds =\n \"SELECT DISTINCT Category.Id as id from BisCore.GeometricElement3d WHERE Category.Id IN (SELECT ECInstanceId from BisCore.SpatialCategory)\";\n const selectUsedDrawingCategoryIds =\n \"SELECT DISTINCT Category.Id as id from BisCore.GeometricElement2d WHERE Model.Id=? AND Category.Id IN (SELECT ECInstanceId from BisCore.DrawingCategory)\";\n const ecsql = vp.view.is3d() ? selectUsedSpatialCategoryIds : selectUsedDrawingCategoryIds;\n const ecsql2 = `SELECT ECInstanceId as id FROM ${vp.view.is3d() ? \"BisCore.SpatialCategory\" : \"BisCore.DrawingCategory\"} WHERE ECInstanceId IN (${ecsql})`;\n\n const categories: CategoryInfo[] = [];\n\n const rows = await vp.iModel\n .createQueryReader(ecsql2, undefined, {\n rowFormat: QueryRowFormat.UseJsPropertyNames,\n restartToken: `CategoriesVisibilityUtils/${componentId ?? Guid.createValue()}/categories`,\n })\n .toArray();\n (await vp.iModel.categories.getCategoryInfo(rows.map((row) => row.id))).forEach((val) => {\n categories.push({ categoryId: val.id, subCategoryIds: val.subCategories.size ? [...val.subCategories.keys()] : undefined });\n });\n return categories;\n}\n\n/**\n * Enable display of all given categories.\n * @public\n */\nexport async function showAllCategories(categories: string[], viewport: Viewport) {\n await enableCategoryDisplay(viewport, categories, true, true);\n}\n\n/**\n * Disable display of all given categories.\n * @public\n */\nexport async function hideAllCategories(categories: string[], viewport: Viewport) {\n await enableCategoryDisplay(viewport, categories, false, true);\n}\n\n/**\n * Invert display of all given categories.\n * Categories are inverted like this:\n * - If category is visible, it will be hidden.\n * - If category is hidden, it will be visible.\n * - If category is partially visible, it will be fully visible.\n * @public\n */\nexport async function invertAllCategories(categories: CategoryInfo[], viewport: Viewport) {\n const categoriesToEnable = new Set<Id64String>();\n const categoriesToDisable = new Set<Id64String>();\n\n for (const category of categories) {\n if (!viewport.view.viewsCategory(category.categoryId)) {\n categoriesToEnable.add(category.categoryId);\n continue;\n }\n // Check if category is in partial state\n if (category.subCategoryIds?.some((subCategory) => !viewport.isSubCategoryVisible(subCategory))) {\n categoriesToEnable.add(category.categoryId);\n } else {\n categoriesToDisable.add(category.categoryId);\n }\n }\n\n // collect per model overrides that need to be inverted\n for (const { categoryId, visible } of viewport.perModelCategoryVisibility) {\n if (!visible && categoriesToDisable.has(categoryId)) {\n categoriesToEnable.add(categoryId);\n categoriesToDisable.delete(categoryId);\n }\n }\n\n await enableCategoryDisplay(viewport, [...categoriesToDisable], false, true);\n\n await enableCategoryDisplay(viewport, [...categoriesToEnable], true, true);\n}\n"]}
1
+ {"version":3,"file":"CategoriesVisibilityUtils.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.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 { bufferCount, from, mergeMap } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { QueryRowFormat } from \"@itwin/core-common\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { getOptimalBatchSize, releaseMainThreadOnItemsCount } from \"./internal/Utils.js\";\nimport { toVoidPromise } from \"./Rxjs.js\";\n\nimport type { GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\n\n/**\n * Data structure that describes category.\n * @beta\n */\nexport interface CategoryInfo {\n categoryId: string;\n subCategoryIds?: string[];\n}\n\n/**\n * Changes category display in the viewport.\n * @internal\n */\nexport async function enableCategoryDisplay(viewport: Viewport, categoryIds: Id64Array, enabled: boolean, enableAllSubCategories = true) {\n const removeOverrides = (bufferedCategories: Id64Array) => {\n const modelsContainingOverrides: string[] = [];\n for (const ovr of viewport.perModelCategoryVisibility) {\n if (Id64.has(bufferedCategories, ovr.categoryId)) {\n modelsContainingOverrides.push(ovr.modelId);\n }\n }\n viewport.perModelCategoryVisibility.setOverride(modelsContainingOverrides, bufferedCategories, PerModelCategoryVisibility.Override.None);\n };\n const disableSubCategories = async (bufferedCategories: Id64Array) => {\n // changeCategoryDisplay only enables subcategories, it does not disabled them. So we must do that ourselves.\n (await viewport.iModel.categories.getCategoryInfo(bufferedCategories)).forEach((categoryInfo) => {\n categoryInfo.subCategories.forEach((value) => enableSubCategoryDisplay(viewport, value.id, false));\n });\n };\n return toVoidPromise(\n from(categoryIds).pipe(\n releaseMainThreadOnItemsCount(500),\n bufferCount(getOptimalBatchSize({ totalSize: categoryIds.length, maximumBatchSize: 500 })),\n mergeMap(async (bufferedCategories) => {\n viewport.changeCategoryDisplay(bufferedCategories, enabled, enableAllSubCategories, true);\n removeOverrides(bufferedCategories);\n if (!enabled) {\n await disableSubCategories(bufferedCategories);\n }\n }),\n ),\n );\n}\n\n/**\n * Changes subcategory display in the viewport\n * @internal\n */\nexport function enableSubCategoryDisplay(viewport: Viewport, key: string, enabled: boolean) {\n viewport.changeSubCategoryDisplay(key, enabled);\n}\n\n/** @internal */\nexport async function loadCategoriesFromViewport(vp: Viewport, componentId?: GuidString) {\n // Query categories and add them to state\n const selectUsedSpatialCategoryIds =\n \"SELECT DISTINCT Category.Id as id from BisCore.GeometricElement3d WHERE Category.Id IN (SELECT ECInstanceId from BisCore.SpatialCategory)\";\n const selectUsedDrawingCategoryIds =\n \"SELECT DISTINCT Category.Id as id from BisCore.GeometricElement2d WHERE Model.Id=? AND Category.Id IN (SELECT ECInstanceId from BisCore.DrawingCategory)\";\n const ecsql = vp.view.is3d() ? selectUsedSpatialCategoryIds : selectUsedDrawingCategoryIds;\n const ecsql2 = `SELECT ECInstanceId as id FROM ${vp.view.is3d() ? \"BisCore.SpatialCategory\" : \"BisCore.DrawingCategory\"} WHERE ECInstanceId IN (${ecsql})`;\n\n const categories: CategoryInfo[] = [];\n\n const rows = await vp.iModel\n .createQueryReader(ecsql2, undefined, {\n rowFormat: QueryRowFormat.UseJsPropertyNames,\n restartToken: `CategoriesVisibilityUtils/${componentId ?? Guid.createValue()}/categories`,\n })\n .toArray();\n (await vp.iModel.categories.getCategoryInfo(rows.map((row) => row.id))).forEach((val) => {\n categories.push({ categoryId: val.id, subCategoryIds: val.subCategories.size ? [...val.subCategories.keys()] : undefined });\n });\n return categories;\n}\n\n/**\n * Enable display of all given categories.\n * @public\n */\nexport async function showAllCategories(categories: string[], viewport: Viewport) {\n await enableCategoryDisplay(viewport, categories, true, true);\n}\n\n/**\n * Disable display of all given categories.\n * @public\n */\nexport async function hideAllCategories(categories: string[], viewport: Viewport) {\n await enableCategoryDisplay(viewport, categories, false, true);\n}\n\n/**\n * Invert display of all given categories.\n * Categories are inverted like this:\n * - If category is visible, it will be hidden.\n * - If category is hidden, it will be visible.\n * - If category is partially visible, it will be fully visible.\n * @public\n */\nexport async function invertAllCategories(categories: CategoryInfo[], viewport: Viewport) {\n const categoriesToEnable = new Set<Id64String>();\n const categoriesToDisable = new Set<Id64String>();\n\n for (const category of categories) {\n if (!viewport.view.viewsCategory(category.categoryId)) {\n categoriesToEnable.add(category.categoryId);\n continue;\n }\n // Check if category is in partial state\n if (category.subCategoryIds?.some((subCategory) => !viewport.isSubCategoryVisible(subCategory))) {\n categoriesToEnable.add(category.categoryId);\n } else {\n categoriesToDisable.add(category.categoryId);\n }\n }\n\n // collect per model overrides that need to be inverted\n for (const { categoryId, visible } of viewport.perModelCategoryVisibility) {\n if (!visible && categoriesToDisable.has(categoryId)) {\n categoriesToEnable.add(categoryId);\n categoriesToDisable.delete(categoryId);\n }\n }\n\n await enableCategoryDisplay(viewport, [...categoriesToDisable], false, true);\n\n await enableCategoryDisplay(viewport, [...categoriesToEnable], true, true);\n}\n"]}
@@ -470,7 +470,7 @@ class ModelsTreeVisibilityHandlerImpl {
470
470
  }
471
471
  removeAlwaysDrawnExclusive() {
472
472
  return this.#idsCache.getAllCategories().pipe(map((categoryIds) => {
473
- this.#props.viewport.changeCategoryDisplay(categoryIds, false, false);
473
+ this.#props.viewport.changeCategoryDisplay(categoryIds, false, false, true);
474
474
  this.#props.viewport.clearNeverDrawn();
475
475
  this.#props.viewport.perModelCategoryVisibility.clearOverrides();
476
476
  this.#props.viewport.setAlwaysDrawn(this.#props.viewport.alwaysDrawn ?? new Set());
@@ -534,7 +534,7 @@ class ModelsTreeVisibilityHandlerImpl {
534
534
  if (override === PerModelCategoryVisibility.Override.None && on) {
535
535
  // we took off the override which means the category is displayed in selector, but
536
536
  // doesn't mean all its subcategories are displayed - this call ensures that
537
- viewport.changeCategoryDisplay(categoryId, true, true);
537
+ viewport.changeCategoryDisplay(categoryId, true, true, true);
538
538
  }
539
539
  }
540
540
  changeCategoryState(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.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 distinct,\n EMPTY,\n filter,\n firstValueFrom,\n forkJoin,\n from,\n fromEventPattern,\n map,\n merge,\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 { enableCategoryDisplay, loadCategoriesFromViewport } from \"../../common/CategoriesVisibilityUtils.js\";\nimport { getTooltipOptions, mergeVisibilityStatuses, releaseMainThreadOnItemsCount, setDifference, setIntersection } from \"../../common/internal/Utils.js\";\nimport { toVoidPromise } from \"../../common/Rxjs.js\";\nimport { createVisibilityStatus } from \"../../common/Tooltip.js\";\nimport { createVisibilityHandlerResult } from \"../../common/UseHierarchyVisibility.js\";\nimport { getIdsFromChildrenTree } from \"../Utils.js\";\nimport { AlwaysAndNeverDrawnElementInfo } from \"./AlwaysAndNeverDrawnElementInfo.js\";\nimport { createFilteredTree, parseCategoryKey } from \"./FilteredTree.js\";\nimport { ModelsTreeNode } from \"./ModelsTreeNode.js\";\nimport { createVisibilityChangeEventListener } from \"./VisibilityChangeEventListener.js\";\n\nimport type { Observable, OperatorFunction, Subscription } from \"rxjs\";\nimport type { GuidString, Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { ClassGroupingNodeKey, GroupingHierarchyNode, HierarchyFilteringPath, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector } from \"@itwin/presentation-shared\";\nimport type { Visibility } from \"../../common/Tooltip.js\";\nimport type { HierarchyVisibilityHandler, HierarchyVisibilityHandlerOverridableMethod, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { GetElementsTreeProps } from \"./AlwaysAndNeverDrawnElementInfo.js\";\nimport type { FilteredTree } from \"./FilteredTree.js\";\nimport type { ModelsTreeIdsCache } from \"./ModelsTreeIdsCache.js\";\nimport type { IVisibilityChangeEventListener } from \"./VisibilityChangeEventListener.js\";\n\n/** @beta */\ninterface GetCategoryVisibilityStatusProps {\n categoryIds: Id64Arg;\n modelId: Id64String;\n}\n\n/** @beta */\ninterface ChangeCategoryVisibilityStateProps extends GetCategoryVisibilityStatusProps {\n on: boolean;\n}\n\n/** @beta */\ninterface GetGeometricElementVisibilityStatusProps {\n elementId: Id64String;\n modelId: Id64String;\n categoryId: Id64String;\n}\n\n/** @beta */\ninterface ChangeGeometricElementsDisplayStateProps {\n elementIds: Id64Set;\n modelId: Id64String;\n categoryId: Id64String;\n on: boolean;\n}\n\n/** @beta */\ninterface ChangeModelVisibilityStateProps {\n ids: Id64Arg;\n on: boolean;\n}\n\n/** @beta */\ninterface GetFilteredNodeVisibilityProps {\n node: HierarchyNode & { key: ClassGroupingNodeKey | InstancesNodeKey };\n}\n\n/** @beta */\ninterface ChangeFilteredNodeVisibilityProps extends GetFilteredNodeVisibilityProps {\n on: boolean;\n}\n\n/**\n * Functionality of Models tree visibility handler that can be overridden.\n * Each callback is provided original implementation and reference to a `HierarchyVisibilityHandler`.\n * @beta\n */\nexport interface ModelsTreeVisibilityHandlerOverrides {\n getSubjectNodeVisibility?: HierarchyVisibilityHandlerOverridableMethod<(props: { ids: Id64Array }) => Promise<VisibilityStatus>>;\n getModelDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: { ids: Id64Arg }) => Promise<VisibilityStatus>>;\n getCategoryDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: GetCategoryVisibilityStatusProps) => Promise<VisibilityStatus>>;\n getElementGroupingNodeDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: { node: GroupingHierarchyNode }) => Promise<VisibilityStatus>>;\n getElementDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: GetGeometricElementVisibilityStatusProps) => Promise<VisibilityStatus>>;\n\n changeSubjectNodeState?: HierarchyVisibilityHandlerOverridableMethod<(props: { ids: Id64Array; on: boolean }) => Promise<void>>;\n changeModelState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeModelVisibilityStateProps) => Promise<void>>;\n changeCategoryState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeCategoryVisibilityStateProps) => Promise<void>>;\n changeElementGroupingNodeState?: HierarchyVisibilityHandlerOverridableMethod<(props: { node: GroupingHierarchyNode; on: boolean }) => Promise<void>>;\n changeElementsState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeGeometricElementsDisplayStateProps) => Promise<void>>;\n}\n\n/**\n * Props for `createModelsTreeVisibilityHandler`.\n * @internal\n */\nexport interface ModelsTreeVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: ModelsTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector;\n overrides?: ModelsTreeVisibilityHandlerOverrides;\n filteredPaths?: HierarchyFilteringPath[];\n componentId?: GuidString;\n}\n\n/**\n * Creates an instance if `ModelsTreeVisibilityHandler`.\n * @internal\n */\nexport function createModelsTreeVisibilityHandler(props: ModelsTreeVisibilityHandlerProps): HierarchyVisibilityHandler & Disposable {\n return new ModelsTreeVisibilityHandlerImpl(props);\n}\n\nclass ModelsTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler {\n readonly #eventListener: IVisibilityChangeEventListener;\n readonly #alwaysAndNeverDrawnElements: AlwaysAndNeverDrawnElementInfo;\n readonly #idsCache: ModelsTreeIdsCache;\n #filteredTree: Promise<FilteredTree> | undefined;\n #elementChangeQueue = new Subject<Observable<void>>();\n #subscriptions: Subscription[] = [];\n #changeRequest = new Subject<{ key: HierarchyNodeKey; depth: number }>();\n readonly #props: ModelsTreeVisibilityHandlerProps;\n\n constructor(props: ModelsTreeVisibilityHandlerProps) {\n this.#props = props;\n this.#eventListener = createVisibilityChangeEventListener(this.#props.viewport);\n this.#alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo(this.#props.viewport, this.#props.componentId);\n this.#idsCache = this.#props.idsCache;\n this.#filteredTree = this.#props.filteredPaths ? createFilteredTree(this.#props.imodelAccess, this.#props.filteredPaths) : undefined;\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 (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonFilteredTargets && !node.filtering?.hasFilterTargetAncestor) {\n return this.getFilteredNodeVisibility({ node });\n }\n return this.getClassGroupingNodeDisplayStatus(node);\n }\n\n assert(HierarchyNode.isInstancesNode(node));\n\n // Only call getFilteredNodeVisibility when node is not a filter target, is not a child of filter target and has filtered children.\n // Otherwise, it can be handled normally.\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget && !node.filtering.hasFilterTargetAncestor) {\n return this.getFilteredNodeVisibility({ node });\n }\n\n if (ModelsTreeNode.isSubjectNode(node)) {\n // note: subject nodes may be merged to represent multiple subject instances\n return this.getSubjectNodeVisibilityStatus({ subjectIds: node.key.instanceKeys.map((key) => key.id) });\n }\n\n if (ModelsTreeNode.isModelNode(node)) {\n return this.getModelVisibilityStatus({ modelIds: node.key.instanceKeys.map(({ id }) => id) });\n }\n\n const modelId = ModelsTreeNode.getModelId(node);\n assert(modelId !== undefined);\n\n if (ModelsTreeNode.isCategoryNode(node)) {\n return this.getCategoryDisplayStatus({\n categoryIds: node.key.instanceKeys.map(({ id }) => id),\n modelId,\n });\n }\n\n const categoryId = ModelsTreeNode.getCategoryId(node);\n const rootCategoryIds = getRootCategoryIds({ parentKeys: node.parentKeys, modelId });\n assert(rootCategoryIds !== undefined && categoryId !== undefined);\n return this.getElementDisplayStatus({\n elementIds: node.key.instanceKeys.map(({ id }) => id),\n parentKeys: node.parentKeys,\n rootCategoryIds,\n modelId,\n categoryId,\n totalChildrenCount: node.extendedData?.childrenCount ?? 0,\n });\n }\n\n private getFilteredNodeVisibility(props: GetFilteredNodeVisibilityProps) {\n assert(this.#filteredTree !== undefined);\n return from(this.#filteredTree).pipe(\n map((filteredTree) => filteredTree.getVisibilityChangeTargets(props.node)),\n mergeMap(({ subjects, models, categories, elements }) => {\n const observables = new Array<Observable<VisibilityStatus>>();\n if (subjects?.size) {\n observables.push(this.getSubjectNodeVisibilityStatus({ subjectIds: [...subjects], ignoreTooltip: true }));\n }\n\n if (models?.size) {\n observables.push(this.getModelVisibilityStatus({ modelIds: models, ignoreTooltip: true }));\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({ modelId, categoryIds: categoryId, ignoreTooltip: true });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n const filterTargetElements = new Array<Id64String>();\n elements.forEach((elementsMap) =>\n elementsMap.forEach(({ isFilterTarget }, elementId) => {\n if (isFilterTarget) {\n filterTargetElements.push(elementId);\n }\n }),\n );\n let childrenCountMapObs: Observable<Map<Id64String, number>>;\n if (HierarchyNode.isClassGroupingNode(props.node)) {\n const groupingNodesFilterTargets: Map<Id64String, { childrenCount: number }> | undefined = props.node.extendedData?.filterTargets;\n const nestedFilterTargetElements = filterTargetElements.filter((filterTarget) => !groupingNodesFilterTargets?.has(filterTarget));\n // Only need to request children count for indirect children filter targets.\n // Direct children filter targets already have children count stored in grouping nodes extended data.\n childrenCountMapObs = this.#idsCache.getAllChildrenCount({ elementIds: nestedFilterTargetElements });\n } else {\n childrenCountMapObs = this.#idsCache.getAllChildrenCount({ elementIds: filterTargetElements });\n }\n observables.push(\n childrenCountMapObs.pipe(\n // Get children count for all filter target elements.\n map((elementCountMap) => {\n if (!HierarchyNode.isClassGroupingNode(props.node) || !props.node.extendedData?.filterTargets) {\n return elementCountMap;\n }\n // Need to add children count (stored in grouping nodes' extended data) of direct children filter targets.\n const groupingNodesFilterTargets: Map<Id64String, { childrenCount: number }> = props.node.extendedData.filterTargets;\n groupingNodesFilterTargets.forEach((value, key) => elementCountMap.set(key, value.childrenCount));\n return elementCountMap;\n }),\n mergeMap((elementCountMap) =>\n from(elements).pipe(\n releaseMainThreadOnItemsCount(50),\n mergeMap(([categoryKey, elementsMap]) => {\n const { modelId, categoryId } = parseCategoryKey(categoryKey);\n let totalChildrenCount = 0;\n elementsMap.forEach((_, elementId) => {\n const childCount = elementCountMap.get(elementId);\n if (childCount) {\n totalChildrenCount += childCount;\n }\n });\n const parentElementIdsPath = getParentElementsIdsPath({ parentKeys: props.node.parentKeys, modelId });\n const rootCategoryIds = getRootCategoryIds({ parentKeys: props.node.parentKeys, modelId });\n return this.getElementsDisplayStatus({\n elementIds: [...elementsMap.keys()],\n rootCategoryIds: rootCategoryIds ?? categoryId,\n parentElementIdsPath,\n modelId,\n categoryId,\n childrenCount: totalChildrenCount,\n });\n }),\n ),\n ),\n ),\n );\n }\n\n return merge(...observables);\n }),\n mergeVisibilityStatuses(),\n );\n }\n\n private getSubjectNodeVisibilityStatus({ subjectIds, ignoreTooltip }: { subjectIds: Id64Array; ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this.#props.viewport.view.isSpatialView()) {\n return of(createVisibilityStatus(\"disabled\", getTooltipOptions(\"modelsTree.subject.nonSpatialView\", ignoreTooltip)));\n }\n\n return this.#idsCache.getSubjectModelIds(subjectIds).pipe(\n mergeMap((modelIds) => this.getModelVisibilityStatus({ modelIds, ignoreTooltip: true })),\n mergeVisibilityStatuses(\n {\n visible: \"modelsTree.subject.allModelsVisible\",\n hidden: \"modelsTree.subject.allModelsHidden\",\n partial: \"modelsTree.subject.someModelsHidden\",\n },\n ignoreTooltip,\n ),\n );\n });\n return createVisibilityHandlerResult(this, { ids: subjectIds }, result, this.#props.overrides?.getSubjectNodeVisibility);\n }\n\n private getModelVisibilityStatus({ modelIds, ignoreTooltip }: { modelIds: Id64Arg; ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n const viewport = this.#props.viewport;\n if (!viewport.view.isSpatialView()) {\n return of(createVisibilityStatus(\"disabled\", getTooltipOptions(\"modelsTree.model.nonSpatialView\", ignoreTooltip)));\n }\n\n return from(Id64.iterable(modelIds)).pipe(\n distinct(),\n mergeMap((modelId) => {\n if (!viewport.view.viewsModel(modelId)) {\n return this.#idsCache.getModelCategories(modelId).pipe(\n mergeMap((categoryIds) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n this.getSubModeledElementsVisibilityStatus({\n ignoreTooltips: ignoreTooltip,\n haveSubModel: \"yes\",\n tooltips: { visible: undefined, hidden: \"modelsTree.model.hiddenThroughModelSelector\", partial: \"modelsTree.model.someSubModelsVisible\" },\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n }),\n );\n }\n return this.#idsCache.getModelCategories(modelId).pipe(\n mergeMap((categoryIds) => {\n return categoryIds.length === 0\n ? of(createVisibilityStatus(\"visible\"))\n : this.getCategoryDisplayStatus({ modelId, categoryIds, ignoreTooltip: true });\n }),\n mergeVisibilityStatuses({\n visible: \"modelsTree.model.allCategoriesVisible\",\n partial: \"modelsTree.model.someCategoriesHidden\",\n hidden: \"modelsTree.model.allCategoriesHidden\",\n }),\n );\n }),\n mergeVisibilityStatuses(),\n );\n });\n return createVisibilityHandlerResult(this, { ids: modelIds }, result, this.#props.overrides?.getModelDisplayStatus);\n }\n\n private getDefaultCategoryVisibilityStatus({\n modelId,\n categoryIds,\n ignoreTooltip,\n }: {\n categoryIds: Id64Arg;\n modelId: Id64String;\n ignoreTooltip?: boolean;\n }): VisibilityStatus {\n const viewport = this.#props.viewport;\n\n if (!viewport.view.viewsModel(modelId) || Id64.sizeOf(categoryIds) === 0) {\n return createVisibilityStatus(\"hidden\", getTooltipOptions(\"modelsTree.category.hiddenThroughModel\", ignoreTooltip));\n }\n\n let visibility: \"visible\" | \"hidden\" | \"unknown\" = \"unknown\";\n for (const categoryId of Id64.iterable(categoryIds)) {\n const override = this.#props.viewport.perModelCategoryVisibility.getOverride(modelId, categoryId);\n if (override === PerModelCategoryVisibility.Override.Show) {\n if (visibility === \"hidden\") {\n return createVisibilityStatus(\"partial\");\n }\n visibility = \"visible\";\n continue;\n }\n if (override === PerModelCategoryVisibility.Override.Hide) {\n if (visibility === \"visible\") {\n return createVisibilityStatus(\"partial\");\n }\n visibility = \"hidden\";\n continue;\n }\n const isVisible = viewport.view.viewsCategory(categoryId);\n if (isVisible && visibility === \"hidden\") {\n return createVisibilityStatus(\"partial\");\n }\n if (!isVisible && visibility === \"visible\") {\n return createVisibilityStatus(\"partial\");\n }\n visibility = isVisible ? \"visible\" : \"hidden\";\n }\n assert(visibility !== \"unknown\");\n\n return createVisibilityStatus(visibility);\n }\n\n private getCategoryDisplayStatus({ ignoreTooltip, ...props }: GetCategoryVisibilityStatusProps & { ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this.#props.viewport.view.viewsModel(props.modelId)) {\n return this.#idsCache.getCategoriesModeledElements(props.modelId, props.categoryIds).pipe(\n this.getSubModeledElementsVisibilityStatus({\n ignoreTooltips: ignoreTooltip,\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n tooltips: {\n visible: undefined,\n hidden: \"modelsTree.category.hiddenThroughModel\",\n partial: \"modelsTree.category.someElementsOrSubModelsHidden\",\n },\n haveSubModel: \"yes\",\n }),\n );\n }\n\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n categoryProps: { categoryIds: props.categoryIds, modelId: props.modelId },\n tooltips: {\n allElementsInAlwaysDrawnList: \"modelsTree.category.allElementsVisible\",\n allElementsInNeverDrawnList: \"modelsTree.category.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"modelsTree.category.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"modelsTree.category.allElementsHidden\",\n },\n defaultStatus: (categoryId) =>\n categoryId\n ? this.getDefaultCategoryVisibilityStatus({ modelId: props.modelId, categoryIds: categoryId })\n : this.getDefaultCategoryVisibilityStatus({ modelId: props.modelId, categoryIds: props.categoryIds }),\n ignoreTooltip,\n }).pipe(\n mergeMap((visibilityStatusAlwaysAndNeverDraw) => {\n return this.#idsCache.getCategoriesModeledElements(props.modelId, props.categoryIds).pipe(\n this.getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: \"modelsTree.category.allElementsAndSubModelsHidden\",\n partial: \"modelsTree.category.someElementsOrSubModelsHidden\",\n },\n haveSubModel: \"yes\",\n parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,\n ignoreTooltips: ignoreTooltip,\n }),\n );\n }),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this.#props.overrides?.getCategoryDisplayStatus);\n }\n\n private getClassGroupingNodeDisplayStatus(node: GroupingHierarchyNode): Observable<VisibilityStatus> {\n const { elementIds, modelId, categoryId, childrenCount } = this.getGroupingNodeInfo(node);\n const result = defer(() => {\n const rootCategoryIds = getRootCategoryIds({ parentKeys: node.parentKeys, modelId });\n assert(rootCategoryIds !== undefined);\n return this.getElementsDisplayStatus({\n elementIds,\n modelId,\n categoryId,\n rootCategoryIds,\n parentElementIdsPath: getParentElementsIdsPath({ parentKeys: node.parentKeys, modelId }),\n childrenCount: childrenCount ?? 0,\n });\n });\n return createVisibilityHandlerResult(this, { node }, result, this.#props.overrides?.getElementGroupingNodeDisplayStatus);\n }\n\n private getElementDisplayStatus({\n parentKeys,\n totalChildrenCount,\n elementIds,\n modelId,\n rootCategoryIds,\n categoryId,\n }: {\n elementIds: Id64Array;\n modelId: Id64String;\n categoryId: Id64String;\n rootCategoryIds: Id64Arg;\n parentKeys: HierarchyNodeKey[];\n totalChildrenCount: number;\n }): Observable<VisibilityStatus> {\n const result = this.getElementsDisplayStatus({\n rootCategoryIds,\n elementIds,\n modelId,\n categoryId,\n parentElementIdsPath: getParentElementsIdsPath({ parentKeys, modelId }),\n childrenCount: totalChildrenCount,\n });\n return createVisibilityHandlerResult(this, { elementId: elementIds[0], modelId, categoryId }, result, this.#props.overrides?.getElementDisplayStatus);\n }\n\n private getElementsDisplayStatus(props: {\n elementIds: Id64Array | Id64Set;\n modelId: Id64String;\n categoryId: Id64String;\n parentElementIdsPath: Array<Id64Arg>;\n rootCategoryIds: Id64Arg;\n childrenCount: number;\n }): Observable<VisibilityStatus> {\n return defer(() => {\n const { modelId, categoryId, elementIds, parentElementIdsPath, childrenCount, rootCategoryIds } = props;\n\n if (!this.#props.viewport.view.viewsModel(modelId)) {\n return of(elementIds).pipe(\n this.getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: undefined,\n partial: \"modelsTree.groupingNode.someElementsOrSubModelsHidden\",\n },\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n haveSubModel: \"unknown\",\n }),\n );\n }\n\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n elements: elementIds,\n parentElementIdsPath,\n modelIds: modelId,\n rootCategoryIds,\n childrenCount,\n defaultStatus: () => {\n const status = this.getDefaultCategoryVisibilityStatus({ categoryIds: categoryId, modelId, ignoreTooltip: true });\n return createVisibilityStatus(status.state, getTooltipOptions(`modelsTree.groupingNode.${status.state}ThroughCategory`));\n },\n tooltips: {\n allElementsInAlwaysDrawnList: \"modelsTree.groupingNode.allElementsVisible\",\n allElementsInNeverDrawnList: \"modelsTree.groupingNode.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"modelsTree.groupingNode.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"modelsTree.groupingNode.allElementsHidden\",\n },\n }).pipe(\n mergeMap((visibilityStatusAlwaysAndNeverDraw) => {\n return of(elementIds).pipe(\n this.getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: \"modelsTree.groupingNode.allElementsAndSubModelsHidden\",\n partial: \"modelsTree.groupingNode.someElementsOrSubModelsHidden\",\n },\n parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,\n haveSubModel: \"unknown\",\n }),\n );\n }),\n );\n });\n }\n /** Changes visibility of the items represented by the tree node. */\n private changeVisibilityObs(node: HierarchyNode, on: boolean): Observable<void> {\n const changeObs = defer(() => {\n if (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonFilteredTargets && !node.filtering?.hasFilterTargetAncestor) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n return this.changeElementGroupingNodeState(node, on);\n }\n\n if (!HierarchyNode.isInstancesNode(node)) {\n return EMPTY;\n }\n\n // Only call changeFilteredNodeVisibility when node is not a filter target, is not a child of filter target and has filtered children.\n // Otherwise, it can be handled normally.\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget && !node.filtering.hasFilterTargetAncestor) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n\n if (ModelsTreeNode.isSubjectNode(node)) {\n return this.changeSubjectNodeState(\n node.key.instanceKeys.map((key) => key.id),\n on,\n );\n }\n\n if (ModelsTreeNode.isModelNode(node)) {\n return this.changeModelState({ ids: node.key.instanceKeys.map(({ id }) => id), on });\n }\n\n const modelId = ModelsTreeNode.getModelId(node);\n if (!modelId) {\n return EMPTY;\n }\n\n if (ModelsTreeNode.isCategoryNode(node)) {\n return this.changeCategoryState({\n categoryIds: node.key.instanceKeys.map(({ id }) => id),\n modelId,\n on,\n });\n }\n\n const categoryId = ModelsTreeNode.getCategoryId(node);\n if (!categoryId) {\n return EMPTY;\n }\n const elementIds = new Set(node.key.instanceKeys.map(({ id }) => id));\n return this.#idsCache.getChildrenTree({ elementIds }).pipe(\n map((childrenTree): Id64Set => {\n // Children tree contains provided elementIds, they are at the root of this tree.\n // We want to skip them and only get ids of children.\n return getIdsFromChildrenTree({ tree: childrenTree, predicate: ({ depth }) => depth > 0 });\n }),\n mergeMap((children) =>\n this.changeElementsState({\n elementIds,\n modelId,\n children: children.size > 0 ? children : undefined,\n categoryId,\n on,\n }),\n ),\n );\n });\n if (this.#props.viewport.isAlwaysDrawnExclusive) {\n return concat(this.removeAlwaysDrawnExclusive(), changeObs);\n }\n return changeObs;\n }\n\n private changeFilteredNodeVisibility({ on, ...props }: ChangeFilteredNodeVisibilityProps) {\n assert(this.#filteredTree !== undefined);\n return from(this.#filteredTree).pipe(\n map((filteredTree) => filteredTree.getVisibilityChangeTargets(props.node)),\n mergeMap(({ subjects, categories, elements, models }) => {\n const observables = new Array<Observable<void>>();\n if (subjects?.size) {\n observables.push(this.changeSubjectNodeState([...subjects], 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, on });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n const filterTargetElements = new Array<Id64String>();\n const elementsSet = new Set<Id64String>();\n elements.forEach((elementsMap) =>\n elementsMap.forEach(({ isFilterTarget }, elementId) => {\n elementsSet.add(elementId);\n if (isFilterTarget) {\n filterTargetElements.push(elementId);\n }\n }),\n );\n observables.push(\n this.#idsCache.getChildrenTree({ elementIds: filterTargetElements }).pipe(\n map((childrenTree) => getIdsFromChildrenTree({ tree: childrenTree })),\n map((childrenIds) => setDifference(childrenIds, elementsSet)),\n mergeMap((childElementIds) =>\n from(elements).pipe(\n mergeMap(([categoryKey, elementsMap]) => {\n const { modelId, categoryId } = parseCategoryKey(categoryKey);\n return this.changeElementsState({\n modelId,\n categoryId,\n elementIds: new Set([...elementsMap.keys()]),\n on,\n children: childElementIds.size > 0 ? childElementIds : undefined,\n });\n }),\n ),\n ),\n ),\n );\n }\n\n return merge(...observables);\n }),\n );\n }\n\n private removeAlwaysDrawnExclusive(): Observable<void> {\n return this.#idsCache.getAllCategories().pipe(\n map((categoryIds) => {\n this.#props.viewport.changeCategoryDisplay(categoryIds, false, false);\n this.#props.viewport.clearNeverDrawn();\n this.#props.viewport.perModelCategoryVisibility.clearOverrides();\n this.#props.viewport.setAlwaysDrawn(this.#props.viewport.alwaysDrawn ?? new Set());\n }),\n );\n }\n\n private changeSubjectNodeState(ids: Id64Array, on: boolean): Observable<void> {\n const result = defer(() => {\n if (!this.#props.viewport.view.isSpatialView()) {\n return EMPTY;\n }\n\n return this.#idsCache.getSubjectModelIds(ids).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));\n });\n return createVisibilityHandlerResult(this, { ids, on }, result, this.#props.overrides?.changeSubjectNodeState);\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 if (!viewport.view.isSpatialView()) {\n return EMPTY;\n }\n\n const idsObs = from(Id64.iterable(ids));\n if (!on) {\n viewport.changeModelDisplay(ids, false);\n return idsObs.pipe(\n mergeMap((modelId) => forkJoin({ categoryIds: this.#idsCache.getModelCategories(modelId), modelId: of(modelId) })),\n mergeMap(({ modelId, categoryIds }) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on })),\n );\n }\n\n return concat(\n defer(() => {\n viewport.perModelCategoryVisibility.clearOverrides(ids);\n return from(viewport.addViewedModels(ids));\n }),\n idsObs.pipe(\n mergeMap((modelId) => {\n return this.#idsCache.getModelCategories(modelId).pipe(mergeMap((categoryIds) => this.changeCategoryState({ categoryIds, modelId, on: true })));\n }),\n ),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this.#props.overrides?.changeModelState);\n }\n\n private showModelWithoutAnyCategoriesOrElements(modelId: Id64String): Observable<void> {\n const viewport = this.#props.viewport;\n return forkJoin({\n categories: this.#idsCache.getModelCategories(modelId),\n alwaysDrawnElements: this.getAlwaysOrNeverDrawnElements({ modelIds: modelId, setType: \"always\" }),\n }).pipe(\n mergeMap(({ categories, alwaysDrawnElements }) => {\n const alwaysDrawn = this.#props.viewport.alwaysDrawn;\n if (alwaysDrawn && alwaysDrawnElements) {\n viewport.setAlwaysDrawn(setDifference(alwaysDrawn, alwaysDrawnElements));\n }\n\n return concat(\n from(Id64.iterable(categories)).pipe(\n releaseMainThreadOnItemsCount(300),\n map((categoryId) => this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, false)),\n ),\n defer(async () => viewport.addViewedModels(modelId)),\n );\n }),\n );\n }\n\n private changeCategoryStateInViewportAccordingToModelVisibility(modelId: string, categoryId: string, on: 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 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, true);\n }\n }\n\n private changeCategoryState(props: ChangeCategoryVisibilityStateProps): Observable<void> {\n const result = defer(() => {\n const viewport = this.#props.viewport;\n const { modelId, categoryIds, on } = props;\n return concat(\n props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n from(Id64.iterable(categoryIds)).pipe(\n releaseMainThreadOnItemsCount(300),\n map((categoryId) => this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, on)),\n ),\n this.clearAlwaysAndNeverDrawnElements(props),\n this.#idsCache\n .getCategoriesModeledElements(modelId, categoryIds)\n .pipe(mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on }))),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this.#props.overrides?.changeCategoryState);\n }\n\n private doChangeElementsState(\n props: ChangeGeometricElementsDisplayStateProps & {\n children: Id64Arg | undefined;\n },\n ): Observable<void | undefined> {\n return defer(() => {\n const { modelId, categoryId, elementIds, on, children } = 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.getDefaultCategoryVisibilityStatus({ categoryIds: categoryId, modelId, ignoreTooltip: true });\n const isCategoryVisible = categoryVisibility.state === \"visible\";\n // Make sure to add all children to always/never drawn list.\n const isDisplayedByDefault =\n // When category is visible and elements need to be turned off, or when category is hidden and elements need to be turned on,\n // We can set isDisplayedByDefault to isCategoryVisible. This allows to not check if each element is in the elementIds list or not.\n isCategoryVisible === !on\n ? () => isCategoryVisible\n : (elementId: Id64String) => {\n if (elementIds.has(elementId)) {\n return isCategoryVisible;\n }\n return !on;\n };\n const elementsToChange = children ? [...elementIds, ...(typeof children === \"string\" ? [children] : children)] : elementIds;\n return this.queueElementsVisibilityChange(elementsToChange, on, isDisplayedByDefault);\n }),\n from(elementIds).pipe(\n mergeMap((elementId) =>\n forkJoin({\n elementId: of(elementId),\n isSubModel: this.#idsCache.hasSubModel(elementId),\n }),\n ),\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 { modelId, categoryId, elementIds } = this.getGroupingNodeInfo(node);\n const result = this.#idsCache.getChildrenTree({ elementIds }).pipe(\n map((childrenTree) => getIdsFromChildrenTree({ tree: childrenTree, predicate: ({ depth }) => depth > 0 })),\n mergeMap((children) =>\n this.doChangeElementsState({\n modelId,\n categoryId,\n elementIds,\n children: children.size > 0 ? children : undefined,\n on,\n }),\n ),\n );\n return createVisibilityHandlerResult(this, { node, on }, result, this.#props.overrides?.changeElementGroupingNodeState);\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 & { children: Id64Arg | undefined }): Observable<void> {\n const result = this.doChangeElementsState(props);\n return createVisibilityHandlerResult(this, props, result, this.#props.overrides?.changeElementsState);\n }\n\n private queueElementsVisibilityChange(elementIds: Id64Arg, on: boolean, visibleByDefault: (elementId: Id64String) => 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(Id64.iterable(elementIds)).pipe(\n // check if visibility change is not finished (cancelled) due to change overall change request being cancelled\n takeUntil(changeFinished),\n this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault: visibleByDefault }),\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 changeElementStateNoChildrenOperator(props: {\n on: boolean;\n isDisplayedByDefault: (elementId: Id64String) => boolean;\n }): OperatorFunction<string, void> {\n return (elementIds: Observable<Id64String>) => {\n const { on, isDisplayedByDefault } = props;\n const isAlwaysDrawnExclusive = this.#props.viewport.isAlwaysDrawnExclusive;\n return elementIds.pipe(\n releaseMainThreadOnItemsCount(500),\n reduce<string, { changedNeverDrawn: boolean; changedAlwaysDrawn: boolean; neverDrawn: Id64Set | undefined; alwaysDrawn: Id64Set | undefined }>(\n (acc, elementId) => {\n if (acc.alwaysDrawn === undefined || acc.neverDrawn === undefined) {\n acc.alwaysDrawn = new Set(this.#props.viewport.alwaysDrawn || []);\n acc.neverDrawn = new Set(this.#props.viewport.neverDrawn || []);\n }\n if (on) {\n const wasRemoved = acc.neverDrawn.delete(elementId);\n acc.changedNeverDrawn ||= wasRemoved;\n // If exclusive mode is enabled, we must add the element to the always drawn list.\n if ((!isDisplayedByDefault(elementId) || isAlwaysDrawnExclusive) && !acc.alwaysDrawn.has(elementId)) {\n acc.alwaysDrawn.add(elementId);\n acc.changedAlwaysDrawn = true;\n }\n } else {\n const wasRemoved = acc.alwaysDrawn.delete(elementId);\n acc.changedAlwaysDrawn ||= wasRemoved;\n // If exclusive mode is not enabled, we have to add the element to the never drawn list.\n if (isDisplayedByDefault(elementId) && !isAlwaysDrawnExclusive && !acc.neverDrawn.has(elementId)) {\n acc.neverDrawn.add(elementId);\n acc.changedNeverDrawn = true;\n }\n }\n return acc;\n },\n {\n changedNeverDrawn: false,\n changedAlwaysDrawn: false,\n neverDrawn: undefined,\n alwaysDrawn: undefined,\n },\n ),\n map((state) => {\n state.changedNeverDrawn && state.neverDrawn && this.#props.viewport.setNeverDrawn(state.neverDrawn);\n state.changedAlwaysDrawn && state.alwaysDrawn && this.#props.viewport.setAlwaysDrawn(state.alwaysDrawn, this.#props.viewport.isAlwaysDrawnExclusive);\n }),\n );\n };\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElementsImpl(\n props: {\n alwaysDrawn: Id64Arg | undefined;\n neverDrawn: Id64Arg | undefined;\n totalCount: number;\n } & GetVisibilityFromAlwaysAndNeverDrawnElementsProps & { ignoreTooltip?: boolean },\n ): VisibilityStatus {\n const { alwaysDrawn, neverDrawn, totalCount, ignoreTooltip } = props;\n if (totalCount === 0) {\n return props.defaultStatus();\n }\n const neverDrawnSize = neverDrawn ? Id64.sizeOf(neverDrawn) : undefined;\n const alwaysDrawnSize = alwaysDrawn ? Id64.sizeOf(alwaysDrawn) : undefined;\n if (neverDrawnSize === totalCount) {\n return createVisibilityStatus(\"hidden\", getTooltipOptions(props.tooltips.allElementsInNeverDrawnList, ignoreTooltip));\n }\n\n if (alwaysDrawnSize === totalCount) {\n return createVisibilityStatus(\"visible\", getTooltipOptions(props.tooltips.allElementsInAlwaysDrawnList, ignoreTooltip));\n }\n\n const viewport = this.#props.viewport;\n if (viewport.isAlwaysDrawnExclusive && viewport.alwaysDrawn?.size) {\n return alwaysDrawnSize\n ? createVisibilityStatus(\"partial\", getTooltipOptions(props.tooltips.elementsInBothAlwaysAndNeverDrawn, ignoreTooltip))\n : createVisibilityStatus(\"hidden\", getTooltipOptions(props.tooltips.noElementsInExclusiveAlwaysDrawnList, ignoreTooltip));\n }\n\n const status = props.defaultStatus();\n if ((status.state === \"visible\" && neverDrawnSize) || (status.state === \"hidden\" && alwaysDrawnSize)) {\n return createVisibilityStatus(\"partial\", getTooltipOptions(undefined, ignoreTooltip));\n }\n return status;\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElements({\n ignoreTooltip,\n ...props\n }: GetVisibilityFromAlwaysAndNeverDrawnElementsProps &\n (\n | { elements: Id64Set | Id64Array; parentElementIdsPath: Array<Id64Arg>; childrenCount: number; modelIds: Id64Arg; rootCategoryIds: Id64Arg }\n | { categoryProps: { categoryIds: Id64Arg; modelId: Id64String } }\n ) & {\n ignoreTooltip?: boolean;\n }): 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 const parentElementIdsPath = [...props.parentElementIdsPath, props.elements];\n return forkJoin({\n childAlwaysDrawn: this.getAlwaysOrNeverDrawnElements({\n modelIds: props.modelIds,\n categoryIds: props.rootCategoryIds,\n parentElementIdsPath,\n setType: \"always\",\n }),\n childNeverDrawn: this.getAlwaysOrNeverDrawnElements({\n modelIds: props.modelIds,\n categoryIds: props.rootCategoryIds,\n parentElementIdsPath,\n setType: \"never\",\n }),\n }).pipe(\n map(({ childAlwaysDrawn, childNeverDrawn }) => {\n const alwaysDrawn = new Set([...childAlwaysDrawn, ...(viewport.alwaysDrawn?.size ? setIntersection(props.elements, viewport.alwaysDrawn) : [])]);\n const neverDrawn = new Set([...childNeverDrawn, ...(viewport.neverDrawn?.size ? setIntersection(props.elements, viewport.neverDrawn) : [])]);\n return this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n alwaysDrawn: alwaysDrawn.size > 0 ? alwaysDrawn : undefined,\n neverDrawn: neverDrawn.size > 0 ? neverDrawn : undefined,\n totalCount: props.childrenCount + Id64.sizeOf(props.elements),\n ignoreTooltip,\n });\n }),\n );\n }\n const { modelId, categoryIds } = props.categoryProps;\n return from(Id64.iterable(categoryIds)).pipe(\n releaseMainThreadOnItemsCount(100),\n mergeMap((categoryId) => {\n return forkJoin({\n categoryId: of(categoryId),\n totalCount: this.#idsCache.getCategoryElementsCount(modelId, categoryId),\n alwaysDrawn: this.getAlwaysOrNeverDrawnElements({ modelIds: modelId, categoryIds: categoryId, setType: \"always\" }),\n neverDrawn: this.getAlwaysOrNeverDrawnElements({ modelIds: modelId, categoryIds: categoryId, setType: \"never\" }),\n });\n }),\n // There is a known bug:\n // Categories that don't have root elements will make visibility result incorrect\n // E.g.:\n // - CategoryA\n // - ElementA (CategoryA is visible)\n // - ChildElementB (CategoryB is hidden) ChildElementB is in always drawn list\n // Result will be \"partial\" because CategoryB will return hidden visibility, even though all elements are visible\n // TODO fix with: https://github.com/iTwin/viewer-components-react/issues/1100\n mergeMap((state) => {\n if (this.#props.viewport.isAlwaysDrawnExclusive && state.totalCount === 0) {\n return EMPTY;\n }\n return of(\n this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n ...state,\n defaultStatus: () => props.defaultStatus(state.categoryId),\n ignoreTooltip,\n }),\n );\n }),\n mergeVisibilityStatuses(),\n );\n }\n\n private getAlwaysOrNeverDrawnElements(props: GetElementsTreeProps): Observable<Id64Set> {\n if (!this.#filteredTree) {\n return this.#alwaysAndNeverDrawnElements\n .getElementsTree(props)\n .pipe(map((childrenTree) => getIdsFromChildrenTree({ tree: childrenTree, predicate: ({ treeEntry }) => treeEntry.isInAlwaysOrNeverDrawnSet })));\n }\n // When filtered tree is present, children tree retrieved from alwaysAndNeverDrawnElements may include elements that are not present in filtered tree.\n // Need to filter out such elements.\n return forkJoin({\n filteredTree: from(this.#filteredTree),\n childrenTree: this.#alwaysAndNeverDrawnElements.getElementsTree(props),\n }).pipe(\n map(({ filteredTree, childrenTree }) => {\n const parentIdsPath = [props.modelIds];\n if (\"categoryIds\" in props) {\n parentIdsPath.push(props.categoryIds);\n if (\"parentElementIdsPath\" in props) {\n props.parentElementIdsPath.forEach((parentElementIds) => parentIdsPath.push(parentElementIds));\n }\n }\n // Get all ids that exist in filtered tree.\n const elements = filteredTree.getElementsFromUnfilteredChildrenTree({ parentIdsPath, childrenTree });\n return elements\n ? // Need to filter elements that are in always/never drawn set.\n setIntersection(elements, getIdsFromChildrenTree({ tree: childrenTree, predicate: ({ treeEntry }) => treeEntry.isInAlwaysOrNeverDrawnSet }))\n : new Set();\n }),\n );\n }\n\n private clearAlwaysAndNeverDrawnElements(props: { categoryIds: Id64Arg; modelId: Id64String }) {\n return forkJoin({\n alwaysDrawn: this.getAlwaysOrNeverDrawnElements({ modelIds: props.modelId, categoryIds: props.categoryIds, setType: \"always\" }),\n neverDrawn: this.getAlwaysOrNeverDrawnElements({ modelIds: props.modelId, categoryIds: props.categoryIds, setType: \"never\" }),\n }).pipe(\n map(({ alwaysDrawn, neverDrawn }) => {\n const viewport = this.#props.viewport;\n if (viewport.alwaysDrawn?.size && alwaysDrawn.size) {\n viewport.setAlwaysDrawn(setDifference(viewport.alwaysDrawn, alwaysDrawn));\n }\n if (viewport.neverDrawn?.size && neverDrawn.size) {\n viewport.setNeverDrawn(setDifference(viewport.neverDrawn, neverDrawn));\n }\n }),\n );\n }\n\n private getGroupingNodeInfo(node: GroupingHierarchyNode) {\n const modelId = ModelsTreeNode.getModelId(node);\n const categoryId = ModelsTreeNode.getCategoryId(node);\n assert(!!modelId && !!categoryId);\n\n const elementIds = new Set(node.groupedInstanceKeys.map((key) => key.id));\n const childrenCount: number | undefined = node.extendedData?.childrenCount;\n const isFiltered: boolean = node.extendedData?.isFiltered;\n return { modelId, categoryId, elementIds, childrenCount, isFiltered };\n }\n\n private getSubModeledElementsVisibilityStatus({\n parentNodeVisibilityStatus,\n haveSubModel,\n tooltips,\n ignoreTooltips,\n }: {\n parentNodeVisibilityStatus: VisibilityStatus;\n haveSubModel: \"yes\" | \"unknown\";\n tooltips: { [key in Visibility]: string | undefined };\n ignoreTooltips?: boolean;\n }): OperatorFunction<Id64Arg, VisibilityStatus> {\n return (obs) => {\n return obs.pipe(\n // ensure we're only looking at elements that have a sub-model\n mergeMap((modeledElementIds) => {\n if (haveSubModel === \"yes\") {\n return of(modeledElementIds);\n }\n return from(Id64.iterable(modeledElementIds)).pipe(\n releaseMainThreadOnItemsCount(100),\n mergeMap((elementId) =>\n forkJoin({\n hasSubModel: this.#idsCache.hasSubModel(elementId),\n elementId: of(elementId),\n }),\n ),\n filter(({ hasSubModel }) => hasSubModel),\n map(({ elementId }) => elementId),\n toArray(),\n );\n }),\n // combine visibility status of sub-models with visibility status of parent node\n mergeMap((modeledElementIds) => {\n if (Id64.sizeOf(modeledElementIds) === 0) {\n return of(parentNodeVisibilityStatus);\n }\n return this.getModelVisibilityStatus({ modelIds: typeof modeledElementIds === \"string\" ? [modeledElementIds] : modeledElementIds }).pipe(\n startWith<VisibilityStatus>(parentNodeVisibilityStatus),\n mergeVisibilityStatuses(tooltips, ignoreTooltips),\n );\n }),\n );\n };\n }\n}\n\ninterface GetVisibilityFromAlwaysAndNeverDrawnElementsProps {\n tooltips: {\n allElementsInNeverDrawnList: string;\n allElementsInAlwaysDrawnList: string;\n elementsInBothAlwaysAndNeverDrawn: string;\n noElementsInExclusiveAlwaysDrawnList: string;\n };\n /** Status when always/never lists are empty and exclusive mode is off */\n defaultStatus: (categoryId?: Id64String) => VisibilityStatus;\n}\n\n/**\n * Enables display of all given models. Also enables display of all categories and clears always and\n * never drawn lists in the viewport.\n *\n * @param componentId Optional unique id of the component that consumes this function.\n * It can be any string, as long as it is not shared across different components.\n * @public\n */\nexport async function showAllModels(models: string[], viewport: Viewport, componentId?: GuidString) {\n await viewport.addViewedModels(models);\n viewport.clearNeverDrawn();\n viewport.clearAlwaysDrawn();\n\n const categories = await loadCategoriesFromViewport(viewport, componentId);\n if (categories.length === 0) {\n return;\n }\n const ids = categories.map((category) => category.categoryId);\n await enableCategoryDisplay(viewport, ids, true);\n}\n\n/**\n * Disables display of all given models.\n * @public\n */\nexport async function hideAllModels(models: string[], viewport: Viewport) {\n viewport.changeModelDisplay(models, false);\n}\n\n/**\n * Inverts display of all given models.\n * @public\n */\nexport async function invertAllModels(models: string[], viewport: Viewport) {\n const notViewedModels: string[] = [];\n const viewedModels: string[] = [];\n models.forEach((modelId) => {\n if (viewport.viewsModel(modelId)) {\n viewedModels.push(modelId);\n } else {\n notViewedModels.push(modelId);\n }\n });\n await viewport.addViewedModels(notViewedModels);\n viewport.changeModelDisplay(viewedModels, false);\n}\n\n/**\n * Based on the value of `enable` argument, either enables or disables display of given models.\n * @public\n */\nexport async function toggleModels(models: string[], enable: boolean, viewport: Viewport) {\n if (!models) {\n return;\n }\n if (enable) {\n viewport.changeModelDisplay(models, false);\n } else {\n await viewport.addViewedModels(models);\n }\n}\n\n/**\n * Checks if all given models are displayed in given viewport.\n * @public\n */\nexport function areAllModelsVisible(models: string[], viewport: Viewport) {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n\nfunction getParentElementsIdsPath(props: { parentKeys: HierarchyNodeKey[]; modelId: Id64String }): Array<Id64Arg> {\n const parentElementIdsPath = new Array<Id64Arg>();\n const modelIndex = props.parentKeys.findIndex(\n (parentKey) => HierarchyNodeKey.isInstances(parentKey) && parentKey.instanceKeys.some((instanceKey) => instanceKey.id === props.modelId),\n );\n if (modelIndex === -1) {\n return parentElementIdsPath;\n }\n // Hierarchy is model -> category -> root elements.\n // Root elements index is 2 more than models'.\n const firstParentIndex = modelIndex + 2;\n for (let i = firstParentIndex; i < props.parentKeys.length; ++i) {\n const parentKey = props.parentKeys[i];\n if (!HierarchyNodeKey.isInstances(parentKey)) {\n continue;\n }\n parentElementIdsPath.push(parentKey.instanceKeys.map(({ id }) => id));\n }\n return parentElementIdsPath;\n}\n\nfunction getRootCategoryIds(props: { parentKeys: HierarchyNodeKey[]; modelId: Id64String }): Id64Arg | undefined {\n const modelIndex = props.parentKeys.findIndex(\n (parentKey) => HierarchyNodeKey.isInstances(parentKey) && parentKey.instanceKeys.some((instanceKey) => instanceKey.id === props.modelId),\n );\n if (modelIndex === -1 || modelIndex + 1 === props.parentKeys.length) {\n return undefined;\n }\n const rootCategoryKeys = props.parentKeys[modelIndex + 1];\n if (!HierarchyNodeKey.isInstances(rootCategoryKeys)) {\n return undefined;\n }\n return rootCategoryKeys.instanceKeys.map(({ id }) => id);\n}\n"]}
1
+ {"version":3,"file":"ModelsTreeVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.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 distinct,\n EMPTY,\n filter,\n firstValueFrom,\n forkJoin,\n from,\n fromEventPattern,\n map,\n merge,\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 { enableCategoryDisplay, loadCategoriesFromViewport } from \"../../common/CategoriesVisibilityUtils.js\";\nimport { getTooltipOptions, mergeVisibilityStatuses, releaseMainThreadOnItemsCount, setDifference, setIntersection } from \"../../common/internal/Utils.js\";\nimport { toVoidPromise } from \"../../common/Rxjs.js\";\nimport { createVisibilityStatus } from \"../../common/Tooltip.js\";\nimport { createVisibilityHandlerResult } from \"../../common/UseHierarchyVisibility.js\";\nimport { getIdsFromChildrenTree } from \"../Utils.js\";\nimport { AlwaysAndNeverDrawnElementInfo } from \"./AlwaysAndNeverDrawnElementInfo.js\";\nimport { createFilteredTree, parseCategoryKey } from \"./FilteredTree.js\";\nimport { ModelsTreeNode } from \"./ModelsTreeNode.js\";\nimport { createVisibilityChangeEventListener } from \"./VisibilityChangeEventListener.js\";\n\nimport type { Observable, OperatorFunction, Subscription } from \"rxjs\";\nimport type { GuidString, Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { ClassGroupingNodeKey, GroupingHierarchyNode, HierarchyFilteringPath, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector } from \"@itwin/presentation-shared\";\nimport type { Visibility } from \"../../common/Tooltip.js\";\nimport type { HierarchyVisibilityHandler, HierarchyVisibilityHandlerOverridableMethod, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { GetElementsTreeProps } from \"./AlwaysAndNeverDrawnElementInfo.js\";\nimport type { FilteredTree } from \"./FilteredTree.js\";\nimport type { ModelsTreeIdsCache } from \"./ModelsTreeIdsCache.js\";\nimport type { IVisibilityChangeEventListener } from \"./VisibilityChangeEventListener.js\";\n\n/** @beta */\ninterface GetCategoryVisibilityStatusProps {\n categoryIds: Id64Arg;\n modelId: Id64String;\n}\n\n/** @beta */\ninterface ChangeCategoryVisibilityStateProps extends GetCategoryVisibilityStatusProps {\n on: boolean;\n}\n\n/** @beta */\ninterface GetGeometricElementVisibilityStatusProps {\n elementId: Id64String;\n modelId: Id64String;\n categoryId: Id64String;\n}\n\n/** @beta */\ninterface ChangeGeometricElementsDisplayStateProps {\n elementIds: Id64Set;\n modelId: Id64String;\n categoryId: Id64String;\n on: boolean;\n}\n\n/** @beta */\ninterface ChangeModelVisibilityStateProps {\n ids: Id64Arg;\n on: boolean;\n}\n\n/** @beta */\ninterface GetFilteredNodeVisibilityProps {\n node: HierarchyNode & { key: ClassGroupingNodeKey | InstancesNodeKey };\n}\n\n/** @beta */\ninterface ChangeFilteredNodeVisibilityProps extends GetFilteredNodeVisibilityProps {\n on: boolean;\n}\n\n/**\n * Functionality of Models tree visibility handler that can be overridden.\n * Each callback is provided original implementation and reference to a `HierarchyVisibilityHandler`.\n * @beta\n */\nexport interface ModelsTreeVisibilityHandlerOverrides {\n getSubjectNodeVisibility?: HierarchyVisibilityHandlerOverridableMethod<(props: { ids: Id64Array }) => Promise<VisibilityStatus>>;\n getModelDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: { ids: Id64Arg }) => Promise<VisibilityStatus>>;\n getCategoryDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: GetCategoryVisibilityStatusProps) => Promise<VisibilityStatus>>;\n getElementGroupingNodeDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: { node: GroupingHierarchyNode }) => Promise<VisibilityStatus>>;\n getElementDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: GetGeometricElementVisibilityStatusProps) => Promise<VisibilityStatus>>;\n\n changeSubjectNodeState?: HierarchyVisibilityHandlerOverridableMethod<(props: { ids: Id64Array; on: boolean }) => Promise<void>>;\n changeModelState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeModelVisibilityStateProps) => Promise<void>>;\n changeCategoryState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeCategoryVisibilityStateProps) => Promise<void>>;\n changeElementGroupingNodeState?: HierarchyVisibilityHandlerOverridableMethod<(props: { node: GroupingHierarchyNode; on: boolean }) => Promise<void>>;\n changeElementsState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeGeometricElementsDisplayStateProps) => Promise<void>>;\n}\n\n/**\n * Props for `createModelsTreeVisibilityHandler`.\n * @internal\n */\nexport interface ModelsTreeVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: ModelsTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector;\n overrides?: ModelsTreeVisibilityHandlerOverrides;\n filteredPaths?: HierarchyFilteringPath[];\n componentId?: GuidString;\n}\n\n/**\n * Creates an instance if `ModelsTreeVisibilityHandler`.\n * @internal\n */\nexport function createModelsTreeVisibilityHandler(props: ModelsTreeVisibilityHandlerProps): HierarchyVisibilityHandler & Disposable {\n return new ModelsTreeVisibilityHandlerImpl(props);\n}\n\nclass ModelsTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler {\n readonly #eventListener: IVisibilityChangeEventListener;\n readonly #alwaysAndNeverDrawnElements: AlwaysAndNeverDrawnElementInfo;\n readonly #idsCache: ModelsTreeIdsCache;\n #filteredTree: Promise<FilteredTree> | undefined;\n #elementChangeQueue = new Subject<Observable<void>>();\n #subscriptions: Subscription[] = [];\n #changeRequest = new Subject<{ key: HierarchyNodeKey; depth: number }>();\n readonly #props: ModelsTreeVisibilityHandlerProps;\n\n constructor(props: ModelsTreeVisibilityHandlerProps) {\n this.#props = props;\n this.#eventListener = createVisibilityChangeEventListener(this.#props.viewport);\n this.#alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo(this.#props.viewport, this.#props.componentId);\n this.#idsCache = this.#props.idsCache;\n this.#filteredTree = this.#props.filteredPaths ? createFilteredTree(this.#props.imodelAccess, this.#props.filteredPaths) : undefined;\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 (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonFilteredTargets && !node.filtering?.hasFilterTargetAncestor) {\n return this.getFilteredNodeVisibility({ node });\n }\n return this.getClassGroupingNodeDisplayStatus(node);\n }\n\n assert(HierarchyNode.isInstancesNode(node));\n\n // Only call getFilteredNodeVisibility when node is not a filter target, is not a child of filter target and has filtered children.\n // Otherwise, it can be handled normally.\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget && !node.filtering.hasFilterTargetAncestor) {\n return this.getFilteredNodeVisibility({ node });\n }\n\n if (ModelsTreeNode.isSubjectNode(node)) {\n // note: subject nodes may be merged to represent multiple subject instances\n return this.getSubjectNodeVisibilityStatus({ subjectIds: node.key.instanceKeys.map((key) => key.id) });\n }\n\n if (ModelsTreeNode.isModelNode(node)) {\n return this.getModelVisibilityStatus({ modelIds: node.key.instanceKeys.map(({ id }) => id) });\n }\n\n const modelId = ModelsTreeNode.getModelId(node);\n assert(modelId !== undefined);\n\n if (ModelsTreeNode.isCategoryNode(node)) {\n return this.getCategoryDisplayStatus({\n categoryIds: node.key.instanceKeys.map(({ id }) => id),\n modelId,\n });\n }\n\n const categoryId = ModelsTreeNode.getCategoryId(node);\n const rootCategoryIds = getRootCategoryIds({ parentKeys: node.parentKeys, modelId });\n assert(rootCategoryIds !== undefined && categoryId !== undefined);\n return this.getElementDisplayStatus({\n elementIds: node.key.instanceKeys.map(({ id }) => id),\n parentKeys: node.parentKeys,\n rootCategoryIds,\n modelId,\n categoryId,\n totalChildrenCount: node.extendedData?.childrenCount ?? 0,\n });\n }\n\n private getFilteredNodeVisibility(props: GetFilteredNodeVisibilityProps) {\n assert(this.#filteredTree !== undefined);\n return from(this.#filteredTree).pipe(\n map((filteredTree) => filteredTree.getVisibilityChangeTargets(props.node)),\n mergeMap(({ subjects, models, categories, elements }) => {\n const observables = new Array<Observable<VisibilityStatus>>();\n if (subjects?.size) {\n observables.push(this.getSubjectNodeVisibilityStatus({ subjectIds: [...subjects], ignoreTooltip: true }));\n }\n\n if (models?.size) {\n observables.push(this.getModelVisibilityStatus({ modelIds: models, ignoreTooltip: true }));\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({ modelId, categoryIds: categoryId, ignoreTooltip: true });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n const filterTargetElements = new Array<Id64String>();\n elements.forEach((elementsMap) =>\n elementsMap.forEach(({ isFilterTarget }, elementId) => {\n if (isFilterTarget) {\n filterTargetElements.push(elementId);\n }\n }),\n );\n let childrenCountMapObs: Observable<Map<Id64String, number>>;\n if (HierarchyNode.isClassGroupingNode(props.node)) {\n const groupingNodesFilterTargets: Map<Id64String, { childrenCount: number }> | undefined = props.node.extendedData?.filterTargets;\n const nestedFilterTargetElements = filterTargetElements.filter((filterTarget) => !groupingNodesFilterTargets?.has(filterTarget));\n // Only need to request children count for indirect children filter targets.\n // Direct children filter targets already have children count stored in grouping nodes extended data.\n childrenCountMapObs = this.#idsCache.getAllChildrenCount({ elementIds: nestedFilterTargetElements });\n } else {\n childrenCountMapObs = this.#idsCache.getAllChildrenCount({ elementIds: filterTargetElements });\n }\n observables.push(\n childrenCountMapObs.pipe(\n // Get children count for all filter target elements.\n map((elementCountMap) => {\n if (!HierarchyNode.isClassGroupingNode(props.node) || !props.node.extendedData?.filterTargets) {\n return elementCountMap;\n }\n // Need to add children count (stored in grouping nodes' extended data) of direct children filter targets.\n const groupingNodesFilterTargets: Map<Id64String, { childrenCount: number }> = props.node.extendedData.filterTargets;\n groupingNodesFilterTargets.forEach((value, key) => elementCountMap.set(key, value.childrenCount));\n return elementCountMap;\n }),\n mergeMap((elementCountMap) =>\n from(elements).pipe(\n releaseMainThreadOnItemsCount(50),\n mergeMap(([categoryKey, elementsMap]) => {\n const { modelId, categoryId } = parseCategoryKey(categoryKey);\n let totalChildrenCount = 0;\n elementsMap.forEach((_, elementId) => {\n const childCount = elementCountMap.get(elementId);\n if (childCount) {\n totalChildrenCount += childCount;\n }\n });\n const parentElementIdsPath = getParentElementsIdsPath({ parentKeys: props.node.parentKeys, modelId });\n const rootCategoryIds = getRootCategoryIds({ parentKeys: props.node.parentKeys, modelId });\n return this.getElementsDisplayStatus({\n elementIds: [...elementsMap.keys()],\n rootCategoryIds: rootCategoryIds ?? categoryId,\n parentElementIdsPath,\n modelId,\n categoryId,\n childrenCount: totalChildrenCount,\n });\n }),\n ),\n ),\n ),\n );\n }\n\n return merge(...observables);\n }),\n mergeVisibilityStatuses(),\n );\n }\n\n private getSubjectNodeVisibilityStatus({ subjectIds, ignoreTooltip }: { subjectIds: Id64Array; ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this.#props.viewport.view.isSpatialView()) {\n return of(createVisibilityStatus(\"disabled\", getTooltipOptions(\"modelsTree.subject.nonSpatialView\", ignoreTooltip)));\n }\n\n return this.#idsCache.getSubjectModelIds(subjectIds).pipe(\n mergeMap((modelIds) => this.getModelVisibilityStatus({ modelIds, ignoreTooltip: true })),\n mergeVisibilityStatuses(\n {\n visible: \"modelsTree.subject.allModelsVisible\",\n hidden: \"modelsTree.subject.allModelsHidden\",\n partial: \"modelsTree.subject.someModelsHidden\",\n },\n ignoreTooltip,\n ),\n );\n });\n return createVisibilityHandlerResult(this, { ids: subjectIds }, result, this.#props.overrides?.getSubjectNodeVisibility);\n }\n\n private getModelVisibilityStatus({ modelIds, ignoreTooltip }: { modelIds: Id64Arg; ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n const viewport = this.#props.viewport;\n if (!viewport.view.isSpatialView()) {\n return of(createVisibilityStatus(\"disabled\", getTooltipOptions(\"modelsTree.model.nonSpatialView\", ignoreTooltip)));\n }\n\n return from(Id64.iterable(modelIds)).pipe(\n distinct(),\n mergeMap((modelId) => {\n if (!viewport.view.viewsModel(modelId)) {\n return this.#idsCache.getModelCategories(modelId).pipe(\n mergeMap((categoryIds) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n this.getSubModeledElementsVisibilityStatus({\n ignoreTooltips: ignoreTooltip,\n haveSubModel: \"yes\",\n tooltips: { visible: undefined, hidden: \"modelsTree.model.hiddenThroughModelSelector\", partial: \"modelsTree.model.someSubModelsVisible\" },\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n }),\n );\n }\n return this.#idsCache.getModelCategories(modelId).pipe(\n mergeMap((categoryIds) => {\n return categoryIds.length === 0\n ? of(createVisibilityStatus(\"visible\"))\n : this.getCategoryDisplayStatus({ modelId, categoryIds, ignoreTooltip: true });\n }),\n mergeVisibilityStatuses({\n visible: \"modelsTree.model.allCategoriesVisible\",\n partial: \"modelsTree.model.someCategoriesHidden\",\n hidden: \"modelsTree.model.allCategoriesHidden\",\n }),\n );\n }),\n mergeVisibilityStatuses(),\n );\n });\n return createVisibilityHandlerResult(this, { ids: modelIds }, result, this.#props.overrides?.getModelDisplayStatus);\n }\n\n private getDefaultCategoryVisibilityStatus({\n modelId,\n categoryIds,\n ignoreTooltip,\n }: {\n categoryIds: Id64Arg;\n modelId: Id64String;\n ignoreTooltip?: boolean;\n }): VisibilityStatus {\n const viewport = this.#props.viewport;\n\n if (!viewport.view.viewsModel(modelId) || Id64.sizeOf(categoryIds) === 0) {\n return createVisibilityStatus(\"hidden\", getTooltipOptions(\"modelsTree.category.hiddenThroughModel\", ignoreTooltip));\n }\n\n let visibility: \"visible\" | \"hidden\" | \"unknown\" = \"unknown\";\n for (const categoryId of Id64.iterable(categoryIds)) {\n const override = this.#props.viewport.perModelCategoryVisibility.getOverride(modelId, categoryId);\n if (override === PerModelCategoryVisibility.Override.Show) {\n if (visibility === \"hidden\") {\n return createVisibilityStatus(\"partial\");\n }\n visibility = \"visible\";\n continue;\n }\n if (override === PerModelCategoryVisibility.Override.Hide) {\n if (visibility === \"visible\") {\n return createVisibilityStatus(\"partial\");\n }\n visibility = \"hidden\";\n continue;\n }\n const isVisible = viewport.view.viewsCategory(categoryId);\n if (isVisible && visibility === \"hidden\") {\n return createVisibilityStatus(\"partial\");\n }\n if (!isVisible && visibility === \"visible\") {\n return createVisibilityStatus(\"partial\");\n }\n visibility = isVisible ? \"visible\" : \"hidden\";\n }\n assert(visibility !== \"unknown\");\n\n return createVisibilityStatus(visibility);\n }\n\n private getCategoryDisplayStatus({ ignoreTooltip, ...props }: GetCategoryVisibilityStatusProps & { ignoreTooltip?: boolean }): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this.#props.viewport.view.viewsModel(props.modelId)) {\n return this.#idsCache.getCategoriesModeledElements(props.modelId, props.categoryIds).pipe(\n this.getSubModeledElementsVisibilityStatus({\n ignoreTooltips: ignoreTooltip,\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n tooltips: {\n visible: undefined,\n hidden: \"modelsTree.category.hiddenThroughModel\",\n partial: \"modelsTree.category.someElementsOrSubModelsHidden\",\n },\n haveSubModel: \"yes\",\n }),\n );\n }\n\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n categoryProps: { categoryIds: props.categoryIds, modelId: props.modelId },\n tooltips: {\n allElementsInAlwaysDrawnList: \"modelsTree.category.allElementsVisible\",\n allElementsInNeverDrawnList: \"modelsTree.category.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"modelsTree.category.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"modelsTree.category.allElementsHidden\",\n },\n defaultStatus: (categoryId) =>\n categoryId\n ? this.getDefaultCategoryVisibilityStatus({ modelId: props.modelId, categoryIds: categoryId })\n : this.getDefaultCategoryVisibilityStatus({ modelId: props.modelId, categoryIds: props.categoryIds }),\n ignoreTooltip,\n }).pipe(\n mergeMap((visibilityStatusAlwaysAndNeverDraw) => {\n return this.#idsCache.getCategoriesModeledElements(props.modelId, props.categoryIds).pipe(\n this.getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: \"modelsTree.category.allElementsAndSubModelsHidden\",\n partial: \"modelsTree.category.someElementsOrSubModelsHidden\",\n },\n haveSubModel: \"yes\",\n parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,\n ignoreTooltips: ignoreTooltip,\n }),\n );\n }),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this.#props.overrides?.getCategoryDisplayStatus);\n }\n\n private getClassGroupingNodeDisplayStatus(node: GroupingHierarchyNode): Observable<VisibilityStatus> {\n const { elementIds, modelId, categoryId, childrenCount } = this.getGroupingNodeInfo(node);\n const result = defer(() => {\n const rootCategoryIds = getRootCategoryIds({ parentKeys: node.parentKeys, modelId });\n assert(rootCategoryIds !== undefined);\n return this.getElementsDisplayStatus({\n elementIds,\n modelId,\n categoryId,\n rootCategoryIds,\n parentElementIdsPath: getParentElementsIdsPath({ parentKeys: node.parentKeys, modelId }),\n childrenCount: childrenCount ?? 0,\n });\n });\n return createVisibilityHandlerResult(this, { node }, result, this.#props.overrides?.getElementGroupingNodeDisplayStatus);\n }\n\n private getElementDisplayStatus({\n parentKeys,\n totalChildrenCount,\n elementIds,\n modelId,\n rootCategoryIds,\n categoryId,\n }: {\n elementIds: Id64Array;\n modelId: Id64String;\n categoryId: Id64String;\n rootCategoryIds: Id64Arg;\n parentKeys: HierarchyNodeKey[];\n totalChildrenCount: number;\n }): Observable<VisibilityStatus> {\n const result = this.getElementsDisplayStatus({\n rootCategoryIds,\n elementIds,\n modelId,\n categoryId,\n parentElementIdsPath: getParentElementsIdsPath({ parentKeys, modelId }),\n childrenCount: totalChildrenCount,\n });\n return createVisibilityHandlerResult(this, { elementId: elementIds[0], modelId, categoryId }, result, this.#props.overrides?.getElementDisplayStatus);\n }\n\n private getElementsDisplayStatus(props: {\n elementIds: Id64Array | Id64Set;\n modelId: Id64String;\n categoryId: Id64String;\n parentElementIdsPath: Array<Id64Arg>;\n rootCategoryIds: Id64Arg;\n childrenCount: number;\n }): Observable<VisibilityStatus> {\n return defer(() => {\n const { modelId, categoryId, elementIds, parentElementIdsPath, childrenCount, rootCategoryIds } = props;\n\n if (!this.#props.viewport.view.viewsModel(modelId)) {\n return of(elementIds).pipe(\n this.getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: undefined,\n partial: \"modelsTree.groupingNode.someElementsOrSubModelsHidden\",\n },\n parentNodeVisibilityStatus: createVisibilityStatus(\"hidden\"),\n haveSubModel: \"unknown\",\n }),\n );\n }\n\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n elements: elementIds,\n parentElementIdsPath,\n modelIds: modelId,\n rootCategoryIds,\n childrenCount,\n defaultStatus: () => {\n const status = this.getDefaultCategoryVisibilityStatus({ categoryIds: categoryId, modelId, ignoreTooltip: true });\n return createVisibilityStatus(status.state, getTooltipOptions(`modelsTree.groupingNode.${status.state}ThroughCategory`));\n },\n tooltips: {\n allElementsInAlwaysDrawnList: \"modelsTree.groupingNode.allElementsVisible\",\n allElementsInNeverDrawnList: \"modelsTree.groupingNode.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"modelsTree.groupingNode.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"modelsTree.groupingNode.allElementsHidden\",\n },\n }).pipe(\n mergeMap((visibilityStatusAlwaysAndNeverDraw) => {\n return of(elementIds).pipe(\n this.getSubModeledElementsVisibilityStatus({\n tooltips: {\n visible: undefined,\n hidden: \"modelsTree.groupingNode.allElementsAndSubModelsHidden\",\n partial: \"modelsTree.groupingNode.someElementsOrSubModelsHidden\",\n },\n parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,\n haveSubModel: \"unknown\",\n }),\n );\n }),\n );\n });\n }\n /** Changes visibility of the items represented by the tree node. */\n private changeVisibilityObs(node: HierarchyNode, on: boolean): Observable<void> {\n const changeObs = defer(() => {\n if (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonFilteredTargets && !node.filtering?.hasFilterTargetAncestor) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n return this.changeElementGroupingNodeState(node, on);\n }\n\n if (!HierarchyNode.isInstancesNode(node)) {\n return EMPTY;\n }\n\n // Only call changeFilteredNodeVisibility when node is not a filter target, is not a child of filter target and has filtered children.\n // Otherwise, it can be handled normally.\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget && !node.filtering.hasFilterTargetAncestor) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n\n if (ModelsTreeNode.isSubjectNode(node)) {\n return this.changeSubjectNodeState(\n node.key.instanceKeys.map((key) => key.id),\n on,\n );\n }\n\n if (ModelsTreeNode.isModelNode(node)) {\n return this.changeModelState({ ids: node.key.instanceKeys.map(({ id }) => id), on });\n }\n\n const modelId = ModelsTreeNode.getModelId(node);\n if (!modelId) {\n return EMPTY;\n }\n\n if (ModelsTreeNode.isCategoryNode(node)) {\n return this.changeCategoryState({\n categoryIds: node.key.instanceKeys.map(({ id }) => id),\n modelId,\n on,\n });\n }\n\n const categoryId = ModelsTreeNode.getCategoryId(node);\n if (!categoryId) {\n return EMPTY;\n }\n const elementIds = new Set(node.key.instanceKeys.map(({ id }) => id));\n return this.#idsCache.getChildrenTree({ elementIds }).pipe(\n map((childrenTree): Id64Set => {\n // Children tree contains provided elementIds, they are at the root of this tree.\n // We want to skip them and only get ids of children.\n return getIdsFromChildrenTree({ tree: childrenTree, predicate: ({ depth }) => depth > 0 });\n }),\n mergeMap((children) =>\n this.changeElementsState({\n elementIds,\n modelId,\n children: children.size > 0 ? children : undefined,\n categoryId,\n on,\n }),\n ),\n );\n });\n if (this.#props.viewport.isAlwaysDrawnExclusive) {\n return concat(this.removeAlwaysDrawnExclusive(), changeObs);\n }\n return changeObs;\n }\n\n private changeFilteredNodeVisibility({ on, ...props }: ChangeFilteredNodeVisibilityProps) {\n assert(this.#filteredTree !== undefined);\n return from(this.#filteredTree).pipe(\n map((filteredTree) => filteredTree.getVisibilityChangeTargets(props.node)),\n mergeMap(({ subjects, categories, elements, models }) => {\n const observables = new Array<Observable<void>>();\n if (subjects?.size) {\n observables.push(this.changeSubjectNodeState([...subjects], 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, on });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n const filterTargetElements = new Array<Id64String>();\n const elementsSet = new Set<Id64String>();\n elements.forEach((elementsMap) =>\n elementsMap.forEach(({ isFilterTarget }, elementId) => {\n elementsSet.add(elementId);\n if (isFilterTarget) {\n filterTargetElements.push(elementId);\n }\n }),\n );\n observables.push(\n this.#idsCache.getChildrenTree({ elementIds: filterTargetElements }).pipe(\n map((childrenTree) => getIdsFromChildrenTree({ tree: childrenTree })),\n map((childrenIds) => setDifference(childrenIds, elementsSet)),\n mergeMap((childElementIds) =>\n from(elements).pipe(\n mergeMap(([categoryKey, elementsMap]) => {\n const { modelId, categoryId } = parseCategoryKey(categoryKey);\n return this.changeElementsState({\n modelId,\n categoryId,\n elementIds: new Set([...elementsMap.keys()]),\n on,\n children: childElementIds.size > 0 ? childElementIds : undefined,\n });\n }),\n ),\n ),\n ),\n );\n }\n\n return merge(...observables);\n }),\n );\n }\n\n private removeAlwaysDrawnExclusive(): Observable<void> {\n return this.#idsCache.getAllCategories().pipe(\n map((categoryIds) => {\n this.#props.viewport.changeCategoryDisplay(categoryIds, false, false, true);\n this.#props.viewport.clearNeverDrawn();\n this.#props.viewport.perModelCategoryVisibility.clearOverrides();\n this.#props.viewport.setAlwaysDrawn(this.#props.viewport.alwaysDrawn ?? new Set());\n }),\n );\n }\n\n private changeSubjectNodeState(ids: Id64Array, on: boolean): Observable<void> {\n const result = defer(() => {\n if (!this.#props.viewport.view.isSpatialView()) {\n return EMPTY;\n }\n\n return this.#idsCache.getSubjectModelIds(ids).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));\n });\n return createVisibilityHandlerResult(this, { ids, on }, result, this.#props.overrides?.changeSubjectNodeState);\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 if (!viewport.view.isSpatialView()) {\n return EMPTY;\n }\n\n const idsObs = from(Id64.iterable(ids));\n if (!on) {\n viewport.changeModelDisplay(ids, false);\n return idsObs.pipe(\n mergeMap((modelId) => forkJoin({ categoryIds: this.#idsCache.getModelCategories(modelId), modelId: of(modelId) })),\n mergeMap(({ modelId, categoryIds }) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on })),\n );\n }\n\n return concat(\n defer(() => {\n viewport.perModelCategoryVisibility.clearOverrides(ids);\n return from(viewport.addViewedModels(ids));\n }),\n idsObs.pipe(\n mergeMap((modelId) => {\n return this.#idsCache.getModelCategories(modelId).pipe(mergeMap((categoryIds) => this.changeCategoryState({ categoryIds, modelId, on: true })));\n }),\n ),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this.#props.overrides?.changeModelState);\n }\n\n private showModelWithoutAnyCategoriesOrElements(modelId: Id64String): Observable<void> {\n const viewport = this.#props.viewport;\n return forkJoin({\n categories: this.#idsCache.getModelCategories(modelId),\n alwaysDrawnElements: this.getAlwaysOrNeverDrawnElements({ modelIds: modelId, setType: \"always\" }),\n }).pipe(\n mergeMap(({ categories, alwaysDrawnElements }) => {\n const alwaysDrawn = this.#props.viewport.alwaysDrawn;\n if (alwaysDrawn && alwaysDrawnElements) {\n viewport.setAlwaysDrawn(setDifference(alwaysDrawn, alwaysDrawnElements));\n }\n\n return concat(\n from(Id64.iterable(categories)).pipe(\n releaseMainThreadOnItemsCount(300),\n map((categoryId) => this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, false)),\n ),\n defer(async () => viewport.addViewedModels(modelId)),\n );\n }),\n );\n }\n\n private changeCategoryStateInViewportAccordingToModelVisibility(modelId: string, categoryId: string, on: 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 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, true, true);\n }\n }\n\n private changeCategoryState(props: ChangeCategoryVisibilityStateProps): Observable<void> {\n const result = defer(() => {\n const viewport = this.#props.viewport;\n const { modelId, categoryIds, on } = props;\n return concat(\n props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n from(Id64.iterable(categoryIds)).pipe(\n releaseMainThreadOnItemsCount(300),\n map((categoryId) => this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, on)),\n ),\n this.clearAlwaysAndNeverDrawnElements(props),\n this.#idsCache\n .getCategoriesModeledElements(modelId, categoryIds)\n .pipe(mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on }))),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this.#props.overrides?.changeCategoryState);\n }\n\n private doChangeElementsState(\n props: ChangeGeometricElementsDisplayStateProps & {\n children: Id64Arg | undefined;\n },\n ): Observable<void | undefined> {\n return defer(() => {\n const { modelId, categoryId, elementIds, on, children } = 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.getDefaultCategoryVisibilityStatus({ categoryIds: categoryId, modelId, ignoreTooltip: true });\n const isCategoryVisible = categoryVisibility.state === \"visible\";\n // Make sure to add all children to always/never drawn list.\n const isDisplayedByDefault =\n // When category is visible and elements need to be turned off, or when category is hidden and elements need to be turned on,\n // We can set isDisplayedByDefault to isCategoryVisible. This allows to not check if each element is in the elementIds list or not.\n isCategoryVisible === !on\n ? () => isCategoryVisible\n : (elementId: Id64String) => {\n if (elementIds.has(elementId)) {\n return isCategoryVisible;\n }\n return !on;\n };\n const elementsToChange = children ? [...elementIds, ...(typeof children === \"string\" ? [children] : children)] : elementIds;\n return this.queueElementsVisibilityChange(elementsToChange, on, isDisplayedByDefault);\n }),\n from(elementIds).pipe(\n mergeMap((elementId) =>\n forkJoin({\n elementId: of(elementId),\n isSubModel: this.#idsCache.hasSubModel(elementId),\n }),\n ),\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 { modelId, categoryId, elementIds } = this.getGroupingNodeInfo(node);\n const result = this.#idsCache.getChildrenTree({ elementIds }).pipe(\n map((childrenTree) => getIdsFromChildrenTree({ tree: childrenTree, predicate: ({ depth }) => depth > 0 })),\n mergeMap((children) =>\n this.doChangeElementsState({\n modelId,\n categoryId,\n elementIds,\n children: children.size > 0 ? children : undefined,\n on,\n }),\n ),\n );\n return createVisibilityHandlerResult(this, { node, on }, result, this.#props.overrides?.changeElementGroupingNodeState);\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 & { children: Id64Arg | undefined }): Observable<void> {\n const result = this.doChangeElementsState(props);\n return createVisibilityHandlerResult(this, props, result, this.#props.overrides?.changeElementsState);\n }\n\n private queueElementsVisibilityChange(elementIds: Id64Arg, on: boolean, visibleByDefault: (elementId: Id64String) => 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(Id64.iterable(elementIds)).pipe(\n // check if visibility change is not finished (cancelled) due to change overall change request being cancelled\n takeUntil(changeFinished),\n this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault: visibleByDefault }),\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 changeElementStateNoChildrenOperator(props: {\n on: boolean;\n isDisplayedByDefault: (elementId: Id64String) => boolean;\n }): OperatorFunction<string, void> {\n return (elementIds: Observable<Id64String>) => {\n const { on, isDisplayedByDefault } = props;\n const isAlwaysDrawnExclusive = this.#props.viewport.isAlwaysDrawnExclusive;\n return elementIds.pipe(\n releaseMainThreadOnItemsCount(500),\n reduce<string, { changedNeverDrawn: boolean; changedAlwaysDrawn: boolean; neverDrawn: Id64Set | undefined; alwaysDrawn: Id64Set | undefined }>(\n (acc, elementId) => {\n if (acc.alwaysDrawn === undefined || acc.neverDrawn === undefined) {\n acc.alwaysDrawn = new Set(this.#props.viewport.alwaysDrawn || []);\n acc.neverDrawn = new Set(this.#props.viewport.neverDrawn || []);\n }\n if (on) {\n const wasRemoved = acc.neverDrawn.delete(elementId);\n acc.changedNeverDrawn ||= wasRemoved;\n // If exclusive mode is enabled, we must add the element to the always drawn list.\n if ((!isDisplayedByDefault(elementId) || isAlwaysDrawnExclusive) && !acc.alwaysDrawn.has(elementId)) {\n acc.alwaysDrawn.add(elementId);\n acc.changedAlwaysDrawn = true;\n }\n } else {\n const wasRemoved = acc.alwaysDrawn.delete(elementId);\n acc.changedAlwaysDrawn ||= wasRemoved;\n // If exclusive mode is not enabled, we have to add the element to the never drawn list.\n if (isDisplayedByDefault(elementId) && !isAlwaysDrawnExclusive && !acc.neverDrawn.has(elementId)) {\n acc.neverDrawn.add(elementId);\n acc.changedNeverDrawn = true;\n }\n }\n return acc;\n },\n {\n changedNeverDrawn: false,\n changedAlwaysDrawn: false,\n neverDrawn: undefined,\n alwaysDrawn: undefined,\n },\n ),\n map((state) => {\n state.changedNeverDrawn && state.neverDrawn && this.#props.viewport.setNeverDrawn(state.neverDrawn);\n state.changedAlwaysDrawn && state.alwaysDrawn && this.#props.viewport.setAlwaysDrawn(state.alwaysDrawn, this.#props.viewport.isAlwaysDrawnExclusive);\n }),\n );\n };\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElementsImpl(\n props: {\n alwaysDrawn: Id64Arg | undefined;\n neverDrawn: Id64Arg | undefined;\n totalCount: number;\n } & GetVisibilityFromAlwaysAndNeverDrawnElementsProps & { ignoreTooltip?: boolean },\n ): VisibilityStatus {\n const { alwaysDrawn, neverDrawn, totalCount, ignoreTooltip } = props;\n if (totalCount === 0) {\n return props.defaultStatus();\n }\n const neverDrawnSize = neverDrawn ? Id64.sizeOf(neverDrawn) : undefined;\n const alwaysDrawnSize = alwaysDrawn ? Id64.sizeOf(alwaysDrawn) : undefined;\n if (neverDrawnSize === totalCount) {\n return createVisibilityStatus(\"hidden\", getTooltipOptions(props.tooltips.allElementsInNeverDrawnList, ignoreTooltip));\n }\n\n if (alwaysDrawnSize === totalCount) {\n return createVisibilityStatus(\"visible\", getTooltipOptions(props.tooltips.allElementsInAlwaysDrawnList, ignoreTooltip));\n }\n\n const viewport = this.#props.viewport;\n if (viewport.isAlwaysDrawnExclusive && viewport.alwaysDrawn?.size) {\n return alwaysDrawnSize\n ? createVisibilityStatus(\"partial\", getTooltipOptions(props.tooltips.elementsInBothAlwaysAndNeverDrawn, ignoreTooltip))\n : createVisibilityStatus(\"hidden\", getTooltipOptions(props.tooltips.noElementsInExclusiveAlwaysDrawnList, ignoreTooltip));\n }\n\n const status = props.defaultStatus();\n if ((status.state === \"visible\" && neverDrawnSize) || (status.state === \"hidden\" && alwaysDrawnSize)) {\n return createVisibilityStatus(\"partial\", getTooltipOptions(undefined, ignoreTooltip));\n }\n return status;\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElements({\n ignoreTooltip,\n ...props\n }: GetVisibilityFromAlwaysAndNeverDrawnElementsProps &\n (\n | { elements: Id64Set | Id64Array; parentElementIdsPath: Array<Id64Arg>; childrenCount: number; modelIds: Id64Arg; rootCategoryIds: Id64Arg }\n | { categoryProps: { categoryIds: Id64Arg; modelId: Id64String } }\n ) & {\n ignoreTooltip?: boolean;\n }): 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 const parentElementIdsPath = [...props.parentElementIdsPath, props.elements];\n return forkJoin({\n childAlwaysDrawn: this.getAlwaysOrNeverDrawnElements({\n modelIds: props.modelIds,\n categoryIds: props.rootCategoryIds,\n parentElementIdsPath,\n setType: \"always\",\n }),\n childNeverDrawn: this.getAlwaysOrNeverDrawnElements({\n modelIds: props.modelIds,\n categoryIds: props.rootCategoryIds,\n parentElementIdsPath,\n setType: \"never\",\n }),\n }).pipe(\n map(({ childAlwaysDrawn, childNeverDrawn }) => {\n const alwaysDrawn = new Set([...childAlwaysDrawn, ...(viewport.alwaysDrawn?.size ? setIntersection(props.elements, viewport.alwaysDrawn) : [])]);\n const neverDrawn = new Set([...childNeverDrawn, ...(viewport.neverDrawn?.size ? setIntersection(props.elements, viewport.neverDrawn) : [])]);\n return this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n alwaysDrawn: alwaysDrawn.size > 0 ? alwaysDrawn : undefined,\n neverDrawn: neverDrawn.size > 0 ? neverDrawn : undefined,\n totalCount: props.childrenCount + Id64.sizeOf(props.elements),\n ignoreTooltip,\n });\n }),\n );\n }\n const { modelId, categoryIds } = props.categoryProps;\n return from(Id64.iterable(categoryIds)).pipe(\n releaseMainThreadOnItemsCount(100),\n mergeMap((categoryId) => {\n return forkJoin({\n categoryId: of(categoryId),\n totalCount: this.#idsCache.getCategoryElementsCount(modelId, categoryId),\n alwaysDrawn: this.getAlwaysOrNeverDrawnElements({ modelIds: modelId, categoryIds: categoryId, setType: \"always\" }),\n neverDrawn: this.getAlwaysOrNeverDrawnElements({ modelIds: modelId, categoryIds: categoryId, setType: \"never\" }),\n });\n }),\n // There is a known bug:\n // Categories that don't have root elements will make visibility result incorrect\n // E.g.:\n // - CategoryA\n // - ElementA (CategoryA is visible)\n // - ChildElementB (CategoryB is hidden) ChildElementB is in always drawn list\n // Result will be \"partial\" because CategoryB will return hidden visibility, even though all elements are visible\n // TODO fix with: https://github.com/iTwin/viewer-components-react/issues/1100\n mergeMap((state) => {\n if (this.#props.viewport.isAlwaysDrawnExclusive && state.totalCount === 0) {\n return EMPTY;\n }\n return of(\n this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n ...state,\n defaultStatus: () => props.defaultStatus(state.categoryId),\n ignoreTooltip,\n }),\n );\n }),\n mergeVisibilityStatuses(),\n );\n }\n\n private getAlwaysOrNeverDrawnElements(props: GetElementsTreeProps): Observable<Id64Set> {\n if (!this.#filteredTree) {\n return this.#alwaysAndNeverDrawnElements\n .getElementsTree(props)\n .pipe(map((childrenTree) => getIdsFromChildrenTree({ tree: childrenTree, predicate: ({ treeEntry }) => treeEntry.isInAlwaysOrNeverDrawnSet })));\n }\n // When filtered tree is present, children tree retrieved from alwaysAndNeverDrawnElements may include elements that are not present in filtered tree.\n // Need to filter out such elements.\n return forkJoin({\n filteredTree: from(this.#filteredTree),\n childrenTree: this.#alwaysAndNeverDrawnElements.getElementsTree(props),\n }).pipe(\n map(({ filteredTree, childrenTree }) => {\n const parentIdsPath = [props.modelIds];\n if (\"categoryIds\" in props) {\n parentIdsPath.push(props.categoryIds);\n if (\"parentElementIdsPath\" in props) {\n props.parentElementIdsPath.forEach((parentElementIds) => parentIdsPath.push(parentElementIds));\n }\n }\n // Get all ids that exist in filtered tree.\n const elements = filteredTree.getElementsFromUnfilteredChildrenTree({ parentIdsPath, childrenTree });\n return elements\n ? // Need to filter elements that are in always/never drawn set.\n setIntersection(elements, getIdsFromChildrenTree({ tree: childrenTree, predicate: ({ treeEntry }) => treeEntry.isInAlwaysOrNeverDrawnSet }))\n : new Set();\n }),\n );\n }\n\n private clearAlwaysAndNeverDrawnElements(props: { categoryIds: Id64Arg; modelId: Id64String }) {\n return forkJoin({\n alwaysDrawn: this.getAlwaysOrNeverDrawnElements({ modelIds: props.modelId, categoryIds: props.categoryIds, setType: \"always\" }),\n neverDrawn: this.getAlwaysOrNeverDrawnElements({ modelIds: props.modelId, categoryIds: props.categoryIds, setType: \"never\" }),\n }).pipe(\n map(({ alwaysDrawn, neverDrawn }) => {\n const viewport = this.#props.viewport;\n if (viewport.alwaysDrawn?.size && alwaysDrawn.size) {\n viewport.setAlwaysDrawn(setDifference(viewport.alwaysDrawn, alwaysDrawn));\n }\n if (viewport.neverDrawn?.size && neverDrawn.size) {\n viewport.setNeverDrawn(setDifference(viewport.neverDrawn, neverDrawn));\n }\n }),\n );\n }\n\n private getGroupingNodeInfo(node: GroupingHierarchyNode) {\n const modelId = ModelsTreeNode.getModelId(node);\n const categoryId = ModelsTreeNode.getCategoryId(node);\n assert(!!modelId && !!categoryId);\n\n const elementIds = new Set(node.groupedInstanceKeys.map((key) => key.id));\n const childrenCount: number | undefined = node.extendedData?.childrenCount;\n const isFiltered: boolean = node.extendedData?.isFiltered;\n return { modelId, categoryId, elementIds, childrenCount, isFiltered };\n }\n\n private getSubModeledElementsVisibilityStatus({\n parentNodeVisibilityStatus,\n haveSubModel,\n tooltips,\n ignoreTooltips,\n }: {\n parentNodeVisibilityStatus: VisibilityStatus;\n haveSubModel: \"yes\" | \"unknown\";\n tooltips: { [key in Visibility]: string | undefined };\n ignoreTooltips?: boolean;\n }): OperatorFunction<Id64Arg, VisibilityStatus> {\n return (obs) => {\n return obs.pipe(\n // ensure we're only looking at elements that have a sub-model\n mergeMap((modeledElementIds) => {\n if (haveSubModel === \"yes\") {\n return of(modeledElementIds);\n }\n return from(Id64.iterable(modeledElementIds)).pipe(\n releaseMainThreadOnItemsCount(100),\n mergeMap((elementId) =>\n forkJoin({\n hasSubModel: this.#idsCache.hasSubModel(elementId),\n elementId: of(elementId),\n }),\n ),\n filter(({ hasSubModel }) => hasSubModel),\n map(({ elementId }) => elementId),\n toArray(),\n );\n }),\n // combine visibility status of sub-models with visibility status of parent node\n mergeMap((modeledElementIds) => {\n if (Id64.sizeOf(modeledElementIds) === 0) {\n return of(parentNodeVisibilityStatus);\n }\n return this.getModelVisibilityStatus({ modelIds: typeof modeledElementIds === \"string\" ? [modeledElementIds] : modeledElementIds }).pipe(\n startWith<VisibilityStatus>(parentNodeVisibilityStatus),\n mergeVisibilityStatuses(tooltips, ignoreTooltips),\n );\n }),\n );\n };\n }\n}\n\ninterface GetVisibilityFromAlwaysAndNeverDrawnElementsProps {\n tooltips: {\n allElementsInNeverDrawnList: string;\n allElementsInAlwaysDrawnList: string;\n elementsInBothAlwaysAndNeverDrawn: string;\n noElementsInExclusiveAlwaysDrawnList: string;\n };\n /** Status when always/never lists are empty and exclusive mode is off */\n defaultStatus: (categoryId?: Id64String) => VisibilityStatus;\n}\n\n/**\n * Enables display of all given models. Also enables display of all categories and clears always and\n * never drawn lists in the viewport.\n *\n * @param componentId Optional unique id of the component that consumes this function.\n * It can be any string, as long as it is not shared across different components.\n * @public\n */\nexport async function showAllModels(models: string[], viewport: Viewport, componentId?: GuidString) {\n await viewport.addViewedModels(models);\n viewport.clearNeverDrawn();\n viewport.clearAlwaysDrawn();\n\n const categories = await loadCategoriesFromViewport(viewport, componentId);\n if (categories.length === 0) {\n return;\n }\n const ids = categories.map((category) => category.categoryId);\n await enableCategoryDisplay(viewport, ids, true);\n}\n\n/**\n * Disables display of all given models.\n * @public\n */\nexport async function hideAllModels(models: string[], viewport: Viewport) {\n viewport.changeModelDisplay(models, false);\n}\n\n/**\n * Inverts display of all given models.\n * @public\n */\nexport async function invertAllModels(models: string[], viewport: Viewport) {\n const notViewedModels: string[] = [];\n const viewedModels: string[] = [];\n models.forEach((modelId) => {\n if (viewport.viewsModel(modelId)) {\n viewedModels.push(modelId);\n } else {\n notViewedModels.push(modelId);\n }\n });\n await viewport.addViewedModels(notViewedModels);\n viewport.changeModelDisplay(viewedModels, false);\n}\n\n/**\n * Based on the value of `enable` argument, either enables or disables display of given models.\n * @public\n */\nexport async function toggleModels(models: string[], enable: boolean, viewport: Viewport) {\n if (!models) {\n return;\n }\n if (enable) {\n viewport.changeModelDisplay(models, false);\n } else {\n await viewport.addViewedModels(models);\n }\n}\n\n/**\n * Checks if all given models are displayed in given viewport.\n * @public\n */\nexport function areAllModelsVisible(models: string[], viewport: Viewport) {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n\nfunction getParentElementsIdsPath(props: { parentKeys: HierarchyNodeKey[]; modelId: Id64String }): Array<Id64Arg> {\n const parentElementIdsPath = new Array<Id64Arg>();\n const modelIndex = props.parentKeys.findIndex(\n (parentKey) => HierarchyNodeKey.isInstances(parentKey) && parentKey.instanceKeys.some((instanceKey) => instanceKey.id === props.modelId),\n );\n if (modelIndex === -1) {\n return parentElementIdsPath;\n }\n // Hierarchy is model -> category -> root elements.\n // Root elements index is 2 more than models'.\n const firstParentIndex = modelIndex + 2;\n for (let i = firstParentIndex; i < props.parentKeys.length; ++i) {\n const parentKey = props.parentKeys[i];\n if (!HierarchyNodeKey.isInstances(parentKey)) {\n continue;\n }\n parentElementIdsPath.push(parentKey.instanceKeys.map(({ id }) => id));\n }\n return parentElementIdsPath;\n}\n\nfunction getRootCategoryIds(props: { parentKeys: HierarchyNodeKey[]; modelId: Id64String }): Id64Arg | undefined {\n const modelIndex = props.parentKeys.findIndex(\n (parentKey) => HierarchyNodeKey.isInstances(parentKey) && parentKey.instanceKeys.some((instanceKey) => instanceKey.id === props.modelId),\n );\n if (modelIndex === -1 || modelIndex + 1 === props.parentKeys.length) {\n return undefined;\n }\n const rootCategoryKeys = props.parentKeys[modelIndex + 1];\n if (!HierarchyNodeKey.isInstances(rootCategoryKeys)) {\n return undefined;\n }\n return rootCategoryKeys.instanceKeys.map(({ id }) => id);\n}\n"]}