UNPKG

@itwin/unified-selection

Version:

Package for managing unified selection in iTwin.js applications.

62 lines 2.81 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 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