@itwin/unified-selection
Version:
Package for managing unified selection in iTwin.js applications.
68 lines • 3.11 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* 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.createCachingHiliteSetProvider = createCachingHiliteSetProvider;
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 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
*/
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 === SelectionStorage_js_1.IMODEL_CLOSE_SELECTION_CLEAR_SOURCE) {
this._hiliteSetProviders.delete(args.imodelKey);
}
});
this._createHiliteSetProvider = props.createHiliteSetProvider ?? /* c8 ignore next */ HiliteSetProvider_js_1.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 = (0, rxjs_1.from)(provider.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();
}
/* 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