@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
114 lines (113 loc) • 4.31 kB
JavaScript
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;
},
}));
}