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