UNPKG

@jbrowse/plugin-linear-genome-view

Version:

JBrowse 2 linear genome view

114 lines (113 loc) 4.31 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { getConf } from '@jbrowse/core/configuration'; import { getContainingView } from '@jbrowse/core/util'; import { addDisposer, isAlive, types } from '@jbrowse/mobx-state-tree'; import { autorun } from 'mobx'; import autorunFeatureDensityStats from "./autorunFeatureDensityStats.js"; import { getDisplayStr, getFeatureDensityStatsPre } from "./util.js"; import TooLargeMessage from "../components/TooLargeMessage.js"; 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() { return self.featureDensityStats?.bytes || 0; }, get currentFeatureScreenDensity() { const view = getContainingView(self); return (self.featureDensityStats?.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() { return (self.userByteSizeLimit || self.featureDensityStats?.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?.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 < 20_000) { 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 featureDensityStatsReadyAndRegionNotTooLarge() { 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; }, })); }