@itwin/unified-selection
Version:
Package for managing unified selection in iTwin.js applications.
65 lines • 2.9 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 caches hilite set for current selection for given iModel so any subsequent
* hilite set requests for the same iModel don't cost until selection in given selection storage changes.
* @public
*/
export function createCachingHiliteSetProvider(props) {
return new CachingHiliteSetProviderImpl(props);
}
class CachingHiliteSetProviderImpl {
_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;
}
getHiliteSet({ imodelKey }) {
const imodelAccess = this._imodelProvider(imodelKey);
const provider = this.getHiliteSetProvider(imodelKey, imodelAccess);
let hiliteSet = this._cache.get(imodelKey);
if (!hiliteSet) {
const selectables = this._selectionStorage.getSelection({ imodelKey });
hiliteSet = from(provider.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();
}
/* c8 ignore next 3 */
dispose() {
this[Symbol.dispose]();
}
getHiliteSetProvider(imodelKey, imodelAccess) {
let provider = this._hiliteSetProviders.get(imodelKey);
if (!provider) {
provider = this._createHiliteSetProvider({ imodelAccess });
this._hiliteSetProviders.set(imodelKey, provider);
}
return provider;
}
}
//# sourceMappingURL=CachingHiliteSetProvider.js.map