UNPKG

@jbrowse/plugin-linear-genome-view

Version:

JBrowse 2 linear genome view

117 lines (116 loc) 4.53 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { getConf } from '@jbrowse/core/configuration'; import { getContainingView } from '@jbrowse/core/util'; import { autorun } from 'mobx'; import { addDisposer, isAlive, types } from 'mobx-state-tree'; import autorunFeatureDensityStats from './autorunFeatureDensityStats'; import { getDisplayStr, getFeatureDensityStatsPre } from './util'; import TooLargeMessage from '../components/TooLargeMessage'; export default function FeatureDensityMixin() { return types .model({ userBpPerPxLimit: types.maybe(types.number), userByteSizeLimit: types.maybe(types.number), }) .volatile(() => ({ featureDensityStatsP: undefined, featureDensityStats: undefined, currStatsBpPerPx: 0, })) .views(self => ({ get currentBytesRequested() { var _a; return ((_a = self.featureDensityStats) === null || _a === void 0 ? void 0 : _a.bytes) || 0; }, get currentFeatureScreenDensity() { var _a; const view = getContainingView(self); return (((_a = self.featureDensityStats) === null || _a === void 0 ? void 0 : _a.featureDensity) || 0) * view.bpPerPx; }, get maxFeatureScreenDensity() { return getConf(self, 'maxFeatureScreenDensity'); }, get featureDensityStatsReady() { const view = getContainingView(self); return (self.currStatsBpPerPx === view.bpPerPx && (!!self.featureDensityStats || !!self.userBpPerPxLimit)); }, get maxAllowableBytes() { var _a; return (self.userByteSizeLimit || ((_a = self.featureDensityStats) === null || _a === void 0 ? void 0 : _a.fetchSizeLimit) || getConf(self, 'fetchSizeLimit')); }, })) .actions(self => ({ afterAttach() { addDisposer(self, autorun(() => autorunFeatureDensityStats(self))); }, })) .actions(self => ({ setCurrStatsBpPerPx(n) { self.currStatsBpPerPx = n; }, setFeatureDensityStatsLimit(stats) { const view = getContainingView(self); if (stats === null || stats === void 0 ? void 0 : stats.bytes) { self.userByteSizeLimit = stats.bytes; } else { self.userBpPerPxLimit = view.bpPerPx; } }, getFeatureDensityStats() { if (!self.featureDensityStatsP) { self.featureDensityStatsP = getFeatureDensityStatsPre(self).catch((e) => { if (isAlive(self)) { this.setFeatureDensityStatsP(undefined); } throw e; }); } return self.featureDensityStatsP; }, setFeatureDensityStatsP(arg) { self.featureDensityStatsP = arg; }, setFeatureDensityStats(featureDensityStats) { self.featureDensityStats = featureDensityStats; }, clearFeatureDensityStats() { self.featureDensityStatsP = undefined; self.featureDensityStats = undefined; }, })) .views(self => ({ get regionTooLarge() { const view = getContainingView(self); if (!self.featureDensityStatsReady || view.dynamicBlocks.totalBp < 20000) { return false; } return (self.currentBytesRequested > self.maxAllowableBytes || (self.userBpPerPxLimit ? view.bpPerPx > self.userBpPerPxLimit : self.currentFeatureScreenDensity > self.maxFeatureScreenDensity)); }, get regionTooLargeReason() { const req = self.currentBytesRequested; const max = self.maxAllowableBytes; return req && req > max ? `Requested too much data (${getDisplayStr(req)})` : ''; }, })) .views(self => ({ get statsReadyAndRegionNotTooLarge() { return self.featureDensityStatsReady && !self.regionTooLarge; }, regionCannotBeRenderedText(_region) { return self.regionTooLarge ? 'Force load to see features' : ''; }, regionCannotBeRendered(_region) { return self.regionTooLarge ? (_jsx(TooLargeMessage, { model: self })) : null; }, })); }