@itwin/unified-selection
Version:
Package for managing unified selection in iTwin.js applications.
66 lines • 3.04 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.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