@itwin/presentation-frontend 5.0.0-dev.3 → 5.0.0-dev.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -1
- package/lib/cjs/presentation-frontend/ConnectivityInformationProvider.js.map +1 -1
- package/lib/cjs/presentation-frontend/Diagnostics.js.map +1 -1
- package/lib/cjs/presentation-frontend/FrontendLoggerCategory.js.map +1 -1
- package/lib/cjs/presentation-frontend/IpcRequestsHandler.js.map +1 -1
- package/lib/cjs/presentation-frontend/LocalizationHelper.js.map +1 -1
- package/lib/cjs/presentation-frontend/Presentation.js.map +1 -1
- package/lib/cjs/presentation-frontend/PresentationManager.js.map +1 -1
- package/lib/cjs/presentation-frontend/RulesetManager.js.map +1 -1
- package/lib/cjs/presentation-frontend/RulesetVariablesManager.js.map +1 -1
- package/lib/cjs/presentation-frontend/StreamedResponseGenerator.js.map +1 -1
- package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesManager.js +7 -7
- package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesManager.js.map +1 -1
- package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/ISelectionProvider.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionChangeEvent.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionHandler.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionHelper.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionManager.d.ts +14 -1
- package/lib/cjs/presentation-frontend/selection/SelectionManager.d.ts.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionManager.js +73 -47
- package/lib/cjs/presentation-frontend/selection/SelectionManager.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionScopesManager.js.map +1 -1
- package/lib/cjs/presentation-frontend.js.map +1 -1
- package/lib/esm/presentation-frontend/ConnectivityInformationProvider.js.map +1 -1
- package/lib/esm/presentation-frontend/Diagnostics.js.map +1 -1
- package/lib/esm/presentation-frontend/FrontendLoggerCategory.js.map +1 -1
- package/lib/esm/presentation-frontend/IpcRequestsHandler.js.map +1 -1
- package/lib/esm/presentation-frontend/LocalizationHelper.js.map +1 -1
- package/lib/esm/presentation-frontend/Presentation.js.map +1 -1
- package/lib/esm/presentation-frontend/PresentationManager.js.map +1 -1
- package/lib/esm/presentation-frontend/RulesetManager.js.map +1 -1
- package/lib/esm/presentation-frontend/RulesetVariablesManager.js.map +1 -1
- package/lib/esm/presentation-frontend/StreamedResponseGenerator.js.map +1 -1
- package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesManager.js +7 -7
- package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesManager.js.map +1 -1
- package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/HiliteSetProvider.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/ISelectionProvider.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionChangeEvent.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionHandler.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionHelper.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionManager.d.ts +14 -1
- package/lib/esm/presentation-frontend/selection/SelectionManager.d.ts.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionManager.js +73 -47
- package/lib/esm/presentation-frontend/selection/SelectionManager.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionScopesManager.js.map +1 -1
- package/lib/esm/presentation-frontend.js.map +1 -1
- package/package.json +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionHandler.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\
|
|
1
|
+
{"version":3,"file":"SelectionHandler.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionHandler.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/** @packageDocumentation\n * @module UnifiedSelection\n */\n\nimport { DisposableList, IDisposable } from \"@itwin/core-bentley\";\nimport { IModelConnection } from \"@itwin/core-frontend\";\nimport { Keys, KeySet } from \"@itwin/presentation-common\";\nimport { ISelectionProvider } from \"./ISelectionProvider\";\nimport { SelectionChangeEventArgs, SelectionChangesListener } from \"./SelectionChangeEvent\";\nimport { SelectionManager } from \"./SelectionManager\";\n\n/**\n * Properties for creating a `SelectionHandler` instance.\n * @public\n */\nexport interface SelectionHandlerProps {\n /** SelectionManager used to store overall selection. */\n manager: SelectionManager;\n /** iModel connection the selection changes will be associated with. */\n imodel: IModelConnection;\n /**\n * Name of the selection handler. This is an identifier of what caused the\n * selection to change, set as `SelectionChangeEventArgs.source` when firing\n * selection change events. `SelectionHandler.shouldHandle` uses `name` to filter\n * events that it doesn't need to handle.\n */\n name: string;\n /**\n * ID of presentation ruleset used by the component using this handler. The ID is set as\n * `SelectionChangeEventArgs.rulesetId` when making selection changes and event\n * listeners can use or ignore this information.\n */\n rulesetId?: string;\n /** Callback function called when selection changes. */\n onSelect?: SelectionChangesListener;\n}\n\n/**\n * A class that handles selection changes and helps to change\n * internal the selection state.\n *\n * @public\n */\nexport class SelectionHandler implements IDisposable {\n private _inSelect: boolean;\n private _disposables: DisposableList;\n\n /** Selection manager used by this handler to manage selection */\n public readonly manager: SelectionManager;\n /** Name that's used as `SelectionChangeEventArgs.source` when making selection changes */\n public name: string;\n /** iModel whose selection is being handled */\n public imodel: IModelConnection;\n /**\n * Id of a ruleset selection changes will be associated with.\n * @see `SelectionHandlerProps.rulesetId`\n */\n public rulesetId?: string;\n /** Callback function called when selection changes */\n public onSelect?: SelectionChangesListener;\n\n /**\n * Constructor.\n */\n constructor(props: SelectionHandlerProps) {\n this._inSelect = false;\n this.manager = props.manager;\n this._disposables = new DisposableList();\n this.name = props.name;\n this.rulesetId = props.rulesetId;\n this.imodel = props.imodel;\n this.onSelect = props.onSelect;\n this._disposables.add(this.manager.selectionChange.addListener(this.onSelectionChanged));\n }\n\n /**\n * Destructor. Must be called before disposing this object to make sure it cleans\n * up correctly.\n */\n public dispose(): void {\n this._disposables.dispose();\n }\n\n /**\n * Called when the selection changes. Handles this callback by first checking whether\n * the event should be handled at all (using the `shouldHandle` method) and then calling `onSelect`\n */\n protected onSelectionChanged = (evt: SelectionChangeEventArgs, provider: ISelectionProvider): void => {\n if (!this.onSelect || !this.shouldHandle(evt)) {\n return;\n }\n\n this._inSelect = true;\n this.onSelect(evt, provider);\n this._inSelect = false;\n };\n\n /** Called to check whether the event should be handled by this handler */\n protected shouldHandle(evt: SelectionChangeEventArgs): boolean {\n if (this.name === evt.source) {\n return false;\n }\n return true;\n }\n\n /** Get selection levels for the imodel managed by this handler */\n public getSelectionLevels(): number[] {\n return this.manager.getSelectionLevels(this.imodel);\n }\n\n /**\n * Get selection for the imodel managed by this handler.\n * @param level Level of the selection to get. Defaults to 0.\n */\n public getSelection(level?: number): Readonly<KeySet> {\n return this.manager.getSelection(this.imodel, level);\n }\n\n /**\n * Add to selection.\n * @param keys The keys to add to selection.\n * @param level Level of the selection.\n */\n public addToSelection(keys: Keys, level: number = 0): void {\n if (this._inSelect) {\n return;\n }\n\n return this.manager.addToSelection(this.name, this.imodel, keys, level, this.rulesetId);\n }\n\n /**\n * Remove from selection.\n * @param keys The keys to remove from selection.\n * @param level Level of the selection.\n */\n public removeFromSelection(keys: Keys, level: number = 0): void {\n if (this._inSelect) {\n return;\n }\n\n return this.manager.removeFromSelection(this.name, this.imodel, keys, level, this.rulesetId);\n }\n\n /**\n * Change selection.\n * @param keys The keys indicating the new selection.\n * @param level Level of the selection.\n */\n public replaceSelection(keys: Keys, level: number = 0): void {\n if (this._inSelect) {\n return;\n }\n\n return this.manager.replaceSelection(this.name, this.imodel, keys, level, this.rulesetId);\n }\n\n /**\n * Clear selection.\n * @param level Level of the selection.\n */\n public clearSelection(level: number = 0): void {\n if (this._inSelect) {\n return;\n }\n\n return this.manager.clearSelection(this.name, this.imodel, level, this.rulesetId);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionHelper.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionHelper.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;AAChG;;GAEG;;;AAEH,oEAAgE;AAEhE;;;GAGG;AACH,MAAa,eAAe;IAC1B,uBAAuB;IACvB,gBAAuB,CAAC;IAExB;;;;OAIG;IACI,MAAM,CAAC,mBAAmB,CAAC,IAAoB;QACpD,MAAM,MAAM,GAAG,IAAI,KAAK,EAAO,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;YACxB,IAAI,yBAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,6BAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAxBD,0CAwBC","sourcesContent":["/*---------------------------------------------------------------------------------------------\
|
|
1
|
+
{"version":3,"file":"SelectionHelper.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionHelper.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;AAChG;;GAEG;;;AAEH,oEAAgE;AAEhE;;;GAGG;AACH,MAAa,eAAe;IAC1B,uBAAuB;IACvB,gBAAuB,CAAC;IAExB;;;;OAIG;IACI,MAAM,CAAC,mBAAmB,CAAC,IAAoB;QACpD,MAAM,MAAM,GAAG,IAAI,KAAK,EAAO,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;YACxB,IAAI,yBAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,6BAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAxBD,0CAwBC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module UnifiedSelection\n */\n\nimport { Key, Keys, NodeKey } from \"@itwin/presentation-common\";\n\n/**\n * Helper class for working with selection.\n * @public\n */\nexport class SelectionHelper {\n // istanbul ignore next\n private constructor() {}\n\n /**\n * Re-map the given keyset for selection. This means all instance node keys get converted\n * to instance keys, because in that case we want to select instances instead of nodes. All\n * other types of keys ar left as is.\n */\n public static getKeysForSelection(keys: Readonly<Keys>): Key[] {\n const result = new Array<Key>();\n keys.forEach((key: Key) => {\n if (Key.isNodeKey(key)) {\n if (NodeKey.isInstancesNodeKey(key)) {\n result.push(...key.instanceKeys);\n } else {\n result.push(key);\n }\n } else {\n result.push(key);\n }\n });\n return result;\n }\n}\n"]}
|
|
@@ -21,13 +21,21 @@ export interface SelectionManagerProps {
|
|
|
21
21
|
* and maintains storage.
|
|
22
22
|
*/
|
|
23
23
|
selectionStorage?: SelectionStorage;
|
|
24
|
+
/**
|
|
25
|
+
* An optional function that returns a key for the given iModel. The key is what "glues" iModel selection
|
|
26
|
+
* changes made in `selectionStorage`, where iModels are identified by key, and `SelectionManager`, where
|
|
27
|
+
* iModels are specified as `IModelConnection`.
|
|
28
|
+
*
|
|
29
|
+
* If not provided, [IModelConnection.key]($core-frontend) or [IModelConnection.name]($core-frontend) is used.
|
|
30
|
+
*/
|
|
31
|
+
imodelKeyFactory?: (imodel: IModelConnection) => string;
|
|
24
32
|
}
|
|
25
33
|
/**
|
|
26
34
|
* The selection manager which stores the overall selection.
|
|
27
35
|
* @public
|
|
28
36
|
*/
|
|
29
37
|
export declare class SelectionManager implements ISelectionProvider {
|
|
30
|
-
private
|
|
38
|
+
private _imodelKeyFactory;
|
|
31
39
|
private _imodelToolSelectionSyncHandlers;
|
|
32
40
|
private _hiliteSetProviders;
|
|
33
41
|
private _ownsStorage;
|
|
@@ -36,6 +44,11 @@ export declare class SelectionManager implements ISelectionProvider {
|
|
|
36
44
|
private _selectionChanges;
|
|
37
45
|
private _selectionEventsSubscription;
|
|
38
46
|
private _listeners;
|
|
47
|
+
/**
|
|
48
|
+
* Underlying selection storage used by this selection manager. Ideally, consumers should use
|
|
49
|
+
* the storage directly instead of using this manager to manipulate selection.
|
|
50
|
+
*/
|
|
51
|
+
readonly selectionStorage: SelectionStorage;
|
|
39
52
|
/** An event which gets broadcasted on selection changes */
|
|
40
53
|
readonly selectionChange: SelectionChangeEvent;
|
|
41
54
|
/** Manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionManager.d.ts","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionManager.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAQ,OAAO,EAAa,WAAW,EAAS,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"SelectionManager.d.ts","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
/** @packageDocumentation
|
|
7
7
|
* @module UnifiedSelection
|
|
8
8
|
*/
|
|
9
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
10
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
11
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
12
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
13
|
+
};
|
|
14
|
+
var _ScopedSelectionChanger_instances, _ScopedSelectionChanger_computeSelection;
|
|
9
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
16
|
exports.ToolSelectionSyncHandler = exports.SelectionManager = void 0;
|
|
11
17
|
const rxjs_1 = require("rxjs");
|
|
@@ -28,18 +34,19 @@ class SelectionManager {
|
|
|
28
34
|
constructor(props) {
|
|
29
35
|
this._imodelToolSelectionSyncHandlers = new Map();
|
|
30
36
|
this._hiliteSetProviders = new Map();
|
|
31
|
-
this._knownIModels = new
|
|
37
|
+
this._knownIModels = new Set();
|
|
32
38
|
this._currentSelection = new CurrentSelectionStorage();
|
|
33
39
|
this._selectionChanges = new rxjs_1.Subject();
|
|
34
40
|
this._listeners = [];
|
|
35
41
|
this.selectionChange = new SelectionChangeEvent_1.SelectionChangeEvent();
|
|
36
42
|
this.scopes = props.scopes;
|
|
37
|
-
this.
|
|
43
|
+
this.selectionStorage = props.selectionStorage ?? (0, unified_selection_1.createStorage)();
|
|
44
|
+
this._imodelKeyFactory = props.imodelKeyFactory ?? ((imodel) => (imodel.key.length ? imodel.key : imodel.name));
|
|
38
45
|
this._ownsStorage = props.selectionStorage === undefined;
|
|
39
|
-
this.
|
|
46
|
+
this.selectionStorage.selectionChangeEvent.addListener((args) => this._selectionChanges.next(args));
|
|
40
47
|
this._selectionEventsSubscription = this.streamSelectionEvents();
|
|
41
48
|
this._listeners.push(core_frontend_1.IModelConnection.onOpen.addListener((imodel) => {
|
|
42
|
-
this._knownIModels.
|
|
49
|
+
this._knownIModels.add(imodel);
|
|
43
50
|
}));
|
|
44
51
|
this._listeners.push(core_frontend_1.IModelConnection.onClose.addListener((imodel) => {
|
|
45
52
|
this.onConnectionClose(imodel);
|
|
@@ -50,12 +57,13 @@ class SelectionManager {
|
|
|
50
57
|
this._listeners.forEach((dispose) => dispose());
|
|
51
58
|
}
|
|
52
59
|
onConnectionClose(imodel) {
|
|
60
|
+
const imodelKey = this._imodelKeyFactory(imodel);
|
|
53
61
|
this._hiliteSetProviders.delete(imodel);
|
|
54
|
-
this._knownIModels.delete(imodel
|
|
55
|
-
this._currentSelection.clear(
|
|
62
|
+
this._knownIModels.delete(imodel);
|
|
63
|
+
this._currentSelection.clear(imodelKey);
|
|
56
64
|
if (this._ownsStorage) {
|
|
57
65
|
this.clearSelection("Connection Close Event", imodel);
|
|
58
|
-
this.
|
|
66
|
+
this.selectionStorage.clearStorage({ imodelKey });
|
|
59
67
|
}
|
|
60
68
|
}
|
|
61
69
|
/** @internal */
|
|
@@ -104,7 +112,8 @@ class SelectionManager {
|
|
|
104
112
|
}
|
|
105
113
|
/** Get the selection levels currently stored in this manager for the specified imodel */
|
|
106
114
|
getSelectionLevels(imodel) {
|
|
107
|
-
|
|
115
|
+
const imodelKey = this._imodelKeyFactory(imodel);
|
|
116
|
+
return this.selectionStorage.getSelectionLevels({ imodelKey });
|
|
108
117
|
}
|
|
109
118
|
/**
|
|
110
119
|
* Get the selection currently stored in this manager
|
|
@@ -114,39 +123,39 @@ class SelectionManager {
|
|
|
114
123
|
* latest selection after changes.
|
|
115
124
|
*/
|
|
116
125
|
getSelection(imodel, level = 0) {
|
|
117
|
-
|
|
126
|
+
const imodelKey = this._imodelKeyFactory(imodel);
|
|
127
|
+
return this._currentSelection.getSelection(imodelKey, level);
|
|
118
128
|
}
|
|
119
129
|
handleEvent(evt) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
130
|
+
const imodelKey = this._imodelKeyFactory(evt.imodel);
|
|
131
|
+
this._knownIModels.add(evt.imodel);
|
|
123
132
|
switch (evt.changeType) {
|
|
124
133
|
case SelectionChangeEvent_1.SelectionChangeType.Add:
|
|
125
|
-
this.
|
|
126
|
-
|
|
134
|
+
this.selectionStorage.addToSelection({
|
|
135
|
+
imodelKey,
|
|
127
136
|
source: evt.source,
|
|
128
137
|
level: evt.level,
|
|
129
138
|
selectables: keysToSelectable(evt.imodel, evt.keys),
|
|
130
139
|
});
|
|
131
140
|
break;
|
|
132
141
|
case SelectionChangeEvent_1.SelectionChangeType.Remove:
|
|
133
|
-
this.
|
|
134
|
-
|
|
142
|
+
this.selectionStorage.removeFromSelection({
|
|
143
|
+
imodelKey,
|
|
135
144
|
source: evt.source,
|
|
136
145
|
level: evt.level,
|
|
137
146
|
selectables: keysToSelectable(evt.imodel, evt.keys),
|
|
138
147
|
});
|
|
139
148
|
break;
|
|
140
149
|
case SelectionChangeEvent_1.SelectionChangeType.Replace:
|
|
141
|
-
this.
|
|
142
|
-
|
|
150
|
+
this.selectionStorage.replaceSelection({
|
|
151
|
+
imodelKey,
|
|
143
152
|
source: evt.source,
|
|
144
153
|
level: evt.level,
|
|
145
154
|
selectables: keysToSelectable(evt.imodel, evt.keys),
|
|
146
155
|
});
|
|
147
156
|
break;
|
|
148
157
|
case SelectionChangeEvent_1.SelectionChangeType.Clear:
|
|
149
|
-
this.
|
|
158
|
+
this.selectionStorage.clearSelection({ imodelKey, source: evt.source, level: evt.level });
|
|
150
159
|
break;
|
|
151
160
|
}
|
|
152
161
|
}
|
|
@@ -293,9 +302,9 @@ class SelectionManager {
|
|
|
293
302
|
streamSelectionEvents() {
|
|
294
303
|
return this._selectionChanges
|
|
295
304
|
.pipe((0, rxjs_1.mergeMap)((args) => {
|
|
296
|
-
const currentSelectables = this.
|
|
305
|
+
const currentSelectables = this.selectionStorage.getSelection({ imodelKey: args.imodelKey, level: args.level });
|
|
297
306
|
return this._currentSelection.computeSelection(args.imodelKey, args.level, currentSelectables, args.selectables).pipe((0, rxjs_1.mergeMap)(({ level, changedSelection }) => {
|
|
298
|
-
const imodel = this._knownIModels.
|
|
307
|
+
const imodel = findIModel(this._knownIModels, this._imodelKeyFactory, args.imodelKey);
|
|
299
308
|
// istanbul ignore if
|
|
300
309
|
if (!imodel) {
|
|
301
310
|
return rxjs_1.EMPTY;
|
|
@@ -318,6 +327,14 @@ class SelectionManager {
|
|
|
318
327
|
}
|
|
319
328
|
}
|
|
320
329
|
exports.SelectionManager = SelectionManager;
|
|
330
|
+
function findIModel(set, imodelKeyFactory, key) {
|
|
331
|
+
for (const imodel of set) {
|
|
332
|
+
if (imodelKeyFactory(imodel) === key) {
|
|
333
|
+
return imodel;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
321
338
|
/** @internal */
|
|
322
339
|
class ToolSelectionSyncHandler {
|
|
323
340
|
constructor(imodel, logicalSelection) {
|
|
@@ -339,13 +356,13 @@ class ToolSelectionSyncHandler {
|
|
|
339
356
|
let ids;
|
|
340
357
|
switch (ev.type) {
|
|
341
358
|
case core_frontend_1.SelectionSetEventType.Add:
|
|
342
|
-
ids = ev.
|
|
359
|
+
ids = ev.additions;
|
|
343
360
|
break;
|
|
344
361
|
case core_frontend_1.SelectionSetEventType.Replace:
|
|
345
|
-
ids = ev.set.
|
|
362
|
+
ids = ev.set.active;
|
|
346
363
|
break;
|
|
347
364
|
default:
|
|
348
|
-
ids = ev.
|
|
365
|
+
ids = ev.removals;
|
|
349
366
|
break;
|
|
350
367
|
}
|
|
351
368
|
// we're always using scoped selection changer even if the scope is set to "element" - that
|
|
@@ -353,22 +370,19 @@ class ToolSelectionSyncHandler {
|
|
|
353
370
|
// we can't because otherwise our keys compare fails (presentation components load data with
|
|
354
371
|
// concrete classes)
|
|
355
372
|
const changer = new ScopedSelectionChanger(this._selectionSourceName, this._imodel, this._logicalSelection, (0, SelectionScopesManager_1.createSelectionScopeProps)(this._logicalSelection.scopes.activeScope));
|
|
356
|
-
// we know what to do immediately on `clear` events
|
|
357
|
-
if (core_frontend_1.SelectionSetEventType.Clear === ev.type) {
|
|
358
|
-
await changer.clear(selectionLevel);
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
const parsedIds = parseIds(ids);
|
|
362
373
|
await (0, core_bentley_1.using)(this._asyncsTracker.trackAsyncTask(), async (_r) => {
|
|
363
374
|
switch (ev.type) {
|
|
364
375
|
case core_frontend_1.SelectionSetEventType.Add:
|
|
365
|
-
await changer.add(
|
|
376
|
+
await changer.add(ids, selectionLevel);
|
|
366
377
|
break;
|
|
367
378
|
case core_frontend_1.SelectionSetEventType.Replace:
|
|
368
|
-
await changer.replace(
|
|
379
|
+
await changer.replace(ids, selectionLevel);
|
|
369
380
|
break;
|
|
370
381
|
case core_frontend_1.SelectionSetEventType.Remove:
|
|
371
|
-
await changer.remove(
|
|
382
|
+
await changer.remove(ids, selectionLevel);
|
|
383
|
+
break;
|
|
384
|
+
case core_frontend_1.SelectionSetEventType.Clear:
|
|
385
|
+
await changer.clear(selectionLevel);
|
|
372
386
|
break;
|
|
373
387
|
}
|
|
374
388
|
});
|
|
@@ -386,7 +400,7 @@ class ToolSelectionSyncHandler {
|
|
|
386
400
|
}
|
|
387
401
|
}
|
|
388
402
|
exports.ToolSelectionSyncHandler = ToolSelectionSyncHandler;
|
|
389
|
-
const
|
|
403
|
+
const parseElementIds = (ids) => {
|
|
390
404
|
let allPersistent = true;
|
|
391
405
|
let allTransient = true;
|
|
392
406
|
for (const id of core_bentley_1.Id64.iterable(ids)) {
|
|
@@ -421,14 +435,14 @@ const parseIds = (ids) => {
|
|
|
421
435
|
}
|
|
422
436
|
return { persistent: persistentElementIds, transient: transientElementIds };
|
|
423
437
|
};
|
|
424
|
-
function
|
|
425
|
-
for (const id of core_bentley_1.Id64.iterable(
|
|
426
|
-
|
|
438
|
+
function addKeys(target, className, ids) {
|
|
439
|
+
for (const id of core_bentley_1.Id64.iterable(ids)) {
|
|
440
|
+
target.add({ className, id });
|
|
427
441
|
}
|
|
428
442
|
}
|
|
429
|
-
/** @internal */
|
|
430
443
|
class ScopedSelectionChanger {
|
|
431
444
|
constructor(name, imodel, manager, scope) {
|
|
445
|
+
_ScopedSelectionChanger_instances.add(this);
|
|
432
446
|
this.name = name;
|
|
433
447
|
this.imodel = imodel;
|
|
434
448
|
this.manager = manager;
|
|
@@ -437,22 +451,34 @@ class ScopedSelectionChanger {
|
|
|
437
451
|
async clear(level) {
|
|
438
452
|
this.manager.clearSelection(this.name, this.imodel, level);
|
|
439
453
|
}
|
|
440
|
-
async add(
|
|
441
|
-
const keys = await
|
|
442
|
-
addTransientKeys(transientIds, keys);
|
|
454
|
+
async add(ids, level) {
|
|
455
|
+
const keys = await __classPrivateFieldGet(this, _ScopedSelectionChanger_instances, "m", _ScopedSelectionChanger_computeSelection).call(this, ids);
|
|
443
456
|
this.manager.addToSelection(this.name, this.imodel, keys, level);
|
|
444
457
|
}
|
|
445
|
-
async remove(
|
|
446
|
-
const keys = await
|
|
447
|
-
addTransientKeys(transientIds, keys);
|
|
458
|
+
async remove(ids, level) {
|
|
459
|
+
const keys = await __classPrivateFieldGet(this, _ScopedSelectionChanger_instances, "m", _ScopedSelectionChanger_computeSelection).call(this, ids);
|
|
448
460
|
this.manager.removeFromSelection(this.name, this.imodel, keys, level);
|
|
449
461
|
}
|
|
450
|
-
async replace(
|
|
451
|
-
const keys = await
|
|
452
|
-
addTransientKeys(transientIds, keys);
|
|
462
|
+
async replace(ids, level) {
|
|
463
|
+
const keys = await __classPrivateFieldGet(this, _ScopedSelectionChanger_instances, "m", _ScopedSelectionChanger_computeSelection).call(this, ids);
|
|
453
464
|
this.manager.replaceSelection(this.name, this.imodel, keys, level);
|
|
454
465
|
}
|
|
455
466
|
}
|
|
467
|
+
_ScopedSelectionChanger_instances = new WeakSet(), _ScopedSelectionChanger_computeSelection = async function _ScopedSelectionChanger_computeSelection(ids) {
|
|
468
|
+
let keys = new presentation_common_1.KeySet();
|
|
469
|
+
if (ids.elements) {
|
|
470
|
+
const { persistent, transient } = parseElementIds(ids.elements);
|
|
471
|
+
keys = await this.manager.scopes.computeSelection(this.imodel, persistent, this.scope);
|
|
472
|
+
addKeys(keys, unified_selection_1.TRANSIENT_ELEMENT_CLASSNAME, transient);
|
|
473
|
+
}
|
|
474
|
+
if (ids.models) {
|
|
475
|
+
addKeys(keys, "BisCore.Model", ids.models);
|
|
476
|
+
}
|
|
477
|
+
if (ids.subcategories) {
|
|
478
|
+
addKeys(keys, "BisCore.SubCategory", ids.subcategories);
|
|
479
|
+
}
|
|
480
|
+
return keys;
|
|
481
|
+
};
|
|
456
482
|
/** Stores current selection in `KeySet` format per iModel. */
|
|
457
483
|
class CurrentSelectionStorage {
|
|
458
484
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
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 { defer, EMPTY, mergeMap, Observable, of, Subject, Subscription, takeUntil, tap } from \"rxjs\";\r\nimport { Id64, Id64Arg, Id64Array, IDisposable, using } from \"@itwin/core-bentley\";\r\nimport { IModelConnection, SelectionSetEvent, SelectionSetEventType } from \"@itwin/core-frontend\";\r\nimport { AsyncTasksTracker, BaseNodeKey, InstanceKey, Key, Keys, KeySet, NodeKey, SelectionScope, SelectionScopeProps } from \"@itwin/presentation-common\";\r\nimport {\r\n createStorage,\r\n CustomSelectable,\r\n Selectable,\r\n Selectables,\r\n SelectionStorage,\r\n StorageSelectionChangeEventArgs,\r\n StorageSelectionChangeType,\r\n TRANSIENT_ELEMENT_CLASSNAME,\r\n} from \"@itwin/unified-selection\";\r\nimport { Presentation } from \"../Presentation\";\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 * Custom unified selection storage to be used by [[SelectionManager]]. If not provided [[SelectionManager]] creates\r\n * and maintains storage.\r\n */\r\n selectionStorage?: SelectionStorage;\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 _selectionStorage: SelectionStorage;\r\n private _imodelToolSelectionSyncHandlers = new Map<IModelConnection, { requestorsCount: number; handler: ToolSelectionSyncHandler }>();\r\n private _hiliteSetProviders = new Map<IModelConnection, HiliteSetProvider>();\r\n private _ownsStorage: boolean;\r\n\r\n private _knownIModels = new Map<string, IModelConnection>();\r\n private _currentSelection = new CurrentSelectionStorage();\r\n private _selectionChanges = new Subject<StorageSelectionChangeEventArgs>();\r\n private _selectionEventsSubscription: Subscription;\r\n private _listeners: Array<() => void> = [];\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 this._selectionStorage = props.selectionStorage ?? createStorage();\r\n this._ownsStorage = props.selectionStorage === undefined;\r\n this._selectionStorage.selectionChangeEvent.addListener((args) => this._selectionChanges.next(args));\r\n this._selectionEventsSubscription = this.streamSelectionEvents();\r\n this._listeners.push(\r\n IModelConnection.onOpen.addListener((imodel) => {\r\n this._knownIModels.set(imodel.key, imodel);\r\n }),\r\n );\r\n this._listeners.push(\r\n IModelConnection.onClose.addListener((imodel: IModelConnection) => {\r\n this.onConnectionClose(imodel);\r\n }),\r\n );\r\n }\r\n\r\n public dispose() {\r\n this._selectionEventsSubscription.unsubscribe();\r\n this._listeners.forEach((dispose) => dispose());\r\n }\r\n\r\n private onConnectionClose(imodel: IModelConnection): void {\r\n this._hiliteSetProviders.delete(imodel);\r\n this._knownIModels.delete(imodel.key);\r\n this._currentSelection.clear(imodel.key);\r\n if (this._ownsStorage) {\r\n this.clearSelection(\"Connection Close Event\", imodel);\r\n this._selectionStorage.clearStorage({ iModelKey: imodel.key });\r\n }\r\n }\r\n\r\n /** @internal */\r\n // istanbul ignore next\r\n public getToolSelectionSyncHandler(imodel: IModelConnection) {\r\n return this._imodelToolSelectionSyncHandlers.get(imodel)?.handler;\r\n }\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\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._selectionStorage.getSelectionLevels({ iModelKey: imodel.key });\r\n }\r\n\r\n /**\r\n * Get the selection currently stored in this manager\r\n *\r\n * @note Calling immediately after `add*`|`replace*`|`remove*`|`clear*` method call does not guarantee\r\n * that returned `KeySet` will include latest changes. Listen for `selectionChange` event to get the\r\n * latest selection after changes.\r\n */\r\n public getSelection(imodel: IModelConnection, level: number = 0): Readonly<KeySet> {\r\n return this._currentSelection.getSelection(imodel.key, level);\r\n }\r\n\r\n private handleEvent(evt: SelectionChangeEventArgs): void {\r\n if (!this._knownIModels.has(evt.imodel.key)) {\r\n this._knownIModels.set(evt.imodel.key, evt.imodel);\r\n }\r\n\r\n switch (evt.changeType) {\r\n case SelectionChangeType.Add:\r\n this._selectionStorage.addToSelection({\r\n iModelKey: evt.imodel.key,\r\n source: evt.source,\r\n level: evt.level,\r\n selectables: keysToSelectable(evt.imodel, evt.keys),\r\n });\r\n break;\r\n case SelectionChangeType.Remove:\r\n this._selectionStorage.removeFromSelection({\r\n iModelKey: evt.imodel.key,\r\n source: evt.source,\r\n level: evt.level,\r\n selectables: keysToSelectable(evt.imodel, evt.keys),\r\n });\r\n break;\r\n case SelectionChangeType.Replace:\r\n this._selectionStorage.replaceSelection({\r\n iModelKey: evt.imodel.key,\r\n source: evt.source,\r\n level: evt.level,\r\n selectables: keysToSelectable(evt.imodel, evt.keys),\r\n });\r\n break;\r\n case SelectionChangeType.Clear:\r\n this._selectionStorage.clearSelection({ iModelKey: evt.imodel.key, source: evt.source, level: evt.level });\r\n break;\r\n }\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(\r\n source: string,\r\n imodel: IModelConnection,\r\n ids: Id64Arg,\r\n scope: SelectionScopeProps | SelectionScope | string,\r\n level: number = 0,\r\n rulesetId?: string,\r\n ): 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(\r\n source: string,\r\n imodel: IModelConnection,\r\n ids: Id64Arg,\r\n scope: SelectionScopeProps | SelectionScope | string,\r\n level: number = 0,\r\n rulesetId?: string,\r\n ): 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(\r\n source: string,\r\n imodel: IModelConnection,\r\n ids: Id64Arg,\r\n scope: SelectionScopeProps | SelectionScope | string,\r\n level: number = 0,\r\n rulesetId?: string,\r\n ): 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 private streamSelectionEvents() {\r\n return this._selectionChanges\r\n .pipe(\r\n mergeMap((args) => {\r\n const currentSelectables = this._selectionStorage.getSelection({ iModelKey: args.imodelKey, level: args.level });\r\n return this._currentSelection.computeSelection(args.imodelKey, args.level, currentSelectables, args.selectables).pipe(\r\n mergeMap(({ level, changedSelection }): Observable<SelectionChangeEventArgs> => {\r\n const imodel = this._knownIModels.get(args.imodelKey);\r\n // istanbul ignore if\r\n if (!imodel) {\r\n return EMPTY;\r\n }\r\n return of({\r\n imodel,\r\n keys: changedSelection,\r\n level,\r\n source: args.source,\r\n timestamp: args.timestamp,\r\n changeType: getChangeType(args.changeType),\r\n });\r\n }),\r\n );\r\n }),\r\n )\r\n .subscribe({\r\n next: (args) => {\r\n this.selectionChange.raiseEvent(args, this);\r\n },\r\n });\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class ToolSelectionSyncHandler implements IDisposable {\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() {\r\n return this._asyncsTracker.pendingAsyncs;\r\n }\r\n\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\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\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(\r\n this._selectionSourceName,\r\n this._imodel,\r\n this._logicalSelection,\r\n createSelectionScopeProps(this._logicalSelection.scopes.activeScope),\r\n );\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\r\n if (!allPersistent && !allTransient) {\r\n break;\r\n }\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\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\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\r\n/** Stores current selection in `KeySet` format per iModel. */\r\nclass CurrentSelectionStorage {\r\n private _currentSelection = new Map<string, IModelSelectionStorage>();\r\n\r\n private getCurrentSelectionStorage(imodelKey: string) {\r\n let storage = this._currentSelection.get(imodelKey);\r\n if (!storage) {\r\n storage = new IModelSelectionStorage();\r\n this._currentSelection.set(imodelKey, storage);\r\n }\r\n return storage;\r\n }\r\n\r\n public getSelection(imodelKey: string, level: number) {\r\n return this.getCurrentSelectionStorage(imodelKey).getSelection(level);\r\n }\r\n\r\n public clear(imodelKey: string) {\r\n this._currentSelection.delete(imodelKey);\r\n }\r\n\r\n public computeSelection(imodelKey: string, level: number, currSelectables: Selectables, changedSelectables: Selectables) {\r\n return this.getCurrentSelectionStorage(imodelKey).computeSelection(level, currSelectables, changedSelectables);\r\n }\r\n}\r\n\r\ninterface StorageEntry {\r\n value: KeySet;\r\n ongoingComputationDisposers: Set<Subject<void>>;\r\n}\r\n\r\n/**\r\n * Computes and stores current selection in `KeySet` format.\r\n * It always stores result of latest resolved call to `computeSelection`.\r\n */\r\nclass IModelSelectionStorage {\r\n private _currentSelection = new Map<number, StorageEntry>();\r\n\r\n public getSelection(level: number): KeySet {\r\n let entry = this._currentSelection.get(level);\r\n if (!entry) {\r\n entry = { value: new KeySet(), ongoingComputationDisposers: new Set() };\r\n this._currentSelection.set(level, entry);\r\n }\r\n return entry.value;\r\n }\r\n\r\n private clearSelections(level: number) {\r\n const clearedLevels = [];\r\n for (const [storedLevel] of this._currentSelection.entries()) {\r\n if (storedLevel > level) {\r\n clearedLevels.push(storedLevel);\r\n }\r\n }\r\n clearedLevels.forEach((storedLevel) => {\r\n const entry = this._currentSelection.get(storedLevel);\r\n // istanbul ignore if\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n for (const disposer of entry.ongoingComputationDisposers) {\r\n disposer.next();\r\n }\r\n this._currentSelection.delete(storedLevel);\r\n });\r\n }\r\n\r\n private addDisposer(level: number, disposer: Subject<void>) {\r\n const entry = this._currentSelection.get(level);\r\n if (!entry) {\r\n this._currentSelection.set(level, { value: new KeySet(), ongoingComputationDisposers: new Set([disposer]) });\r\n return;\r\n }\r\n entry.ongoingComputationDisposers.add(disposer);\r\n }\r\n\r\n private setSelection(level: number, keys: KeySet, disposer: Subject<void>) {\r\n const currEntry = this._currentSelection.get(level);\r\n // istanbul ignore else\r\n if (currEntry) {\r\n currEntry.ongoingComputationDisposers.delete(disposer);\r\n }\r\n this._currentSelection.set(level, {\r\n value: keys,\r\n ongoingComputationDisposers: currEntry?.ongoingComputationDisposers ?? /* istanbul ignore next */ new Set(),\r\n });\r\n }\r\n\r\n public computeSelection(level: number, currSelectables: Selectables, changedSelectables: Selectables) {\r\n this.clearSelections(level);\r\n\r\n const prevComputationsDisposers = [...(this._currentSelection.get(level)?.ongoingComputationDisposers ?? [])];\r\n const currDisposer = new Subject<void>();\r\n this.addDisposer(level, currDisposer);\r\n\r\n return defer(async () => {\r\n const convertedSelectables: SelectableKeys[] = [];\r\n const [current, changed] = await Promise.all([\r\n selectablesToKeys(currSelectables, convertedSelectables),\r\n selectablesToKeys(changedSelectables, convertedSelectables),\r\n ]);\r\n\r\n const currentSelection = new KeySet([...current.keys, ...current.selectableKeys.flatMap((selectable) => selectable.keys)]);\r\n const changedSelection = new KeySet([...changed.keys, ...changed.selectableKeys.flatMap((selectable) => selectable.keys)]);\r\n\r\n return {\r\n level,\r\n currentSelection,\r\n changedSelection,\r\n };\r\n }).pipe(\r\n takeUntil(currDisposer),\r\n tap({\r\n next: (val) => {\r\n prevComputationsDisposers.forEach((disposer) => disposer.next());\r\n this.setSelection(val.level, val.currentSelection, currDisposer);\r\n },\r\n }),\r\n );\r\n }\r\n}\r\n\r\nfunction keysToSelectable(imodel: IModelConnection, keys: Readonly<KeySet>) {\r\n const selectables: Selectable[] = [];\r\n keys.forEach((key) => {\r\n if (\"id\" in key) {\r\n selectables.push(key);\r\n return;\r\n }\r\n\r\n const customSelectable: CustomSelectable = {\r\n identifier: key.pathFromRoot.join(\"/\"),\r\n data: key,\r\n loadInstanceKeys: () => createInstanceKeysIterator(imodel, key),\r\n };\r\n selectables.push(customSelectable);\r\n });\r\n return selectables;\r\n}\r\n\r\ninterface SelectableKeys {\r\n identifier: string;\r\n keys: Key[];\r\n}\r\n\r\nasync function selectablesToKeys(selectables: Selectables, convertedList: SelectableKeys[]) {\r\n const keys: Key[] = [];\r\n const selectableKeys: SelectableKeys[] = [];\r\n\r\n for (const [className, ids] of selectables.instanceKeys) {\r\n for (const id of ids) {\r\n keys.push({ id, className });\r\n }\r\n }\r\n\r\n for (const [_, selectable] of selectables.custom) {\r\n if (isNodeKey(selectable.data)) {\r\n selectableKeys.push({ identifier: selectable.identifier, keys: [selectable.data] });\r\n continue;\r\n }\r\n const converted = convertedList.find((con) => con.identifier === selectable.identifier);\r\n if (converted) {\r\n selectableKeys.push(converted);\r\n continue;\r\n }\r\n\r\n const newConverted: SelectableKeys = { identifier: selectable.identifier, keys: [] };\r\n convertedList.push(newConverted);\r\n for await (const instanceKey of selectable.loadInstanceKeys()) {\r\n newConverted.keys.push(instanceKey);\r\n }\r\n selectableKeys.push(newConverted);\r\n }\r\n\r\n return { keys, selectableKeys };\r\n}\r\n\r\nasync function* createInstanceKeysIterator(imodel: IModelConnection, nodeKey: NodeKey): AsyncIterableIterator<InstanceKey> {\r\n if (NodeKey.isInstancesNodeKey(nodeKey)) {\r\n for (const key of nodeKey.instanceKeys) {\r\n yield key;\r\n }\r\n return;\r\n }\r\n\r\n const content = await Presentation.presentation.getContentInstanceKeys({\r\n imodel,\r\n keys: new KeySet([nodeKey]),\r\n rulesetOrId: {\r\n id: \"grouped-instances\",\r\n rules: [\r\n {\r\n ruleType: \"Content\",\r\n specifications: [\r\n {\r\n specType: \"SelectedNodeInstances\",\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n });\r\n\r\n for await (const key of content.items()) {\r\n yield key;\r\n }\r\n}\r\n\r\nfunction isNodeKey(data: unknown): data is NodeKey {\r\n const key = data as BaseNodeKey;\r\n return key.pathFromRoot !== undefined && key.type !== undefined;\r\n}\r\n\r\nfunction getChangeType(type: StorageSelectionChangeType): SelectionChangeType {\r\n switch (type) {\r\n case \"add\":\r\n return SelectionChangeType.Add;\r\n case \"remove\":\r\n return SelectionChangeType.Remove;\r\n case \"replace\":\r\n return SelectionChangeType.Replace;\r\n case \"clear\":\r\n return SelectionChangeType.Clear;\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":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module UnifiedSelection\n */\n\nimport { defer, EMPTY, mergeMap, Observable, of, Subject, Subscription, takeUntil, tap } from \"rxjs\";\nimport { Id64, Id64Arg, Id64Array, IDisposable, using } from \"@itwin/core-bentley\";\nimport { IModelConnection, SelectableIds, SelectionSetEvent, SelectionSetEventType } from \"@itwin/core-frontend\";\nimport { AsyncTasksTracker, BaseNodeKey, InstanceKey, Key, Keys, KeySet, NodeKey, SelectionScope, SelectionScopeProps } from \"@itwin/presentation-common\";\nimport {\n createStorage,\n CustomSelectable,\n Selectable,\n Selectables,\n SelectionStorage,\n StorageSelectionChangeEventArgs,\n StorageSelectionChangeType,\n TRANSIENT_ELEMENT_CLASSNAME,\n} from \"@itwin/unified-selection\";\nimport { Presentation } from \"../Presentation\";\nimport { HiliteSet, HiliteSetProvider } from \"./HiliteSetProvider\";\nimport { ISelectionProvider } from \"./ISelectionProvider\";\nimport { SelectionChangeEvent, SelectionChangeEventArgs, SelectionChangeType } from \"./SelectionChangeEvent\";\nimport { createSelectionScopeProps, SelectionScopesManager } from \"./SelectionScopesManager\";\n\n/**\n * Properties for creating [[SelectionManager]].\n * @public\n */\nexport interface SelectionManagerProps {\n /** A manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\n scopes: SelectionScopesManager;\n\n /**\n * Custom unified selection storage to be used by [[SelectionManager]]. If not provided [[SelectionManager]] creates\n * and maintains storage.\n */\n selectionStorage?: SelectionStorage;\n\n /**\n * An optional function that returns a key for the given iModel. The key is what \"glues\" iModel selection\n * changes made in `selectionStorage`, where iModels are identified by key, and `SelectionManager`, where\n * iModels are specified as `IModelConnection`.\n *\n * If not provided, [IModelConnection.key]($core-frontend) or [IModelConnection.name]($core-frontend) is used.\n */\n imodelKeyFactory?: (imodel: IModelConnection) => string;\n}\n\n/**\n * The selection manager which stores the overall selection.\n * @public\n */\nexport class SelectionManager implements ISelectionProvider {\n private _imodelKeyFactory: (imodel: IModelConnection) => string;\n private _imodelToolSelectionSyncHandlers = new Map<IModelConnection, { requestorsCount: number; handler: ToolSelectionSyncHandler }>();\n private _hiliteSetProviders = new Map<IModelConnection, HiliteSetProvider>();\n private _ownsStorage: boolean;\n\n private _knownIModels = new Set<IModelConnection>();\n private _currentSelection = new CurrentSelectionStorage();\n private _selectionChanges = new Subject<StorageSelectionChangeEventArgs>();\n private _selectionEventsSubscription: Subscription;\n private _listeners: Array<() => void> = [];\n\n /**\n * Underlying selection storage used by this selection manager. Ideally, consumers should use\n * the storage directly instead of using this manager to manipulate selection.\n */\n public readonly selectionStorage: SelectionStorage;\n\n /** An event which gets broadcasted on selection changes */\n public readonly selectionChange: SelectionChangeEvent;\n\n /** Manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\n public readonly scopes: SelectionScopesManager;\n\n /**\n * Creates an instance of SelectionManager.\n */\n constructor(props: SelectionManagerProps) {\n this.selectionChange = new SelectionChangeEvent();\n this.scopes = props.scopes;\n this.selectionStorage = props.selectionStorage ?? createStorage();\n this._imodelKeyFactory = props.imodelKeyFactory ?? ((imodel) => (imodel.key.length ? imodel.key : imodel.name));\n this._ownsStorage = props.selectionStorage === undefined;\n this.selectionStorage.selectionChangeEvent.addListener((args) => this._selectionChanges.next(args));\n this._selectionEventsSubscription = this.streamSelectionEvents();\n this._listeners.push(\n IModelConnection.onOpen.addListener((imodel) => {\n this._knownIModels.add(imodel);\n }),\n );\n this._listeners.push(\n IModelConnection.onClose.addListener((imodel: IModelConnection) => {\n this.onConnectionClose(imodel);\n }),\n );\n }\n\n public dispose() {\n this._selectionEventsSubscription.unsubscribe();\n this._listeners.forEach((dispose) => dispose());\n }\n\n private onConnectionClose(imodel: IModelConnection): void {\n const imodelKey = this._imodelKeyFactory(imodel);\n this._hiliteSetProviders.delete(imodel);\n this._knownIModels.delete(imodel);\n this._currentSelection.clear(imodelKey);\n if (this._ownsStorage) {\n this.clearSelection(\"Connection Close Event\", imodel);\n this.selectionStorage.clearStorage({ imodelKey });\n }\n }\n\n /** @internal */\n // istanbul ignore next\n public getToolSelectionSyncHandler(imodel: IModelConnection) {\n return this._imodelToolSelectionSyncHandlers.get(imodel)?.handler;\n }\n\n /**\n * Request the manager to sync with imodel's tool selection (see `IModelConnection.selectionSet`).\n */\n public setSyncWithIModelToolSelection(imodel: IModelConnection, sync = true) {\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\n if (sync) {\n if (!registration || registration.requestorsCount === 0) {\n this._imodelToolSelectionSyncHandlers.set(imodel, { requestorsCount: 1, handler: new ToolSelectionSyncHandler(imodel, this) });\n } else {\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount: registration.requestorsCount + 1 });\n }\n } else {\n if (registration && registration.requestorsCount > 0) {\n const requestorsCount = registration.requestorsCount - 1;\n if (requestorsCount > 0) {\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount });\n } else {\n this._imodelToolSelectionSyncHandlers.delete(imodel);\n registration.handler.dispose();\n }\n }\n }\n }\n\n /**\n * Temporarily suspends tool selection synchronization until the returned `IDisposable`\n * is disposed.\n */\n public suspendIModelToolSelectionSync(imodel: IModelConnection): IDisposable {\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\n if (!registration) {\n return { dispose: () => {} };\n }\n\n const wasSuspended = registration.handler.isSuspended;\n registration.handler.isSuspended = true;\n return { dispose: () => (registration.handler.isSuspended = wasSuspended) };\n }\n\n /** Get the selection levels currently stored in this manager for the specified imodel */\n public getSelectionLevels(imodel: IModelConnection): number[] {\n const imodelKey = this._imodelKeyFactory(imodel);\n return this.selectionStorage.getSelectionLevels({ imodelKey });\n }\n\n /**\n * Get the selection currently stored in this manager\n *\n * @note Calling immediately after `add*`|`replace*`|`remove*`|`clear*` method call does not guarantee\n * that returned `KeySet` will include latest changes. Listen for `selectionChange` event to get the\n * latest selection after changes.\n */\n public getSelection(imodel: IModelConnection, level: number = 0): Readonly<KeySet> {\n const imodelKey = this._imodelKeyFactory(imodel);\n return this._currentSelection.getSelection(imodelKey, level);\n }\n\n private handleEvent(evt: SelectionChangeEventArgs): void {\n const imodelKey = this._imodelKeyFactory(evt.imodel);\n this._knownIModels.add(evt.imodel);\n switch (evt.changeType) {\n case SelectionChangeType.Add:\n this.selectionStorage.addToSelection({\n imodelKey,\n source: evt.source,\n level: evt.level,\n selectables: keysToSelectable(evt.imodel, evt.keys),\n });\n break;\n case SelectionChangeType.Remove:\n this.selectionStorage.removeFromSelection({\n imodelKey,\n source: evt.source,\n level: evt.level,\n selectables: keysToSelectable(evt.imodel, evt.keys),\n });\n break;\n case SelectionChangeType.Replace:\n this.selectionStorage.replaceSelection({\n imodelKey,\n source: evt.source,\n level: evt.level,\n selectables: keysToSelectable(evt.imodel, evt.keys),\n });\n break;\n case SelectionChangeType.Clear:\n this.selectionStorage.clearSelection({ imodelKey, source: evt.source, level: evt.level });\n break;\n }\n }\n\n /**\n * Add keys to the selection\n * @param source Name of the selection source\n * @param imodel iModel associated with the selection\n * @param keys Keys to add\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\n */\n public addToSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\n const evt: SelectionChangeEventArgs = {\n source,\n level,\n imodel,\n changeType: SelectionChangeType.Add,\n keys: new KeySet(keys),\n timestamp: new Date(),\n rulesetId,\n };\n this.handleEvent(evt);\n }\n\n /**\n * Remove keys from current selection\n * @param source Name of the selection source\n * @param imodel iModel associated with the selection\n * @param keys Keys to remove\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\n */\n public removeFromSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\n const evt: SelectionChangeEventArgs = {\n source,\n level,\n imodel,\n changeType: SelectionChangeType.Remove,\n keys: new KeySet(keys),\n timestamp: new Date(),\n rulesetId,\n };\n this.handleEvent(evt);\n }\n\n /**\n * Replace current selection\n * @param source Name of the selection source\n * @param imodel iModel associated with the selection\n * @param keys Keys to add\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\n */\n public replaceSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\n const evt: SelectionChangeEventArgs = {\n source,\n level,\n imodel,\n changeType: SelectionChangeType.Replace,\n keys: new KeySet(keys),\n timestamp: new Date(),\n rulesetId,\n };\n this.handleEvent(evt);\n }\n\n /**\n * Clear current selection\n * @param source Name of the selection source\n * @param imodel iModel associated with the selection\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\n */\n public clearSelection(source: string, imodel: IModelConnection, level: number = 0, rulesetId?: string): void {\n const evt: SelectionChangeEventArgs = {\n source,\n level,\n imodel,\n changeType: SelectionChangeType.Clear,\n keys: new KeySet(),\n timestamp: new Date(),\n rulesetId,\n };\n this.handleEvent(evt);\n }\n\n /**\n * Add keys to selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\n * @param source Name of the selection source\n * @param imodel iModel associated with the selection\n * @param ids Element IDs to add\n * @param scope Selection scope to apply\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\n */\n public async addToSelectionWithScope(\n source: string,\n imodel: IModelConnection,\n ids: Id64Arg,\n scope: SelectionScopeProps | SelectionScope | string,\n level: number = 0,\n rulesetId?: string,\n ): Promise<void> {\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\n this.addToSelection(source, imodel, scopedKeys, level, rulesetId);\n }\n\n /**\n * Remove keys from current selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\n * @param source Name of the selection source\n * @param imodel iModel associated with the selection\n * @param ids Element IDs to remove\n * @param scope Selection scope to apply\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\n */\n public async removeFromSelectionWithScope(\n source: string,\n imodel: IModelConnection,\n ids: Id64Arg,\n scope: SelectionScopeProps | SelectionScope | string,\n level: number = 0,\n rulesetId?: string,\n ): Promise<void> {\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\n this.removeFromSelection(source, imodel, scopedKeys, level, rulesetId);\n }\n\n /**\n * Replace current selection with keys after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\n * @param source Name of the selection source\n * @param imodel iModel associated with the selection\n * @param ids Element IDs to replace with\n * @param scope Selection scope to apply\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\n */\n public async replaceSelectionWithScope(\n source: string,\n imodel: IModelConnection,\n ids: Id64Arg,\n scope: SelectionScopeProps | SelectionScope | string,\n level: number = 0,\n rulesetId?: string,\n ): Promise<void> {\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\n this.replaceSelection(source, imodel, scopedKeys, level, rulesetId);\n }\n\n /**\n * Get the current hilite set for the specified imodel\n * @public\n */\n public async getHiliteSet(imodel: IModelConnection): Promise<HiliteSet> {\n return this.getHiliteSetProvider(imodel).getHiliteSet(this.getSelection(imodel));\n }\n\n /**\n * Get the current hilite set iterator for the specified imodel.\n * @public\n */\n public getHiliteSetIterator(imodel: IModelConnection) {\n return this.getHiliteSetProvider(imodel).getHiliteSetIterator(this.getSelection(imodel));\n }\n\n private getHiliteSetProvider(imodel: IModelConnection) {\n let provider = this._hiliteSetProviders.get(imodel);\n if (!provider) {\n provider = HiliteSetProvider.create({ imodel });\n this._hiliteSetProviders.set(imodel, provider);\n }\n return provider;\n }\n\n private streamSelectionEvents() {\n return this._selectionChanges\n .pipe(\n mergeMap((args) => {\n const currentSelectables = this.selectionStorage.getSelection({ imodelKey: args.imodelKey, level: args.level });\n return this._currentSelection.computeSelection(args.imodelKey, args.level, currentSelectables, args.selectables).pipe(\n mergeMap(({ level, changedSelection }): Observable<SelectionChangeEventArgs> => {\n const imodel = findIModel(this._knownIModels, this._imodelKeyFactory, args.imodelKey);\n // istanbul ignore if\n if (!imodel) {\n return EMPTY;\n }\n return of({\n imodel,\n keys: changedSelection,\n level,\n source: args.source,\n timestamp: args.timestamp,\n changeType: getChangeType(args.changeType),\n });\n }),\n );\n }),\n )\n .subscribe({\n next: (args) => {\n this.selectionChange.raiseEvent(args, this);\n },\n });\n }\n}\n\nfunction findIModel(set: Set<IModelConnection>, imodelKeyFactory: (imodel: IModelConnection) => string, key: string) {\n for (const imodel of set) {\n if (imodelKeyFactory(imodel) === key) {\n return imodel;\n }\n }\n return undefined;\n}\n\n/** @internal */\nexport class ToolSelectionSyncHandler implements IDisposable {\n private _selectionSourceName = \"Tool\";\n private _logicalSelection: SelectionManager;\n private _imodel: IModelConnection;\n private _imodelToolSelectionListenerDisposeFunc: () => void;\n private _asyncsTracker = new AsyncTasksTracker();\n public isSuspended?: boolean;\n\n public constructor(imodel: IModelConnection, logicalSelection: SelectionManager) {\n this._imodel = imodel;\n this._logicalSelection = logicalSelection;\n this._imodelToolSelectionListenerDisposeFunc = imodel.selectionSet.onChanged.addListener(this.onToolSelectionChanged);\n }\n\n public dispose() {\n this._imodelToolSelectionListenerDisposeFunc();\n }\n\n /** note: used only it tests */\n public get pendingAsyncs() {\n return this._asyncsTracker.pendingAsyncs;\n }\n\n private onToolSelectionChanged = async (ev: SelectionSetEvent): Promise<void> => {\n // ignore selection change event if the handler is suspended\n if (this.isSuspended) {\n return;\n }\n\n // this component only cares about its own imodel\n const imodel = ev.set.iModel;\n if (imodel !== this._imodel) {\n return;\n }\n\n // determine the level of selection changes\n // wip: may want to allow selecting at different levels?\n const selectionLevel = 0;\n\n let ids: SelectableIds;\n switch (ev.type) {\n case SelectionSetEventType.Add:\n ids = ev.additions;\n break;\n case SelectionSetEventType.Replace:\n ids = ev.set.active;\n break;\n default:\n ids = ev.removals;\n break;\n }\n\n // we're always using scoped selection changer even if the scope is set to \"element\" - that\n // makes sure we're adding to selection keys with concrete classes and not \"BisCore:Element\", which\n // we can't because otherwise our keys compare fails (presentation components load data with\n // concrete classes)\n const changer = new ScopedSelectionChanger(\n this._selectionSourceName,\n this._imodel,\n this._logicalSelection,\n createSelectionScopeProps(this._logicalSelection.scopes.activeScope),\n );\n\n await using(this._asyncsTracker.trackAsyncTask(), async (_r) => {\n switch (ev.type) {\n case SelectionSetEventType.Add:\n await changer.add(ids, selectionLevel);\n break;\n case SelectionSetEventType.Replace:\n await changer.replace(ids, selectionLevel);\n break;\n case SelectionSetEventType.Remove:\n await changer.remove(ids, selectionLevel);\n break;\n case SelectionSetEventType.Clear:\n await changer.clear(selectionLevel);\n break;\n }\n });\n };\n}\n\nconst parseElementIds = (ids: Id64Arg): { persistent: Id64Arg; transient: Id64Arg } => {\n let allPersistent = true;\n let allTransient = true;\n for (const id of Id64.iterable(ids)) {\n if (Id64.isTransient(id)) {\n allPersistent = false;\n } else {\n allTransient = false;\n }\n\n if (!allPersistent && !allTransient) {\n break;\n }\n }\n\n // avoid making a copy if ids are only persistent or only transient\n if (allPersistent) {\n return { persistent: ids, transient: [] };\n } else if (allTransient) {\n return { persistent: [], transient: ids };\n }\n\n // if `ids` contain mixed ids, we have to copy.. use Array instead of\n // a Set for performance\n const persistentElementIds: Id64Array = [];\n const transientElementIds: Id64Array = [];\n for (const id of Id64.iterable(ids)) {\n if (Id64.isTransient(id)) {\n transientElementIds.push(id);\n } else {\n persistentElementIds.push(id);\n }\n }\n\n return { persistent: persistentElementIds, transient: transientElementIds };\n};\n\nfunction addKeys(target: KeySet, className: string, ids: Id64Arg) {\n for (const id of Id64.iterable(ids)) {\n target.add({ className, id });\n }\n}\n\nclass ScopedSelectionChanger {\n public readonly name: string;\n public readonly imodel: IModelConnection;\n public readonly manager: SelectionManager;\n public readonly scope: SelectionScopeProps | SelectionScope | string;\n public constructor(name: string, imodel: IModelConnection, manager: SelectionManager, scope: SelectionScopeProps | SelectionScope | string) {\n this.name = name;\n this.imodel = imodel;\n this.manager = manager;\n this.scope = scope;\n }\n public async clear(level: number): Promise<void> {\n this.manager.clearSelection(this.name, this.imodel, level);\n }\n public async add(ids: SelectableIds, level: number): Promise<void> {\n const keys = await this.#computeSelection(ids);\n this.manager.addToSelection(this.name, this.imodel, keys, level);\n }\n public async remove(ids: SelectableIds, level: number): Promise<void> {\n const keys = await this.#computeSelection(ids);\n this.manager.removeFromSelection(this.name, this.imodel, keys, level);\n }\n public async replace(ids: SelectableIds, level: number): Promise<void> {\n const keys = await this.#computeSelection(ids);\n this.manager.replaceSelection(this.name, this.imodel, keys, level);\n }\n async #computeSelection(ids: SelectableIds) {\n let keys = new KeySet();\n if (ids.elements) {\n const { persistent, transient } = parseElementIds(ids.elements);\n keys = await this.manager.scopes.computeSelection(this.imodel, persistent, this.scope);\n addKeys(keys, TRANSIENT_ELEMENT_CLASSNAME, transient);\n }\n if (ids.models) {\n addKeys(keys, \"BisCore.Model\", ids.models);\n }\n if (ids.subcategories) {\n addKeys(keys, \"BisCore.SubCategory\", ids.subcategories);\n }\n return keys;\n }\n}\n\n/** Stores current selection in `KeySet` format per iModel. */\nclass CurrentSelectionStorage {\n private _currentSelection = new Map<string, IModelSelectionStorage>();\n\n private getCurrentSelectionStorage(imodelKey: string) {\n let storage = this._currentSelection.get(imodelKey);\n if (!storage) {\n storage = new IModelSelectionStorage();\n this._currentSelection.set(imodelKey, storage);\n }\n return storage;\n }\n\n public getSelection(imodelKey: string, level: number) {\n return this.getCurrentSelectionStorage(imodelKey).getSelection(level);\n }\n\n public clear(imodelKey: string) {\n this._currentSelection.delete(imodelKey);\n }\n\n public computeSelection(imodelKey: string, level: number, currSelectables: Selectables, changedSelectables: Selectables) {\n return this.getCurrentSelectionStorage(imodelKey).computeSelection(level, currSelectables, changedSelectables);\n }\n}\n\ninterface StorageEntry {\n value: KeySet;\n ongoingComputationDisposers: Set<Subject<void>>;\n}\n\n/**\n * Computes and stores current selection in `KeySet` format.\n * It always stores result of latest resolved call to `computeSelection`.\n */\nclass IModelSelectionStorage {\n private _currentSelection = new Map<number, StorageEntry>();\n\n public getSelection(level: number): KeySet {\n let entry = this._currentSelection.get(level);\n if (!entry) {\n entry = { value: new KeySet(), ongoingComputationDisposers: new Set() };\n this._currentSelection.set(level, entry);\n }\n return entry.value;\n }\n\n private clearSelections(level: number) {\n const clearedLevels = [];\n for (const [storedLevel] of this._currentSelection.entries()) {\n if (storedLevel > level) {\n clearedLevels.push(storedLevel);\n }\n }\n clearedLevels.forEach((storedLevel) => {\n const entry = this._currentSelection.get(storedLevel);\n // istanbul ignore if\n if (!entry) {\n return;\n }\n\n for (const disposer of entry.ongoingComputationDisposers) {\n disposer.next();\n }\n this._currentSelection.delete(storedLevel);\n });\n }\n\n private addDisposer(level: number, disposer: Subject<void>) {\n const entry = this._currentSelection.get(level);\n if (!entry) {\n this._currentSelection.set(level, { value: new KeySet(), ongoingComputationDisposers: new Set([disposer]) });\n return;\n }\n entry.ongoingComputationDisposers.add(disposer);\n }\n\n private setSelection(level: number, keys: KeySet, disposer: Subject<void>) {\n const currEntry = this._currentSelection.get(level);\n // istanbul ignore else\n if (currEntry) {\n currEntry.ongoingComputationDisposers.delete(disposer);\n }\n this._currentSelection.set(level, {\n value: keys,\n ongoingComputationDisposers: currEntry?.ongoingComputationDisposers ?? /* istanbul ignore next */ new Set(),\n });\n }\n\n public computeSelection(level: number, currSelectables: Selectables, changedSelectables: Selectables) {\n this.clearSelections(level);\n\n const prevComputationsDisposers = [...(this._currentSelection.get(level)?.ongoingComputationDisposers ?? [])];\n const currDisposer = new Subject<void>();\n this.addDisposer(level, currDisposer);\n\n return defer(async () => {\n const convertedSelectables: SelectableKeys[] = [];\n const [current, changed] = await Promise.all([\n selectablesToKeys(currSelectables, convertedSelectables),\n selectablesToKeys(changedSelectables, convertedSelectables),\n ]);\n\n const currentSelection = new KeySet([...current.keys, ...current.selectableKeys.flatMap((selectable) => selectable.keys)]);\n const changedSelection = new KeySet([...changed.keys, ...changed.selectableKeys.flatMap((selectable) => selectable.keys)]);\n\n return {\n level,\n currentSelection,\n changedSelection,\n };\n }).pipe(\n takeUntil(currDisposer),\n tap({\n next: (val) => {\n prevComputationsDisposers.forEach((disposer) => disposer.next());\n this.setSelection(val.level, val.currentSelection, currDisposer);\n },\n }),\n );\n }\n}\n\nfunction keysToSelectable(imodel: IModelConnection, keys: Readonly<KeySet>) {\n const selectables: Selectable[] = [];\n keys.forEach((key) => {\n if (\"id\" in key) {\n selectables.push(key);\n return;\n }\n\n const customSelectable: CustomSelectable = {\n identifier: key.pathFromRoot.join(\"/\"),\n data: key,\n loadInstanceKeys: () => createInstanceKeysIterator(imodel, key),\n };\n selectables.push(customSelectable);\n });\n return selectables;\n}\n\ninterface SelectableKeys {\n identifier: string;\n keys: Key[];\n}\n\nasync function selectablesToKeys(selectables: Selectables, convertedList: SelectableKeys[]) {\n const keys: Key[] = [];\n const selectableKeys: SelectableKeys[] = [];\n\n for (const [className, ids] of selectables.instanceKeys) {\n for (const id of ids) {\n keys.push({ id, className });\n }\n }\n\n for (const [_, selectable] of selectables.custom) {\n if (isNodeKey(selectable.data)) {\n selectableKeys.push({ identifier: selectable.identifier, keys: [selectable.data] });\n continue;\n }\n const converted = convertedList.find((con) => con.identifier === selectable.identifier);\n if (converted) {\n selectableKeys.push(converted);\n continue;\n }\n\n const newConverted: SelectableKeys = { identifier: selectable.identifier, keys: [] };\n convertedList.push(newConverted);\n for await (const instanceKey of selectable.loadInstanceKeys()) {\n newConverted.keys.push(instanceKey);\n }\n selectableKeys.push(newConverted);\n }\n\n return { keys, selectableKeys };\n}\n\nasync function* createInstanceKeysIterator(imodel: IModelConnection, nodeKey: NodeKey): AsyncIterableIterator<InstanceKey> {\n if (NodeKey.isInstancesNodeKey(nodeKey)) {\n for (const key of nodeKey.instanceKeys) {\n yield key;\n }\n return;\n }\n\n const content = await Presentation.presentation.getContentInstanceKeys({\n imodel,\n keys: new KeySet([nodeKey]),\n rulesetOrId: {\n id: \"grouped-instances\",\n rules: [\n {\n ruleType: \"Content\",\n specifications: [\n {\n specType: \"SelectedNodeInstances\",\n },\n ],\n },\n ],\n },\n });\n\n for await (const key of content.items()) {\n yield key;\n }\n}\n\nfunction isNodeKey(data: unknown): data is NodeKey {\n const key = data as BaseNodeKey;\n return key.pathFromRoot !== undefined && key.type !== undefined;\n}\n\nfunction getChangeType(type: StorageSelectionChangeType): SelectionChangeType {\n switch (type) {\n case \"add\":\n return SelectionChangeType.Add;\n case \"remove\":\n return SelectionChangeType.Remove;\n case \"replace\":\n return SelectionChangeType.Replace;\n case \"clear\":\n return SelectionChangeType.Clear;\n }\n}\n"]}
|