UNPKG

@itwin/unified-selection

Version:

Package for managing unified selection in iTwin.js applications.

65 lines 2.9 kB
/*--------------------------------------------------------------------------------------------- * 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