@itwin/unified-selection
Version:
Package for managing unified selection in iTwin.js applications.
62 lines • 2.81 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
import "./DisposePolyfill.js";
import { from, shareReplay } from "rxjs";
import { eachValueFrom } from "rxjs-for-await";
import { createHiliteSetProvider } from "./HiliteSetProvider.js";
import { IMODEL_CLOSE_SELECTION_CLEAR_SOURCE } from "./SelectionStorage.js";
/**
* Creates a hilite set provider that can efficiently get a hilite set for the "active" selection in an iModel.
*
* This specific implementation caches the hilite set for the current selection, so subsequent hilite set
* requests for the same iModel, don't cost until selection changes.
*
* @public
*/
export function createIModelHiliteSetProvider(props) {
return new IModelHiliteSetProviderImpl(props);
}
class IModelHiliteSetProviderImpl {
_selectionStorage;
_hiliteSetProviders = new Map();
_cache = new Map();
_removeListener;
_imodelProvider;
_createHiliteSetProvider;
constructor(props) {
this._selectionStorage = props.selectionStorage;
this._imodelProvider = props.imodelProvider;
this._removeListener = this._selectionStorage.selectionChangeEvent.addListener((args) => {
this._cache.delete(args.imodelKey);
if (args.changeType === "clear" && args.source === IMODEL_CLOSE_SELECTION_CLEAR_SOURCE) {
this._hiliteSetProviders.delete(args.imodelKey);
}
});
this._createHiliteSetProvider = props.createHiliteSetProvider ?? /* c8 ignore next */ createHiliteSetProvider;
}
getHiliteSetProvider({ imodelKey }) {
let provider = this._hiliteSetProviders.get(imodelKey);
if (!provider) {
provider = this._createHiliteSetProvider({ imodelAccess: this._imodelProvider(imodelKey) });
this._hiliteSetProviders.set(imodelKey, provider);
}
return provider;
}
getCurrentHiliteSet({ imodelKey }) {
let hiliteSet = this._cache.get(imodelKey);
if (!hiliteSet) {
const selectables = this._selectionStorage.getSelection({ imodelKey });
hiliteSet = from(this.getHiliteSetProvider({ imodelKey }).getHiliteSet({ selectables })).pipe(shareReplay({ refCount: true }));
this._cache.set(imodelKey, hiliteSet);
}
return eachValueFrom(hiliteSet);
}
[Symbol.dispose]() {
this._removeListener();
this._hiliteSetProviders = new Map();
this._cache = new Map();
}
}
//# sourceMappingURL=IModelHiliteSetProvider.js.map