@itwin/presentation-frontend 4.3.0-dev.9 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/CHANGELOG.md +49 -1
  2. package/lib/cjs/presentation-frontend/PresentationManager.d.ts +10 -1
  3. package/lib/cjs/presentation-frontend/PresentationManager.d.ts.map +1 -1
  4. package/lib/cjs/presentation-frontend/PresentationManager.js +3 -2
  5. package/lib/cjs/presentation-frontend/PresentationManager.js.map +1 -1
  6. package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.d.ts +10 -3
  7. package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.d.ts.map +1 -1
  8. package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.js +94 -46
  9. package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.js.map +1 -1
  10. package/lib/cjs/presentation-frontend/selection/SelectionManager.d.ts +6 -0
  11. package/lib/cjs/presentation-frontend/selection/SelectionManager.d.ts.map +1 -1
  12. package/lib/cjs/presentation-frontend/selection/SelectionManager.js +11 -1
  13. package/lib/cjs/presentation-frontend/selection/SelectionManager.js.map +1 -1
  14. package/lib/esm/presentation-frontend/PresentationManager.d.ts +10 -1
  15. package/lib/esm/presentation-frontend/PresentationManager.d.ts.map +1 -1
  16. package/lib/esm/presentation-frontend/PresentationManager.js +3 -2
  17. package/lib/esm/presentation-frontend/PresentationManager.js.map +1 -1
  18. package/lib/esm/presentation-frontend/selection/HiliteSetProvider.d.ts +10 -3
  19. package/lib/esm/presentation-frontend/selection/HiliteSetProvider.d.ts.map +1 -1
  20. package/lib/esm/presentation-frontend/selection/HiliteSetProvider.js +94 -46
  21. package/lib/esm/presentation-frontend/selection/HiliteSetProvider.js.map +1 -1
  22. package/lib/esm/presentation-frontend/selection/SelectionManager.d.ts +6 -0
  23. package/lib/esm/presentation-frontend/selection/SelectionManager.d.ts.map +1 -1
  24. package/lib/esm/presentation-frontend/selection/SelectionManager.js +11 -1
  25. package/lib/esm/presentation-frontend/selection/SelectionManager.js.map +1 -1
  26. package/package.json +19 -16
@@ -5,6 +5,8 @@
5
5
  /** @packageDocumentation
6
6
  * @module UnifiedSelection
7
7
  */
8
+ import { from, shareReplay } from "rxjs";
9
+ import { eachValueFrom } from "rxjs-for-await";
8
10
  import { ContentFlags, DEFAULT_KEYS_BATCH_SIZE, DefaultContentDisplayTypes, Key, KeySet, } from "@itwin/presentation-common";
9
11
  import { Presentation } from "../Presentation";
10
12
  import { TRANSIENT_ELEMENT_CLASSNAME } from "./SelectionManager";
@@ -26,7 +28,79 @@ export class HiliteSetProvider {
26
28
  * Create a hilite set provider for the specified iModel.
27
29
  */
28
30
  static create(props) { return new HiliteSetProvider(props); }
29
- async getRecords(keys) {
31
+ /**
32
+ * Get hilite set for instances and/or nodes whose keys are specified in the
33
+ * given KeySet.
34
+ *
35
+ * Note: The provider caches result of the last request, so subsequent requests
36
+ * for the same input doesn't cost.
37
+ */
38
+ async getHiliteSet(selection) {
39
+ const modelIds = new Array();
40
+ const subCategoryIds = new Array();
41
+ const elementIds = new Array();
42
+ const iterator = this.getHiliteSetIterator(selection);
43
+ for await (const set of iterator) {
44
+ modelIds.push(...set.models ?? []);
45
+ subCategoryIds.push(...set.subCategories ?? []);
46
+ elementIds.push(...set.elements ?? []);
47
+ }
48
+ return {
49
+ models: modelIds.length ? modelIds : undefined,
50
+ subCategories: subCategoryIds.length ? subCategoryIds : undefined,
51
+ elements: elementIds.length ? elementIds : undefined,
52
+ };
53
+ }
54
+ /**
55
+ * Get hilite set iterator for provided keys. It loads content in batches and
56
+ * yields hilite set created from each batch after it is loaded.
57
+ */
58
+ getHiliteSetIterator(selection) {
59
+ if (!this._cache || this._cache.keysGuid !== selection.guid) {
60
+ this._cache = {
61
+ keysGuid: selection.guid,
62
+ observable: from(this.createHiliteSetIterator(selection)).pipe(shareReplay({ refCount: true })),
63
+ };
64
+ }
65
+ return eachValueFrom(this._cache.observable);
66
+ }
67
+ async *createHiliteSetIterator(selection) {
68
+ const { keys, transientIds } = this.handleTransientKeys(selection);
69
+ const { options, keyBatches } = this.getContentOptions(keys);
70
+ if (transientIds.length !== 0) {
71
+ yield { elements: transientIds };
72
+ }
73
+ for (const batch of keyBatches) {
74
+ let loadedItems = 0;
75
+ while (true) {
76
+ const content = await Presentation.presentation.getContentAndSize({ ...options, paging: { start: loadedItems, size: CONTENT_SET_PAGE_SIZE }, keys: batch });
77
+ if (!content) {
78
+ break;
79
+ }
80
+ const result = this.createHiliteSet(content.content.contentSet);
81
+ yield result;
82
+ loadedItems += content.content.contentSet.length;
83
+ if (loadedItems >= content.size) {
84
+ break;
85
+ }
86
+ }
87
+ }
88
+ }
89
+ createHiliteSet(records) {
90
+ const modelIds = new Array();
91
+ const subCategoryIds = new Array();
92
+ const elementIds = new Array();
93
+ records.forEach((rec) => {
94
+ const ids = isModelRecord(rec) ? modelIds : isSubCategoryRecord(rec) ? subCategoryIds : elementIds;
95
+ rec.primaryKeys.forEach((pk) => ids.push(pk.id));
96
+ });
97
+ return {
98
+ models: modelIds.length ? modelIds : undefined,
99
+ subCategories: subCategoryIds.length ? subCategoryIds : undefined,
100
+ elements: elementIds.length ? elementIds : undefined,
101
+ };
102
+ }
103
+ getContentOptions(keys) {
30
104
  const descriptor = {
31
105
  displayType: DefaultContentDisplayTypes.Viewport,
32
106
  contentFlags: ContentFlags.KeysOnly,
@@ -36,59 +110,33 @@ export class HiliteSetProvider {
36
110
  rulesetOrId: HILITE_RULESET,
37
111
  descriptor,
38
112
  };
39
- const contentPromises = new Array();
113
+ const keyBatches = new Array();
40
114
  keys.forEachBatch(DEFAULT_KEYS_BATCH_SIZE, (batch) => {
41
- contentPromises.push(Presentation.presentation.getContent({ ...options, keys: batch }));
115
+ keyBatches.push(batch);
42
116
  });
43
- return (await Promise.all(contentPromises)).reduce((items, content) => {
44
- if (content)
45
- items.push(...content.contentSet);
46
- return items;
47
- }, new Array());
117
+ return {
118
+ options,
119
+ keyBatches,
120
+ };
48
121
  }
49
- createHiliteSet(records, transientIds) {
50
- if (!records.length)
51
- return { elements: transientIds };
52
- const modelIds = new Array();
53
- const subCategoryIds = new Array();
54
- const elementIds = transientIds; // note: not making a copy here since we're throwing away `transientIds` anyway
55
- records.forEach((rec) => {
56
- const ids = isModelRecord(rec) ? modelIds : isSubCategoryRecord(rec) ? subCategoryIds : elementIds;
57
- rec.primaryKeys.forEach((pk) => ids.push(pk.id));
122
+ handleTransientKeys(selection) {
123
+ // need to create a new set without transients
124
+ const transientIds = new Array();
125
+ const keys = new KeySet();
126
+ keys.add(selection, (key) => {
127
+ if (Key.isInstanceKey(key) && key.className === TRANSIENT_ELEMENT_CLASSNAME) {
128
+ transientIds.push(key.id);
129
+ return false;
130
+ }
131
+ return true;
58
132
  });
59
133
  return {
60
- models: modelIds.length ? modelIds : undefined,
61
- subCategories: subCategoryIds.length ? subCategoryIds : undefined,
62
- elements: elementIds.length ? elementIds : undefined,
134
+ transientIds,
135
+ keys,
63
136
  };
64
137
  }
65
- /**
66
- * Get hilite set for instances and/or nodes whose keys are specified in the
67
- * given KeySet.
68
- *
69
- * Note: The provider caches result of the last request, so subsequent requests
70
- * for the same input doesn't cost.
71
- */
72
- async getHiliteSet(selection) {
73
- const selectionGuid = selection.guid;
74
- if (!this._cached || this._cached.keysGuid !== selectionGuid) {
75
- // need to create a new set without transients
76
- const transientIds = new Array();
77
- const keys = new KeySet();
78
- keys.add(selection, (key) => {
79
- if (Key.isInstanceKey(key) && key.className === TRANSIENT_ELEMENT_CLASSNAME) {
80
- transientIds.push(key.id);
81
- return false;
82
- }
83
- return true;
84
- });
85
- const records = await this.getRecords(keys);
86
- const result = this.createHiliteSet(records, transientIds);
87
- this._cached = { keysGuid: selectionGuid, result };
88
- }
89
- return this._cached.result;
90
- }
91
138
  }
139
+ const CONTENT_SET_PAGE_SIZE = 1000;
92
140
  const isModelRecord = (rec) => (rec.extendedData && rec.extendedData.isModel);
93
141
  const isSubCategoryRecord = (rec) => (rec.extendedData && rec.extendedData.isSubCategory);
94
142
  //# sourceMappingURL=HiliteSetProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HiliteSetProvider.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/HiliteSetProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { IModelConnection } from \"@itwin/core-frontend\";\r\nimport {\r\n Content, ContentFlags, DEFAULT_KEYS_BATCH_SIZE, DefaultContentDisplayTypes, DescriptorOverrides, Item, Key, KeySet, Ruleset,\r\n} from \"@itwin/presentation-common\";\r\nimport { Presentation } from \"../Presentation\";\r\nimport { TRANSIENT_ELEMENT_CLASSNAME } from \"./SelectionManager\";\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/no-var-requires\r\nexport const HILITE_RULESET: Ruleset = require(\"./HiliteRules.json\");\r\n\r\n/**\r\n * A set of model, subcategory and element ids that can be used for specifying\r\n * viewport hilite.\r\n *\r\n * @public\r\n */\r\nexport interface HiliteSet {\r\n models?: Id64String[];\r\n subCategories?: Id64String[];\r\n elements?: Id64String[];\r\n}\r\n\r\n/**\r\n * Properties for creating a `HiliteSetProvider` instance.\r\n * @public\r\n */\r\nexport interface HiliteSetProviderProps {\r\n imodel: IModelConnection;\r\n}\r\n\r\n/**\r\n * Presentation-based provider which uses presentation ruleset to determine\r\n * what `HiliteSet` should be hilited in the graphics viewport based on the\r\n * supplied `KeySet`.\r\n *\r\n * @public\r\n */\r\nexport class HiliteSetProvider {\r\n private _imodel: IModelConnection;\r\n private _cached: undefined | { keysGuid: string, result: HiliteSet };\r\n\r\n private constructor(props: HiliteSetProviderProps) {\r\n this._imodel = props.imodel;\r\n }\r\n\r\n /**\r\n * Create a hilite set provider for the specified iModel.\r\n */\r\n public static create(props: HiliteSetProviderProps) { return new HiliteSetProvider(props); }\r\n\r\n private async getRecords(keys: KeySet): Promise<Item[]> {\r\n const descriptor: DescriptorOverrides = {\r\n displayType: DefaultContentDisplayTypes.Viewport,\r\n contentFlags: ContentFlags.KeysOnly,\r\n };\r\n const options = {\r\n imodel: this._imodel,\r\n rulesetOrId: HILITE_RULESET,\r\n descriptor,\r\n };\r\n const contentPromises = new Array<Promise<Content | undefined>>();\r\n keys.forEachBatch(DEFAULT_KEYS_BATCH_SIZE, (batch: KeySet) => {\r\n contentPromises.push(Presentation.presentation.getContent({ ...options, keys: batch }));\r\n });\r\n return (await Promise.all(contentPromises)).reduce((items, content) => {\r\n if (content)\r\n items.push(...content.contentSet);\r\n return items;\r\n }, new Array<Item>());\r\n }\r\n\r\n private createHiliteSet(records: Item[], transientIds: Id64String[]) {\r\n if (!records.length)\r\n return { elements: transientIds };\r\n\r\n const modelIds = new Array<Id64String>();\r\n const subCategoryIds = new Array<Id64String>();\r\n const elementIds = transientIds; // note: not making a copy here since we're throwing away `transientIds` anyway\r\n records.forEach((rec) => {\r\n const ids = isModelRecord(rec) ? modelIds : isSubCategoryRecord(rec) ? subCategoryIds : elementIds;\r\n rec.primaryKeys.forEach((pk) => ids.push(pk.id));\r\n });\r\n return {\r\n models: modelIds.length ? modelIds : undefined,\r\n subCategories: subCategoryIds.length ? subCategoryIds : undefined,\r\n elements: elementIds.length ? elementIds : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Get hilite set for instances and/or nodes whose keys are specified in the\r\n * given KeySet.\r\n *\r\n * Note: The provider caches result of the last request, so subsequent requests\r\n * for the same input doesn't cost.\r\n */\r\n public async getHiliteSet(selection: Readonly<KeySet>): Promise<HiliteSet> {\r\n const selectionGuid = selection.guid;\r\n if (!this._cached || this._cached.keysGuid !== selectionGuid) {\r\n // need to create a new set without transients\r\n const transientIds = new Array<Id64String>();\r\n const keys = new KeySet();\r\n keys.add(selection, (key: Key) => {\r\n if (Key.isInstanceKey(key) && key.className === TRANSIENT_ELEMENT_CLASSNAME) {\r\n transientIds.push(key.id);\r\n return false;\r\n }\r\n return true;\r\n });\r\n const records = await this.getRecords(keys);\r\n const result = this.createHiliteSet(records, transientIds);\r\n this._cached = { keysGuid: selectionGuid, result };\r\n }\r\n return this._cached.result;\r\n }\r\n}\r\n\r\nconst isModelRecord = (rec: Item) => (rec.extendedData && rec.extendedData.isModel);\r\n\r\nconst isSubCategoryRecord = (rec: Item) => (rec.extendedData && rec.extendedData.isSubCategory);\r\n"]}
1
+ {"version":3,"file":"HiliteSetProvider.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/HiliteSetProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { from, Observable, shareReplay } from \"rxjs\";\r\nimport { eachValueFrom } from \"rxjs-for-await\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { IModelConnection } from \"@itwin/core-frontend\";\r\nimport {\r\n ContentFlags, DEFAULT_KEYS_BATCH_SIZE, DefaultContentDisplayTypes, DescriptorOverrides, Item, Key, KeySet, Ruleset,\r\n} from \"@itwin/presentation-common\";\r\nimport { Presentation } from \"../Presentation\";\r\nimport { TRANSIENT_ELEMENT_CLASSNAME } from \"./SelectionManager\";\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/no-var-requires\r\nexport const HILITE_RULESET: Ruleset = require(\"./HiliteRules.json\");\r\n\r\n/**\r\n * A set of model, subcategory and element ids that can be used for specifying\r\n * viewport hilite.\r\n *\r\n * @public\r\n */\r\nexport interface HiliteSet {\r\n models?: Id64String[];\r\n subCategories?: Id64String[];\r\n elements?: Id64String[];\r\n}\r\n\r\n/**\r\n * Properties for creating a `HiliteSetProvider` instance.\r\n * @public\r\n */\r\nexport interface HiliteSetProviderProps {\r\n imodel: IModelConnection;\r\n}\r\n\r\n/**\r\n * Presentation-based provider which uses presentation ruleset to determine\r\n * what `HiliteSet` should be hilited in the graphics viewport based on the\r\n * supplied `KeySet`.\r\n *\r\n * @public\r\n */\r\nexport class HiliteSetProvider {\r\n private _imodel: IModelConnection;\r\n private _cache: undefined | { keysGuid: string, observable: Observable<HiliteSet> };\r\n\r\n private constructor(props: HiliteSetProviderProps) {\r\n this._imodel = props.imodel;\r\n }\r\n\r\n /**\r\n * Create a hilite set provider for the specified iModel.\r\n */\r\n public static create(props: HiliteSetProviderProps) { return new HiliteSetProvider(props); }\r\n\r\n /**\r\n * Get hilite set for instances and/or nodes whose keys are specified in the\r\n * given KeySet.\r\n *\r\n * Note: The provider caches result of the last request, so subsequent requests\r\n * for the same input doesn't cost.\r\n */\r\n public async getHiliteSet(selection: Readonly<KeySet>): Promise<HiliteSet> {\r\n const modelIds = new Array<Id64String>();\r\n const subCategoryIds = new Array<Id64String>();\r\n const elementIds = new Array<Id64String>();\r\n\r\n const iterator = this.getHiliteSetIterator(selection);\r\n for await (const set of iterator) {\r\n modelIds.push(...set.models ?? []);\r\n subCategoryIds.push(...set.subCategories ?? []);\r\n elementIds.push(...set.elements ?? []);\r\n }\r\n\r\n return {\r\n models: modelIds.length ? modelIds : undefined,\r\n subCategories: subCategoryIds.length ? subCategoryIds : undefined,\r\n elements: elementIds.length ? elementIds : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Get hilite set iterator for provided keys. It loads content in batches and\r\n * yields hilite set created from each batch after it is loaded.\r\n */\r\n public getHiliteSetIterator(selection: Readonly<KeySet>) {\r\n if (!this._cache || this._cache.keysGuid !== selection.guid) {\r\n this._cache = {\r\n keysGuid: selection.guid,\r\n observable: from(this.createHiliteSetIterator(selection)).pipe(shareReplay({ refCount: true })),\r\n };\r\n }\r\n\r\n return eachValueFrom(this._cache.observable);\r\n }\r\n\r\n private async * createHiliteSetIterator(selection: Readonly<KeySet>) {\r\n const {keys, transientIds} = this.handleTransientKeys(selection);\r\n const {options, keyBatches} = this.getContentOptions(keys);\r\n\r\n if (transientIds.length !== 0) {\r\n yield { elements: transientIds };\r\n }\r\n\r\n for (const batch of keyBatches) {\r\n let loadedItems = 0;\r\n while (true) {\r\n const content = await Presentation.presentation.getContentAndSize({...options, paging: {start: loadedItems, size: CONTENT_SET_PAGE_SIZE}, keys: batch});\r\n if (!content) {\r\n break;\r\n }\r\n\r\n const result = this.createHiliteSet(content.content.contentSet);\r\n yield result;\r\n\r\n loadedItems += content.content.contentSet.length;\r\n if (loadedItems >= content.size) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private createHiliteSet(records: Item[]): HiliteSet {\r\n const modelIds = new Array<Id64String>();\r\n const subCategoryIds = new Array<Id64String>();\r\n const elementIds = new Array<Id64String>();\r\n records.forEach((rec) => {\r\n const ids = isModelRecord(rec) ? modelIds : isSubCategoryRecord(rec) ? subCategoryIds : elementIds;\r\n rec.primaryKeys.forEach((pk) => ids.push(pk.id));\r\n });\r\n return {\r\n models: modelIds.length ? modelIds : undefined,\r\n subCategories: subCategoryIds.length ? subCategoryIds : undefined,\r\n elements: elementIds.length ? elementIds : undefined,\r\n };\r\n }\r\n\r\n private getContentOptions(keys: KeySet) {\r\n const descriptor: DescriptorOverrides = {\r\n displayType: DefaultContentDisplayTypes.Viewport,\r\n contentFlags: ContentFlags.KeysOnly,\r\n };\r\n const options = {\r\n imodel: this._imodel,\r\n rulesetOrId: HILITE_RULESET,\r\n descriptor,\r\n };\r\n const keyBatches = new Array<KeySet>();\r\n keys.forEachBatch(DEFAULT_KEYS_BATCH_SIZE, (batch: KeySet) => {\r\n keyBatches.push(batch);\r\n });\r\n return {\r\n options,\r\n keyBatches,\r\n };\r\n }\r\n\r\n private handleTransientKeys(selection: Readonly<KeySet>) {\r\n // need to create a new set without transients\r\n const transientIds = new Array<Id64String>();\r\n const keys = new KeySet();\r\n keys.add(selection, (key: Key) => {\r\n if (Key.isInstanceKey(key) && key.className === TRANSIENT_ELEMENT_CLASSNAME) {\r\n transientIds.push(key.id);\r\n return false;\r\n }\r\n return true;\r\n });\r\n return {\r\n transientIds,\r\n keys,\r\n };\r\n }\r\n}\r\n\r\nconst CONTENT_SET_PAGE_SIZE = 1000;\r\n\r\nconst isModelRecord = (rec: Item) => (rec.extendedData && rec.extendedData.isModel);\r\n\r\nconst isSubCategoryRecord = (rec: Item) => (rec.extendedData && rec.extendedData.isSubCategory);\r\n"]}
@@ -120,6 +120,12 @@ export declare class SelectionManager implements ISelectionProvider {
120
120
  * @public
121
121
  */
122
122
  getHiliteSet(imodel: IModelConnection): Promise<HiliteSet>;
123
+ /**
124
+ * Get the current hilite set iterator for the specified imodel.
125
+ * @public
126
+ */
127
+ getHiliteSetIterator(imodel: IModelConnection): AsyncIterableIterator<HiliteSet>;
128
+ private getHiliteSetProvider;
123
129
  }
124
130
  /** @internal */
125
131
  export declare const TRANSIENT_ELEMENT_CLASSNAME = "/TRANSIENT";
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionManager.d.ts","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectionManager.d.ts","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionManager.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAQ,OAAO,EAAa,WAAW,EAAS,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAA4C,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAqB,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAClH,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAiD,MAAM,wBAAwB,CAAC;AAC7G,OAAO,EAA6B,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE7F;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oGAAoG;IACpG,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,OAAO,CAAC,sBAAsB,CAAmD;IACjF,OAAO,CAAC,gCAAgC,CAA+F;IACvI,OAAO,CAAC,mBAAmB,CAAkD;IAE7E,2DAA2D;IAC3D,SAAgB,eAAe,EAAE,oBAAoB,CAAC;IAEtD,kGAAkG;IAClG,SAAgB,MAAM,EAAE,sBAAsB,CAAC;IAE/C;;OAEG;gBACS,KAAK,EAAE,qBAAqB;IAQxC,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,YAAY;IASpB,gBAAgB;IAET,2BAA2B,CAAC,MAAM,EAAE,gBAAgB;IAE3D;;OAEG;IACI,8BAA8B,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,UAAO;IAqB3E;;;OAGG;IACI,8BAA8B,CAAC,MAAM,EAAE,gBAAgB,GAAG,WAAW;IAU5E,yFAAyF;IAClF,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE;IAI7D,yDAAyD;IAClD,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,GAAE,MAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IAIlF,OAAO,CAAC,WAAW;IA8BnB;;;;;;;OAOG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAaxH;;;;;;;OAOG;IACI,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAa7H;;;;;;;OAOG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAa1H;;;;;;OAMG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAa5G;;;;;;;;OAQG;IACU,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,GAAG,cAAc,GAAG,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxM;;;;;;;;OAQG;IACU,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,GAAG,cAAc,GAAG,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7M;;;;;;;;OAQG;IACU,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,GAAG,cAAc,GAAG,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1M;;;OAGG;IACU,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;IAIvE;;;OAGG;IACI,oBAAoB,CAAC,MAAM,EAAE,gBAAgB;IAIpD,OAAO,CAAC,oBAAoB;CAQ7B;AAuCD,gBAAgB;AAChB,eAAO,MAAM,2BAA2B,eAAe,CAAC;AAExD,gBAAgB;AAChB,qBAAa,wBAAyB,YAAW,WAAW;IAE1D,OAAO,CAAC,oBAAoB,CAAU;IACtC,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,uCAAuC,CAAa;IAC5D,OAAO,CAAC,cAAc,CAA2B;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;gBAEV,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB;IAMxE,OAAO;IAId,+BAA+B;IAC/B,IAAW,aAAa,gBAAgD;IAGxE,OAAO,CAAC,sBAAsB,CAqD5B;CACH"}
@@ -241,12 +241,22 @@ export class SelectionManager {
241
241
  * @public
242
242
  */
243
243
  async getHiliteSet(imodel) {
244
+ return this.getHiliteSetProvider(imodel).getHiliteSet(this.getSelection(imodel));
245
+ }
246
+ /**
247
+ * Get the current hilite set iterator for the specified imodel.
248
+ * @public
249
+ */
250
+ getHiliteSetIterator(imodel) {
251
+ return this.getHiliteSetProvider(imodel).getHiliteSetIterator(this.getSelection(imodel));
252
+ }
253
+ getHiliteSetProvider(imodel) {
244
254
  let provider = this._hiliteSetProviders.get(imodel);
245
255
  if (!provider) {
246
256
  provider = HiliteSetProvider.create({ imodel });
247
257
  this._hiliteSetProviders.set(imodel, provider);
248
258
  }
249
- return provider.getHiliteSet(this.getSelection(imodel));
259
+ return provider;
250
260
  }
251
261
  }
252
262
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionManager.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionManager.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAmC,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAqB,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAQ,MAAM,EAAuC,MAAM,4BAA4B,CAAC;AAClH,OAAO,EAAa,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,oBAAoB,EAA4B,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7G,OAAO,EAAE,yBAAyB,EAA0B,MAAM,0BAA0B,CAAC;AAW7F;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAW3B;;OAEG;IACH,YAAY,KAA4B;QAbhC,2BAAsB,GAAG,IAAI,GAAG,EAAwC,CAAC;QACzE,qCAAgC,GAAG,IAAI,GAAG,EAAoF,CAAC;QAC/H,wBAAmB,GAAG,IAAI,GAAG,EAAuC,CAAC;QAY3E,IAAI,CAAC,eAAe,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAwB,EAAE,EAAE;YAChE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,MAAwB;QAChD,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEO,YAAY,CAAC,MAAwB;QAC3C,IAAI,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,kBAAkB,EAAE;YACvB,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAC9C,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;SAC7D;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,gBAAgB;IAChB,uBAAuB;IAChB,2BAA2B,CAAC,MAAwB,IAAI,OAAO,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnI;;OAEG;IACI,8BAA8B,CAAC,MAAwB,EAAE,IAAI,GAAG,IAAI;QACzE,MAAM,YAAY,GAAG,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvE,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,eAAe,KAAK,CAAC,EAAE;gBACvD,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;aAChI;iBAAM;gBACL,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,YAAY,EAAE,eAAe,EAAE,YAAY,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC,CAAC;aAC3H;SACF;aAAM;YACL,IAAI,YAAY,IAAI,YAAY,CAAC,eAAe,GAAG,CAAC,EAAE;gBACpD,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,GAAG,CAAC,CAAC;gBACzD,IAAI,eAAe,GAAG,CAAC,EAAE;oBACvB,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC;iBACzF;qBAAM;oBACL,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACrD,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;iBAChC;aACF;SACF;IACH,CAAC;IAED;;;OAGG;IACI,8BAA8B,CAAC,MAAwB;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY;YACf,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QAEhC,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;QACtD,YAAY,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;QACxC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED,yFAAyF;IAClF,kBAAkB,CAAC,MAAwB;QAChD,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACxD,CAAC;IAED,yDAAyD;IAClD,YAAY,CAAC,MAAwB,EAAE,QAAgB,CAAC;QAC7D,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAEO,WAAW,CAAC,GAA6B;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,gBAAgB,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC;QACzC,QAAQ,GAAG,CAAC,UAAU,EAAE;YACtB,KAAK,mBAAmB,CAAC,GAAG;gBAC1B,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,mBAAmB,CAAC,MAAM;gBAC7B,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,mBAAmB,CAAC,OAAO;gBAC9B,IAAI,gBAAgB,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACjF,yDAAyD;oBACzD,kEAAkE;oBAClE,gBAAgB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;iBACxC;gBACD,MAAM;YACR,KAAK,mBAAmB,CAAC,KAAK;gBAC5B,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBACzB,MAAM;SACT;QAED,IAAI,gBAAgB,CAAC,IAAI,KAAK,UAAU;YACtC,OAAO;QAET,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;OAOG;IACI,cAAc,CAAC,MAAc,EAAE,MAAwB,EAAE,IAAU,EAAE,QAAgB,CAAC,EAAE,SAAkB;QAC/G,MAAM,GAAG,GAA6B;YACpC,MAAM;YACN,KAAK;YACL,MAAM;YACN,UAAU,EAAE,mBAAmB,CAAC,GAAG;YACnC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS;SACV,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;;OAOG;IACI,mBAAmB,CAAC,MAAc,EAAE,MAAwB,EAAE,IAAU,EAAE,QAAgB,CAAC,EAAE,SAAkB;QACpH,MAAM,GAAG,GAA6B;YACpC,MAAM;YACN,KAAK;YACL,MAAM;YACN,UAAU,EAAE,mBAAmB,CAAC,MAAM;YACtC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS;SACV,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;;OAOG;IACI,gBAAgB,CAAC,MAAc,EAAE,MAAwB,EAAE,IAAU,EAAE,QAAgB,CAAC,EAAE,SAAkB;QACjH,MAAM,GAAG,GAA6B;YACpC,MAAM;YACN,KAAK;YACL,MAAM;YACN,UAAU,EAAE,mBAAmB,CAAC,OAAO;YACvC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS;SACV,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACI,cAAc,CAAC,MAAc,EAAE,MAAwB,EAAE,QAAgB,CAAC,EAAE,SAAkB;QACnG,MAAM,GAAG,GAA6B;YACpC,MAAM;YACN,KAAK;YACL,MAAM;YACN,UAAU,EAAE,mBAAmB,CAAC,KAAK;YACrC,IAAI,EAAE,IAAI,MAAM,EAAE;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS;SACV,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,uBAAuB,CAAC,MAAc,EAAE,MAAwB,EAAE,GAAY,EAAE,KAAoD,EAAE,QAAgB,CAAC,EAAE,SAAkB;QACtL,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,4BAA4B,CAAC,MAAc,EAAE,MAAwB,EAAE,GAAY,EAAE,KAAoD,EAAE,QAAgB,CAAC,EAAE,SAAkB;QAC3L,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,yBAAyB,CAAC,MAAc,EAAE,MAAwB,EAAE,GAAY,EAAE,KAAoD,EAAE,QAAgB,CAAC,EAAE,SAAkB;QACxL,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,YAAY,CAAC,MAAwB;QAChD,IAAI,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SAChD;QACD,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF;AAED,gBAAgB;AAChB,MAAM,kBAAkB;IAGtB;QACE,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxD,CAAC;IAEM,YAAY,CAAC,KAAa;QAC/B,IAAI,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,gBAAgB,EAAE;YACrB,gBAAgB,GAAG,IAAI,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;SACxD;QACD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEM,kBAAkB;QACvB,MAAM,MAAM,GAAG,IAAI,KAAK,EAAU,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE;YACvD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;gBACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACzB;QACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,KAAa;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,IAAI,GAAG,IAAI,KAAK,EAAE;gBAChB,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;gBAC7D,gBAAgB,CAAC,KAAK,EAAE,CAAC;aAC1B;SACF;IACH,CAAC;CACF;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,2BAA2B,GAAG,YAAY,CAAC;AAExD,gBAAgB;AAChB,MAAM,OAAO,wBAAwB;IASnC,YAAmB,MAAwB,EAAE,gBAAkC;QAPvE,yBAAoB,GAAG,MAAM,CAAC;QAI9B,mBAAc,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAgBjD,gEAAgE;QACxD,2BAAsB,GAAG,KAAK,EAAE,EAAqB,EAAiB,EAAE;YAC9E,4DAA4D;YAC5D,IAAI,IAAI,CAAC,WAAW;gBAClB,OAAO;YAET,iDAAiD;YACjD,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO;gBACzB,OAAO;YAET,2CAA2C;YAC3C,wDAAwD;YACxD,MAAM,cAAc,GAAG,CAAC,CAAC;YAEzB,IAAI,GAAY,CAAC;YACjB,QAAQ,EAAE,CAAC,IAAI,EAAE;gBACf,KAAK,qBAAqB,CAAC,GAAG;oBAC5B,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;oBACf,MAAM;gBACR,KAAK,qBAAqB,CAAC,OAAO;oBAChC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACtB,MAAM;gBACR;oBACE,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;oBACjB,MAAM;aACT;YAED,2FAA2F;YAC3F,mGAAmG;YACnG,4FAA4F;YAC5F,oBAAoB;YACpB,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;YAElL,mDAAmD;YACnD,IAAI,qBAAqB,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,EAAE;gBAC3C,MAAM,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACpC,OAAO;aACR;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC7D,QAAQ,EAAE,CAAC,IAAI,EAAE;oBACf,KAAK,qBAAqB,CAAC,GAAG;wBAC5B,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;wBAC7E,MAAM;oBACR,KAAK,qBAAqB,CAAC,OAAO;wBAChC,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;wBACjF,MAAM;oBACR,KAAK,qBAAqB,CAAC,MAAM;wBAC/B,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;wBAChF,MAAM;iBACT;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAlEA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,uCAAuC,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACxH,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,uCAAuC,EAAE,CAAC;IACjD,CAAC;IAED,+BAA+B;IAC/B,IAAW,aAAa,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;CAyDzE;AAED,MAAM,QAAQ,GAAG,CAAC,GAAY,EAA+C,EAAE;IAC7E,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,YAAY,GAAG,IAAI,CAAC;IACxB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACnC,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACtB,aAAa,GAAG,KAAK,CAAC;;YAEtB,YAAY,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY;YACjC,MAAM;KACT;IAED,mEAAmE;IACnE,IAAI,aAAa,EAAE;QACjB,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;KAC3C;SAAM,IAAI,YAAY,EAAE;QACvB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;KAC3C;IAED,qEAAqE;IACrE,wBAAwB;IACxB,MAAM,oBAAoB,GAAc,EAAE,CAAC;IAC3C,MAAM,mBAAmB,GAAc,EAAE,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACnC,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACtB,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;YAE7B,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACjC;IAED,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;AAC9E,CAAC,CAAC;AAEF,SAAS,gBAAgB,CAAC,YAAqB,EAAE,IAAY;IAC3D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,gBAAgB;AAChB,MAAM,sBAAsB;IAK1B,YAAmB,IAAY,EAAE,MAAwB,EAAE,OAAyB,EAAE,KAAoD;QACxI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IACM,KAAK,CAAC,KAAK,CAAC,KAAa;QAC9B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;IACM,KAAK,CAAC,GAAG,CAAC,YAAqB,EAAE,aAAsB,EAAE,KAAa;QAC3E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChG,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IACM,KAAK,CAAC,MAAM,CAAC,YAAqB,EAAE,aAAsB,EAAE,KAAa;QAC9E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChG,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IACM,KAAK,CAAC,OAAO,CAAC,YAAqB,EAAE,aAAsB,EAAE,KAAa;QAC/E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChG,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { Id64, Id64Arg, Id64Array, IDisposable, using } from \"@itwin/core-bentley\";\r\nimport { IModelConnection, SelectionSetEvent, SelectionSetEventType } from \"@itwin/core-frontend\";\r\nimport { AsyncTasksTracker, Keys, KeySet, SelectionScope, SelectionScopeProps } from \"@itwin/presentation-common\";\r\nimport { HiliteSet, HiliteSetProvider } from \"./HiliteSetProvider\";\r\nimport { ISelectionProvider } from \"./ISelectionProvider\";\r\nimport { SelectionChangeEvent, SelectionChangeEventArgs, SelectionChangeType } from \"./SelectionChangeEvent\";\r\nimport { createSelectionScopeProps, SelectionScopesManager } from \"./SelectionScopesManager\";\r\n\r\n/**\r\n * Properties for creating [[SelectionManager]].\r\n * @public\r\n */\r\nexport interface SelectionManagerProps {\r\n /** A manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\r\n scopes: SelectionScopesManager;\r\n}\r\n\r\n/**\r\n * The selection manager which stores the overall selection.\r\n * @public\r\n */\r\nexport class SelectionManager implements ISelectionProvider {\r\n private _selectionContainerMap = new Map<IModelConnection, SelectionContainer>();\r\n private _imodelToolSelectionSyncHandlers = new Map<IModelConnection, { requestorsCount: number, handler: ToolSelectionSyncHandler }>();\r\n private _hiliteSetProviders = new Map<IModelConnection, HiliteSetProvider>();\r\n\r\n /** An event which gets broadcasted on selection changes */\r\n public readonly selectionChange: SelectionChangeEvent;\r\n\r\n /** Manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\r\n public readonly scopes: SelectionScopesManager;\r\n\r\n /**\r\n * Creates an instance of SelectionManager.\r\n */\r\n constructor(props: SelectionManagerProps) {\r\n this.selectionChange = new SelectionChangeEvent();\r\n this.scopes = props.scopes;\r\n IModelConnection.onClose.addListener((imodel: IModelConnection) => {\r\n this.onConnectionClose(imodel);\r\n });\r\n }\r\n\r\n private onConnectionClose(imodel: IModelConnection): void {\r\n this.clearSelection(\"Connection Close Event\", imodel);\r\n this._selectionContainerMap.delete(imodel);\r\n this._hiliteSetProviders.delete(imodel);\r\n }\r\n\r\n private getContainer(imodel: IModelConnection): SelectionContainer {\r\n let selectionContainer = this._selectionContainerMap.get(imodel);\r\n if (!selectionContainer) {\r\n selectionContainer = new SelectionContainer();\r\n this._selectionContainerMap.set(imodel, selectionContainer);\r\n }\r\n return selectionContainer;\r\n }\r\n\r\n /** @internal */\r\n // istanbul ignore next\r\n public getToolSelectionSyncHandler(imodel: IModelConnection) { return this._imodelToolSelectionSyncHandlers.get(imodel)?.handler; }\r\n\r\n /**\r\n * Request the manager to sync with imodel's tool selection (see `IModelConnection.selectionSet`).\r\n */\r\n public setSyncWithIModelToolSelection(imodel: IModelConnection, sync = true) {\r\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\r\n if (sync) {\r\n if (!registration || registration.requestorsCount === 0) {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { requestorsCount: 1, handler: new ToolSelectionSyncHandler(imodel, this) });\r\n } else {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount: registration.requestorsCount + 1 });\r\n }\r\n } else {\r\n if (registration && registration.requestorsCount > 0) {\r\n const requestorsCount = registration.requestorsCount - 1;\r\n if (requestorsCount > 0) {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount });\r\n } else {\r\n this._imodelToolSelectionSyncHandlers.delete(imodel);\r\n registration.handler.dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Temporarily suspends tool selection synchronization until the returned `IDisposable`\r\n * is disposed.\r\n */\r\n public suspendIModelToolSelectionSync(imodel: IModelConnection): IDisposable {\r\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\r\n if (!registration)\r\n return { dispose: () => { } };\r\n\r\n const wasSuspended = registration.handler.isSuspended;\r\n registration.handler.isSuspended = true;\r\n return { dispose: () => (registration.handler.isSuspended = wasSuspended) };\r\n }\r\n\r\n /** Get the selection levels currently stored in this manager for the specified imodel */\r\n public getSelectionLevels(imodel: IModelConnection): number[] {\r\n return this.getContainer(imodel).getSelectionLevels();\r\n }\r\n\r\n /** Get the selection currently stored in this manager */\r\n public getSelection(imodel: IModelConnection, level: number = 0): Readonly<KeySet> {\r\n return this.getContainer(imodel).getSelection(level);\r\n }\r\n\r\n private handleEvent(evt: SelectionChangeEventArgs): void {\r\n const container = this.getContainer(evt.imodel);\r\n const selectedItemsSet = container.getSelection(evt.level);\r\n const guidBefore = selectedItemsSet.guid;\r\n switch (evt.changeType) {\r\n case SelectionChangeType.Add:\r\n selectedItemsSet.add(evt.keys);\r\n break;\r\n case SelectionChangeType.Remove:\r\n selectedItemsSet.delete(evt.keys);\r\n break;\r\n case SelectionChangeType.Replace:\r\n if (selectedItemsSet.size !== evt.keys.size || !selectedItemsSet.hasAll(evt.keys)) {\r\n // note: the above check is only needed to avoid changing\r\n // guid of the keyset if we're replacing keyset with the same keys\r\n selectedItemsSet.clear().add(evt.keys);\r\n }\r\n break;\r\n case SelectionChangeType.Clear:\r\n selectedItemsSet.clear();\r\n break;\r\n }\r\n\r\n if (selectedItemsSet.guid === guidBefore)\r\n return;\r\n\r\n container.clear(evt.level + 1);\r\n this.selectionChange.raiseEvent(evt, this);\r\n }\r\n\r\n /**\r\n * Add keys to the selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to add\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public addToSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Add,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Remove keys from current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to remove\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public removeFromSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Remove,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Replace current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to add\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public replaceSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Replace,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Clear current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public clearSelection(source: string, imodel: IModelConnection, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Clear,\r\n keys: new KeySet(),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Add keys to selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to add\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async addToSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.addToSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Remove keys from current selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to remove\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async removeFromSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.removeFromSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Replace current selection with keys after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to replace with\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async replaceSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.replaceSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Get the current hilite set for the specified imodel\r\n * @public\r\n */\r\n public async getHiliteSet(imodel: IModelConnection): Promise<HiliteSet> {\r\n let provider = this._hiliteSetProviders.get(imodel);\r\n if (!provider) {\r\n provider = HiliteSetProvider.create({ imodel });\r\n this._hiliteSetProviders.set(imodel, provider);\r\n }\r\n return provider.getHiliteSet(this.getSelection(imodel));\r\n }\r\n}\r\n\r\n/** @internal */\r\nclass SelectionContainer {\r\n private readonly _selectedItemsSetMap: Map<number, KeySet>;\r\n\r\n constructor() {\r\n this._selectedItemsSetMap = new Map<number, KeySet>();\r\n }\r\n\r\n public getSelection(level: number): KeySet {\r\n let selectedItemsSet = this._selectedItemsSetMap.get(level);\r\n if (!selectedItemsSet) {\r\n selectedItemsSet = new KeySet();\r\n this._selectedItemsSetMap.set(level, selectedItemsSet);\r\n }\r\n return selectedItemsSet;\r\n }\r\n\r\n public getSelectionLevels(): number[] {\r\n const levels = new Array<number>();\r\n for (const entry of this._selectedItemsSetMap.entries()) {\r\n if (!entry[1].isEmpty)\r\n levels.push(entry[0]);\r\n }\r\n return levels.sort();\r\n }\r\n\r\n public clear(level: number) {\r\n const keys = this._selectedItemsSetMap.keys();\r\n for (const key of keys) {\r\n if (key >= level) {\r\n const selectedItemsSet = this._selectedItemsSetMap.get(key)!;\r\n selectedItemsSet.clear();\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport const TRANSIENT_ELEMENT_CLASSNAME = \"/TRANSIENT\";\r\n\r\n/** @internal */\r\nexport class ToolSelectionSyncHandler implements IDisposable {\r\n\r\n private _selectionSourceName = \"Tool\";\r\n private _logicalSelection: SelectionManager;\r\n private _imodel: IModelConnection;\r\n private _imodelToolSelectionListenerDisposeFunc: () => void;\r\n private _asyncsTracker = new AsyncTasksTracker();\r\n public isSuspended?: boolean;\r\n\r\n public constructor(imodel: IModelConnection, logicalSelection: SelectionManager) {\r\n this._imodel = imodel;\r\n this._logicalSelection = logicalSelection;\r\n this._imodelToolSelectionListenerDisposeFunc = imodel.selectionSet.onChanged.addListener(this.onToolSelectionChanged);\r\n }\r\n\r\n public dispose() {\r\n this._imodelToolSelectionListenerDisposeFunc();\r\n }\r\n\r\n /** note: used only it tests */\r\n public get pendingAsyncs() { return this._asyncsTracker.pendingAsyncs; }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onToolSelectionChanged = async (ev: SelectionSetEvent): Promise<void> => {\r\n // ignore selection change event if the handler is suspended\r\n if (this.isSuspended)\r\n return;\r\n\r\n // this component only cares about its own imodel\r\n const imodel = ev.set.iModel;\r\n if (imodel !== this._imodel)\r\n return;\r\n\r\n // determine the level of selection changes\r\n // wip: may want to allow selecting at different levels?\r\n const selectionLevel = 0;\r\n\r\n let ids: Id64Arg;\r\n switch (ev.type) {\r\n case SelectionSetEventType.Add:\r\n ids = ev.added;\r\n break;\r\n case SelectionSetEventType.Replace:\r\n ids = ev.set.elements;\r\n break;\r\n default:\r\n ids = ev.removed;\r\n break;\r\n }\r\n\r\n // we're always using scoped selection changer even if the scope is set to \"element\" - that\r\n // makes sure we're adding to selection keys with concrete classes and not \"BisCore:Element\", which\r\n // we can't because otherwise our keys compare fails (presentation components load data with\r\n // concrete classes)\r\n const changer = new ScopedSelectionChanger(this._selectionSourceName, this._imodel, this._logicalSelection, createSelectionScopeProps(this._logicalSelection.scopes.activeScope));\r\n\r\n // we know what to do immediately on `clear` events\r\n if (SelectionSetEventType.Clear === ev.type) {\r\n await changer.clear(selectionLevel);\r\n return;\r\n }\r\n\r\n const parsedIds = parseIds(ids);\r\n await using(this._asyncsTracker.trackAsyncTask(), async (_r) => {\r\n switch (ev.type) {\r\n case SelectionSetEventType.Add:\r\n await changer.add(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n case SelectionSetEventType.Replace:\r\n await changer.replace(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n case SelectionSetEventType.Remove:\r\n await changer.remove(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n }\r\n });\r\n };\r\n}\r\n\r\nconst parseIds = (ids: Id64Arg): { persistent: Id64Arg, transient: Id64Arg } => {\r\n let allPersistent = true;\r\n let allTransient = true;\r\n for (const id of Id64.iterable(ids)) {\r\n if (Id64.isTransient(id))\r\n allPersistent = false;\r\n else\r\n allTransient = false;\r\n\r\n if (!allPersistent && !allTransient)\r\n break;\r\n }\r\n\r\n // avoid making a copy if ids are only persistent or only transient\r\n if (allPersistent) {\r\n return { persistent: ids, transient: [] };\r\n } else if (allTransient) {\r\n return { persistent: [], transient: ids };\r\n }\r\n\r\n // if `ids` contain mixed ids, we have to copy.. use Array instead of\r\n // a Set for performance\r\n const persistentElementIds: Id64Array = [];\r\n const transientElementIds: Id64Array = [];\r\n for (const id of Id64.iterable(ids)) {\r\n if (Id64.isTransient(id))\r\n transientElementIds.push(id);\r\n else\r\n persistentElementIds.push(id);\r\n }\r\n\r\n return { persistent: persistentElementIds, transient: transientElementIds };\r\n};\r\n\r\nfunction addTransientKeys(transientIds: Id64Arg, keys: KeySet): void {\r\n for (const id of Id64.iterable(transientIds))\r\n keys.add({ className: TRANSIENT_ELEMENT_CLASSNAME, id });\r\n}\r\n\r\n/** @internal */\r\nclass ScopedSelectionChanger {\r\n public readonly name: string;\r\n public readonly imodel: IModelConnection;\r\n public readonly manager: SelectionManager;\r\n public readonly scope: SelectionScopeProps | SelectionScope | string;\r\n public constructor(name: string, imodel: IModelConnection, manager: SelectionManager, scope: SelectionScopeProps | SelectionScope | string) {\r\n this.name = name;\r\n this.imodel = imodel;\r\n this.manager = manager;\r\n this.scope = scope;\r\n }\r\n public async clear(level: number): Promise<void> {\r\n this.manager.clearSelection(this.name, this.imodel, level);\r\n }\r\n public async add(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.addToSelection(this.name, this.imodel, keys, level);\r\n }\r\n public async remove(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.removeFromSelection(this.name, this.imodel, keys, level);\r\n }\r\n public async replace(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.replaceSelection(this.name, this.imodel, keys, level);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SelectionManager.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { Id64, Id64Arg, Id64Array, IDisposable, using } from \"@itwin/core-bentley\";\r\nimport { IModelConnection, SelectionSetEvent, SelectionSetEventType } from \"@itwin/core-frontend\";\r\nimport { AsyncTasksTracker, Keys, KeySet, SelectionScope, SelectionScopeProps } from \"@itwin/presentation-common\";\r\nimport { HiliteSet, HiliteSetProvider } from \"./HiliteSetProvider\";\r\nimport { ISelectionProvider } from \"./ISelectionProvider\";\r\nimport { SelectionChangeEvent, SelectionChangeEventArgs, SelectionChangeType } from \"./SelectionChangeEvent\";\r\nimport { createSelectionScopeProps, SelectionScopesManager } from \"./SelectionScopesManager\";\r\n\r\n/**\r\n * Properties for creating [[SelectionManager]].\r\n * @public\r\n */\r\nexport interface SelectionManagerProps {\r\n /** A manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\r\n scopes: SelectionScopesManager;\r\n}\r\n\r\n/**\r\n * The selection manager which stores the overall selection.\r\n * @public\r\n */\r\nexport class SelectionManager implements ISelectionProvider {\r\n private _selectionContainerMap = new Map<IModelConnection, SelectionContainer>();\r\n private _imodelToolSelectionSyncHandlers = new Map<IModelConnection, { requestorsCount: number, handler: ToolSelectionSyncHandler }>();\r\n private _hiliteSetProviders = new Map<IModelConnection, HiliteSetProvider>();\r\n\r\n /** An event which gets broadcasted on selection changes */\r\n public readonly selectionChange: SelectionChangeEvent;\r\n\r\n /** Manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\r\n public readonly scopes: SelectionScopesManager;\r\n\r\n /**\r\n * Creates an instance of SelectionManager.\r\n */\r\n constructor(props: SelectionManagerProps) {\r\n this.selectionChange = new SelectionChangeEvent();\r\n this.scopes = props.scopes;\r\n IModelConnection.onClose.addListener((imodel: IModelConnection) => {\r\n this.onConnectionClose(imodel);\r\n });\r\n }\r\n\r\n private onConnectionClose(imodel: IModelConnection): void {\r\n this.clearSelection(\"Connection Close Event\", imodel);\r\n this._selectionContainerMap.delete(imodel);\r\n this._hiliteSetProviders.delete(imodel);\r\n }\r\n\r\n private getContainer(imodel: IModelConnection): SelectionContainer {\r\n let selectionContainer = this._selectionContainerMap.get(imodel);\r\n if (!selectionContainer) {\r\n selectionContainer = new SelectionContainer();\r\n this._selectionContainerMap.set(imodel, selectionContainer);\r\n }\r\n return selectionContainer;\r\n }\r\n\r\n /** @internal */\r\n // istanbul ignore next\r\n public getToolSelectionSyncHandler(imodel: IModelConnection) { return this._imodelToolSelectionSyncHandlers.get(imodel)?.handler; }\r\n\r\n /**\r\n * Request the manager to sync with imodel's tool selection (see `IModelConnection.selectionSet`).\r\n */\r\n public setSyncWithIModelToolSelection(imodel: IModelConnection, sync = true) {\r\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\r\n if (sync) {\r\n if (!registration || registration.requestorsCount === 0) {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { requestorsCount: 1, handler: new ToolSelectionSyncHandler(imodel, this) });\r\n } else {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount: registration.requestorsCount + 1 });\r\n }\r\n } else {\r\n if (registration && registration.requestorsCount > 0) {\r\n const requestorsCount = registration.requestorsCount - 1;\r\n if (requestorsCount > 0) {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount });\r\n } else {\r\n this._imodelToolSelectionSyncHandlers.delete(imodel);\r\n registration.handler.dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Temporarily suspends tool selection synchronization until the returned `IDisposable`\r\n * is disposed.\r\n */\r\n public suspendIModelToolSelectionSync(imodel: IModelConnection): IDisposable {\r\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\r\n if (!registration)\r\n return { dispose: () => { } };\r\n\r\n const wasSuspended = registration.handler.isSuspended;\r\n registration.handler.isSuspended = true;\r\n return { dispose: () => (registration.handler.isSuspended = wasSuspended) };\r\n }\r\n\r\n /** Get the selection levels currently stored in this manager for the specified imodel */\r\n public getSelectionLevels(imodel: IModelConnection): number[] {\r\n return this.getContainer(imodel).getSelectionLevels();\r\n }\r\n\r\n /** Get the selection currently stored in this manager */\r\n public getSelection(imodel: IModelConnection, level: number = 0): Readonly<KeySet> {\r\n return this.getContainer(imodel).getSelection(level);\r\n }\r\n\r\n private handleEvent(evt: SelectionChangeEventArgs): void {\r\n const container = this.getContainer(evt.imodel);\r\n const selectedItemsSet = container.getSelection(evt.level);\r\n const guidBefore = selectedItemsSet.guid;\r\n switch (evt.changeType) {\r\n case SelectionChangeType.Add:\r\n selectedItemsSet.add(evt.keys);\r\n break;\r\n case SelectionChangeType.Remove:\r\n selectedItemsSet.delete(evt.keys);\r\n break;\r\n case SelectionChangeType.Replace:\r\n if (selectedItemsSet.size !== evt.keys.size || !selectedItemsSet.hasAll(evt.keys)) {\r\n // note: the above check is only needed to avoid changing\r\n // guid of the keyset if we're replacing keyset with the same keys\r\n selectedItemsSet.clear().add(evt.keys);\r\n }\r\n break;\r\n case SelectionChangeType.Clear:\r\n selectedItemsSet.clear();\r\n break;\r\n }\r\n\r\n if (selectedItemsSet.guid === guidBefore)\r\n return;\r\n\r\n container.clear(evt.level + 1);\r\n this.selectionChange.raiseEvent(evt, this);\r\n }\r\n\r\n /**\r\n * Add keys to the selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to add\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public addToSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Add,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Remove keys from current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to remove\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public removeFromSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Remove,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Replace current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to add\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public replaceSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Replace,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Clear current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public clearSelection(source: string, imodel: IModelConnection, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Clear,\r\n keys: new KeySet(),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Add keys to selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to add\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async addToSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.addToSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Remove keys from current selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to remove\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async removeFromSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.removeFromSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Replace current selection with keys after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to replace with\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async replaceSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.replaceSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Get the current hilite set for the specified imodel\r\n * @public\r\n */\r\n public async getHiliteSet(imodel: IModelConnection): Promise<HiliteSet> {\r\n return this.getHiliteSetProvider(imodel).getHiliteSet(this.getSelection(imodel));\r\n }\r\n\r\n /**\r\n * Get the current hilite set iterator for the specified imodel.\r\n * @public\r\n */\r\n public getHiliteSetIterator(imodel: IModelConnection) {\r\n return this.getHiliteSetProvider(imodel).getHiliteSetIterator(this.getSelection(imodel));\r\n }\r\n\r\n private getHiliteSetProvider(imodel: IModelConnection) {\r\n let provider = this._hiliteSetProviders.get(imodel);\r\n if (!provider) {\r\n provider = HiliteSetProvider.create({ imodel });\r\n this._hiliteSetProviders.set(imodel, provider);\r\n }\r\n return provider;\r\n }\r\n}\r\n\r\n/** @internal */\r\nclass SelectionContainer {\r\n private readonly _selectedItemsSetMap: Map<number, KeySet>;\r\n\r\n constructor() {\r\n this._selectedItemsSetMap = new Map<number, KeySet>();\r\n }\r\n\r\n public getSelection(level: number): KeySet {\r\n let selectedItemsSet = this._selectedItemsSetMap.get(level);\r\n if (!selectedItemsSet) {\r\n selectedItemsSet = new KeySet();\r\n this._selectedItemsSetMap.set(level, selectedItemsSet);\r\n }\r\n return selectedItemsSet;\r\n }\r\n\r\n public getSelectionLevels(): number[] {\r\n const levels = new Array<number>();\r\n for (const entry of this._selectedItemsSetMap.entries()) {\r\n if (!entry[1].isEmpty)\r\n levels.push(entry[0]);\r\n }\r\n return levels.sort();\r\n }\r\n\r\n public clear(level: number) {\r\n const keys = this._selectedItemsSetMap.keys();\r\n for (const key of keys) {\r\n if (key >= level) {\r\n const selectedItemsSet = this._selectedItemsSetMap.get(key)!;\r\n selectedItemsSet.clear();\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport const TRANSIENT_ELEMENT_CLASSNAME = \"/TRANSIENT\";\r\n\r\n/** @internal */\r\nexport class ToolSelectionSyncHandler implements IDisposable {\r\n\r\n private _selectionSourceName = \"Tool\";\r\n private _logicalSelection: SelectionManager;\r\n private _imodel: IModelConnection;\r\n private _imodelToolSelectionListenerDisposeFunc: () => void;\r\n private _asyncsTracker = new AsyncTasksTracker();\r\n public isSuspended?: boolean;\r\n\r\n public constructor(imodel: IModelConnection, logicalSelection: SelectionManager) {\r\n this._imodel = imodel;\r\n this._logicalSelection = logicalSelection;\r\n this._imodelToolSelectionListenerDisposeFunc = imodel.selectionSet.onChanged.addListener(this.onToolSelectionChanged);\r\n }\r\n\r\n public dispose() {\r\n this._imodelToolSelectionListenerDisposeFunc();\r\n }\r\n\r\n /** note: used only it tests */\r\n public get pendingAsyncs() { return this._asyncsTracker.pendingAsyncs; }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onToolSelectionChanged = async (ev: SelectionSetEvent): Promise<void> => {\r\n // ignore selection change event if the handler is suspended\r\n if (this.isSuspended)\r\n return;\r\n\r\n // this component only cares about its own imodel\r\n const imodel = ev.set.iModel;\r\n if (imodel !== this._imodel)\r\n return;\r\n\r\n // determine the level of selection changes\r\n // wip: may want to allow selecting at different levels?\r\n const selectionLevel = 0;\r\n\r\n let ids: Id64Arg;\r\n switch (ev.type) {\r\n case SelectionSetEventType.Add:\r\n ids = ev.added;\r\n break;\r\n case SelectionSetEventType.Replace:\r\n ids = ev.set.elements;\r\n break;\r\n default:\r\n ids = ev.removed;\r\n break;\r\n }\r\n\r\n // we're always using scoped selection changer even if the scope is set to \"element\" - that\r\n // makes sure we're adding to selection keys with concrete classes and not \"BisCore:Element\", which\r\n // we can't because otherwise our keys compare fails (presentation components load data with\r\n // concrete classes)\r\n const changer = new ScopedSelectionChanger(this._selectionSourceName, this._imodel, this._logicalSelection, createSelectionScopeProps(this._logicalSelection.scopes.activeScope));\r\n\r\n // we know what to do immediately on `clear` events\r\n if (SelectionSetEventType.Clear === ev.type) {\r\n await changer.clear(selectionLevel);\r\n return;\r\n }\r\n\r\n const parsedIds = parseIds(ids);\r\n await using(this._asyncsTracker.trackAsyncTask(), async (_r) => {\r\n switch (ev.type) {\r\n case SelectionSetEventType.Add:\r\n await changer.add(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n case SelectionSetEventType.Replace:\r\n await changer.replace(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n case SelectionSetEventType.Remove:\r\n await changer.remove(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n }\r\n });\r\n };\r\n}\r\n\r\nconst parseIds = (ids: Id64Arg): { persistent: Id64Arg, transient: Id64Arg } => {\r\n let allPersistent = true;\r\n let allTransient = true;\r\n for (const id of Id64.iterable(ids)) {\r\n if (Id64.isTransient(id))\r\n allPersistent = false;\r\n else\r\n allTransient = false;\r\n\r\n if (!allPersistent && !allTransient)\r\n break;\r\n }\r\n\r\n // avoid making a copy if ids are only persistent or only transient\r\n if (allPersistent) {\r\n return { persistent: ids, transient: [] };\r\n } else if (allTransient) {\r\n return { persistent: [], transient: ids };\r\n }\r\n\r\n // if `ids` contain mixed ids, we have to copy.. use Array instead of\r\n // a Set for performance\r\n const persistentElementIds: Id64Array = [];\r\n const transientElementIds: Id64Array = [];\r\n for (const id of Id64.iterable(ids)) {\r\n if (Id64.isTransient(id))\r\n transientElementIds.push(id);\r\n else\r\n persistentElementIds.push(id);\r\n }\r\n\r\n return { persistent: persistentElementIds, transient: transientElementIds };\r\n};\r\n\r\nfunction addTransientKeys(transientIds: Id64Arg, keys: KeySet): void {\r\n for (const id of Id64.iterable(transientIds))\r\n keys.add({ className: TRANSIENT_ELEMENT_CLASSNAME, id });\r\n}\r\n\r\n/** @internal */\r\nclass ScopedSelectionChanger {\r\n public readonly name: string;\r\n public readonly imodel: IModelConnection;\r\n public readonly manager: SelectionManager;\r\n public readonly scope: SelectionScopeProps | SelectionScope | string;\r\n public constructor(name: string, imodel: IModelConnection, manager: SelectionManager, scope: SelectionScopeProps | SelectionScope | string) {\r\n this.name = name;\r\n this.imodel = imodel;\r\n this.manager = manager;\r\n this.scope = scope;\r\n }\r\n public async clear(level: number): Promise<void> {\r\n this.manager.clearSelection(this.name, this.imodel, level);\r\n }\r\n public async add(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.addToSelection(this.name, this.imodel, keys, level);\r\n }\r\n public async remove(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.removeFromSelection(this.name, this.imodel, keys, level);\r\n }\r\n public async replace(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.replaceSelection(this.name, this.imodel, keys, level);\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/presentation-frontend",
3
- "version": "4.3.0-dev.9",
3
+ "version": "4.3.1",
4
4
  "description": "Frontend of iModel.js Presentation library",
5
5
  "main": "lib/cjs/presentation-frontend.js",
6
6
  "module": "lib/esm/presentation-frontend.js",
@@ -22,13 +22,17 @@
22
22
  "name": "Bentley Systems, Inc.",
23
23
  "url": "http://www.bentley.com"
24
24
  },
25
+ "dependencies": {
26
+ "rxjs": "^7.8.1",
27
+ "rxjs-for-await": "^1.0.0"
28
+ },
25
29
  "peerDependencies": {
26
- "@itwin/core-bentley": "^4.3.0-dev.9",
27
- "@itwin/core-common": "^4.3.0-dev.9",
28
- "@itwin/core-frontend": "^4.3.0-dev.9",
29
- "@itwin/core-quantity": "^4.3.0-dev.9",
30
- "@itwin/ecschema-metadata": "^4.3.0-dev.9",
31
- "@itwin/presentation-common": "^4.3.0-dev.9"
30
+ "@itwin/core-bentley": "^4.3.1",
31
+ "@itwin/core-common": "^4.3.1",
32
+ "@itwin/core-frontend": "^4.3.1",
33
+ "@itwin/core-quantity": "^4.3.1",
34
+ "@itwin/ecschema-metadata": "^4.3.1",
35
+ "@itwin/presentation-common": "^4.3.1"
32
36
  },
33
37
  "devDependencies": {
34
38
  "@itwin/eslint-plugin": "4.0.0-dev.44",
@@ -38,7 +42,6 @@
38
42
  "@types/deep-equal": "^1",
39
43
  "@types/faker": "^4.1.0",
40
44
  "@types/mocha": "^8.2.2",
41
- "@types/node": "18.16.1",
42
45
  "@types/sinon": "^10.0.15",
43
46
  "@types/sinon-chai": "^3.2.0",
44
47
  "chai": "^4.3.10",
@@ -59,14 +62,14 @@
59
62
  "source-map-support": "^0.5.6",
60
63
  "typemoq": "^2.1.0",
61
64
  "typescript": "~5.0.2",
62
- "@itwin/build-tools": "4.3.0-dev.9",
63
- "@itwin/core-bentley": "4.3.0-dev.9",
64
- "@itwin/core-common": "4.3.0-dev.9",
65
- "@itwin/core-i18n": "4.3.0-dev.9",
66
- "@itwin/core-frontend": "4.3.0-dev.9",
67
- "@itwin/core-quantity": "4.3.0-dev.9",
68
- "@itwin/ecschema-metadata": "4.3.0-dev.9",
69
- "@itwin/presentation-common": "4.3.0-dev.9"
65
+ "@itwin/build-tools": "4.3.1",
66
+ "@itwin/core-bentley": "4.3.1",
67
+ "@itwin/core-common": "4.3.1",
68
+ "@itwin/core-frontend": "4.3.1",
69
+ "@itwin/core-i18n": "4.3.1",
70
+ "@itwin/core-quantity": "4.3.1",
71
+ "@itwin/ecschema-metadata": "4.3.1",
72
+ "@itwin/presentation-common": "4.3.1"
70
73
  },
71
74
  "nyc": {
72
75
  "extends": "./node_modules/@itwin/build-tools/.nycrc"