UNPKG

@itwin/unified-selection

Version:

Package for managing unified selection in iTwin.js applications.

66 lines 3.04 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); exports.createIModelHiliteSetProvider = createIModelHiliteSetProvider; require("./DisposePolyfill.js"); const rxjs_1 = require("rxjs"); const rxjs_for_await_1 = require("rxjs-for-await"); const HiliteSetProvider_js_1 = require("./HiliteSetProvider.js"); const SelectionStorage_js_1 = require("./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 */ 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 === SelectionStorage_js_1.IMODEL_CLOSE_SELECTION_CLEAR_SOURCE) { this._hiliteSetProviders.delete(args.imodelKey); } }); /* v8 ignore next -- @preserve */ this._createHiliteSetProvider = props.createHiliteSetProvider ?? HiliteSetProvider_js_1.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 = (0, rxjs_1.from)(this.getHiliteSetProvider({ imodelKey }).getHiliteSet({ selectables })).pipe((0, rxjs_1.shareReplay)({ refCount: true })); this._cache.set(imodelKey, hiliteSet); } return (0, rxjs_for_await_1.eachValueFrom)(hiliteSet); } [Symbol.dispose]() { this._removeListener(); this._hiliteSetProviders = new Map(); this._cache = new Map(); } } //# sourceMappingURL=IModelHiliteSetProvider.js.map