Skip to content

Commit 2ec22ac

Browse files
committed
Adress coments
1 parent 17ba478 commit 2ec22ac

File tree

2 files changed

+55
-61
lines changed

2 files changed

+55
-61
lines changed

packages/itwin/tree-widget/src/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.ts

Lines changed: 50 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { HierarchyNode, HierarchyNodeKey } from "@itwin/presentation-hierarchies
3232
import { AlwaysAndNeverDrawnElementInfo } from "../../common/internal/AlwaysAndNeverDrawnElementInfo.js";
3333
import { toVoidPromise } from "../../common/internal/Rxjs.js";
3434
import { createVisibilityStatus } from "../../common/internal/Tooltip.js";
35-
import { getClassesByView, releaseMainThreadOnItemsCount, setDifference, setIntersection } from "../../common/internal/Utils.js";
35+
import { getClassesByView, getSetFromId64Arg, releaseMainThreadOnItemsCount, setDifference, setIntersection } from "../../common/internal/Utils.js";
3636
import { createVisibilityChangeEventListener } from "../../common/internal/VisibilityChangeEventListener.js";
3737
import {
3838
changeElementStateNoChildrenOperator,
@@ -295,37 +295,38 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
295295
}
296296

297297
private getModelsVisibilityStatus({ modelIds }: { modelIds: Id64Arg }): Observable<VisibilityStatus> {
298-
return from(Id64.iterable(modelIds)).pipe(
299-
mergeMap((modelId) => {
300-
// For hidden models we only need to check subModels
301-
if (!this._props.viewport.view.viewsModel(modelId)) {
302-
return this.getSubModels({ modelIds: modelId }).pipe(
303-
mergeMap(({ subModels }) => {
304-
if (subModels && Id64.sizeOf(subModels) > 0) {
305-
return this.getModelsVisibilityStatus({ modelIds: subModels }).pipe(
306-
map((subModelsVisibilityStatus) =>
307-
subModelsVisibilityStatus.state !== "hidden" ? createVisibilityStatus("partial") : createVisibilityStatus("hidden"),
308-
),
309-
);
310-
}
311-
return of(createVisibilityStatus("hidden"));
312-
}),
313-
mergeVisibilityStatuses,
314-
);
315-
}
316-
// For visible models we need to check all categories
317-
return this.getCategories({ modelIds: modelId }).pipe(
318-
mergeMap(({ drawingCategories, spatialCategories }) =>
319-
merge(
320-
drawingCategories ? of(drawingCategories).pipe(mergeMap((categoryIds) => this.getCategoriesVisibilityStatus({ modelId, categoryIds }))) : EMPTY,
321-
spatialCategories ? of(spatialCategories).pipe(mergeMap((categoryIds) => this.getCategoriesVisibilityStatus({ modelId, categoryIds }))) : EMPTY,
298+
const result = defer(() => {
299+
return from(Id64.iterable(modelIds)).pipe(
300+
mergeMap((modelId) => {
301+
// For hidden models we only need to check subModels
302+
if (!this._props.viewport.view.viewsModel(modelId)) {
303+
return this.getSubModels({ modelIds: modelId }).pipe(
304+
mergeMap(({ subModels }) => {
305+
if (subModels && Id64.sizeOf(subModels) > 0) {
306+
return this.getModelsVisibilityStatus({ modelIds: subModels }).pipe(
307+
map((subModelsVisibilityStatus) =>
308+
subModelsVisibilityStatus.state !== "hidden" ? createVisibilityStatus("partial") : createVisibilityStatus("hidden"),
309+
),
310+
);
311+
}
312+
return of(createVisibilityStatus("hidden"));
313+
}),
314+
);
315+
}
316+
// For visible models we need to check all categories
317+
return this.getCategories({ modelIds: modelId }).pipe(
318+
mergeMap(({ drawingCategories, spatialCategories }) =>
319+
merge(
320+
drawingCategories ? of(drawingCategories).pipe(mergeMap((categoryIds) => this.getCategoriesVisibilityStatus({ modelId, categoryIds }))) : EMPTY,
321+
spatialCategories ? of(spatialCategories).pipe(mergeMap((categoryIds) => this.getCategoriesVisibilityStatus({ modelId, categoryIds }))) : EMPTY,
322+
),
322323
),
323-
),
324-
mergeVisibilityStatuses,
325-
);
326-
}),
327-
mergeVisibilityStatuses,
328-
);
324+
);
325+
}),
326+
mergeVisibilityStatuses,
327+
);
328+
});
329+
return createVisibilityHandlerResult(this, { modelIds }, result, undefined);
329330
}
330331

331332
private getDefinitionContainersVisibilityStatus(props: { definitionContainerIds: Id64Arg }): Observable<VisibilityStatus> {
@@ -498,7 +499,6 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
498499
}
499500
return of(createVisibilityStatus("hidden"));
500501
}),
501-
mergeVisibilityStatuses,
502502
)
503503
: EMPTY,
504504
// For visible models we need to check all categories
@@ -510,27 +510,23 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
510510
categoryIds: categoryId,
511511
}),
512512
),
513-
mergeVisibilityStatuses,
514513
)
515514
: EMPTY,
516-
// If modelId was not provided, that means we want to check subCategories as well
517-
!modelIdFromProps
518-
? this.getSubCategories({ categoryIds: categoryId }).pipe(
519-
mergeMap(({ subCategories }) => {
520-
if ((!subCategories || Id64.sizeOf(subCategories) === 0) && (visibleModels.length > 0 || hiddenModels.length > 0)) {
521-
return EMPTY;
522-
}
523-
if (!this._props.viewport.view.viewsCategory(categoryId)) {
524-
return of(createVisibilityStatus("hidden"));
525-
}
526-
if (!subCategories) {
527-
return of(createVisibilityStatus("visible"));
528-
}
529-
return of(this.getVisibileCategorySubCategoriesVisibilityStatus({ subCategoryIds: subCategories }));
530-
}),
531-
)
532-
: EMPTY,
533-
).pipe(mergeVisibilityStatuses);
515+
// We need to check subCategories as well
516+
this.getSubCategories({ categoryIds: categoryId }).pipe(
517+
mergeMap(({ subCategories }) => {
518+
if (subCategories && Id64.sizeOf(subCategories) > 0) {
519+
return this.getSubCategoriesVisibilityStatus({ categoryId, modelId: modelIdFromProps, subCategoryIds: subCategories });
520+
}
521+
522+
if (visibleModels.length === 0 && hiddenModels.length === 0) {
523+
return of(createVisibilityStatus(this._props.viewport.view.viewsCategory(categoryId) ? "visible" : "hidden"));
524+
}
525+
526+
return EMPTY;
527+
}),
528+
),
529+
);
534530
}),
535531
mergeVisibilityStatuses,
536532
);
@@ -553,7 +549,7 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
553549
const result = defer(() => {
554550
const { elementIds, modelId, categoryId } = props;
555551

556-
// TODO: check child subModels
552+
// TODO: check child elements that are subModels
557553
if (!this._props.viewport.view.viewsModel(modelId)) {
558554
return from(elementIds).pipe(
559555
mergeMap((elementId) =>
@@ -577,7 +573,7 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
577573
}
578574
// TODO: check child elements
579575
// TODO: check child element categories
580-
// TODO: check child subModels
576+
// TODO: check child elements that are subModels
581577
return this.getVisibilityFromAlwaysAndNeverDrawnElements({
582578
elements: elementIds,
583579
defaultStatus: () => this.getVisibleModelDefaultCategoriesVisibilityStatus({ categoryIds: categoryId, modelId }),
@@ -784,14 +780,7 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
784780
viewport.setAlwaysDrawn(setDifference(alwaysDrawn, modelAlwaysDrawnElements));
785781
}
786782
const categoriesToOverride = categoriesToNotOverride
787-
? setDifference(
788-
allModelCategories,
789-
typeof categoriesToNotOverride === "string"
790-
? new Set([categoriesToNotOverride])
791-
: Array.isArray(categoriesToNotOverride)
792-
? new Set(categoriesToNotOverride)
793-
: categoriesToNotOverride,
794-
)
783+
? setDifference(allModelCategories, getSetFromId64Arg(categoriesToNotOverride))
795784
: allModelCategories;
796785
categoriesToOverride.forEach((categoryId) => {
797786
this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, false, false);

packages/itwin/tree-widget/src/tree-widget-react/components/trees/common/internal/Utils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,8 @@ export function joinId64Arg(arg: Id64Arg, separator: string): string {
129129
}
130130
return joined;
131131
}
132+
133+
/** @internal */
134+
export function getSetFromId64Arg(arg: Id64Arg): Set<Id64String> {
135+
return typeof arg === "string" ? new Set([arg]) : Array.isArray(arg) ? new Set(arg) : arg;
136+
}

0 commit comments

Comments
 (0)