@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
46 lines (45 loc) • 3.44 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { createJBrowseTheme } from '@jbrowse/core/ui';
import { getSession, max, measureText, renderToStaticMarkup, } from '@jbrowse/core/util';
import { getTrackName } from '@jbrowse/core/util/tracks';
import { ThemeProvider } from '@mui/material';
import { when } from 'mobx';
import { isReadyOrHasError } from "../svgExportUtil.js";
import SVGBackground from "./SVGBackground.js";
import SVGGridlines from "./SVGGridlines.js";
import SVGHeader from "./SVGHeader.js";
import SVGTracks from "./SVGTracks.js";
import { totalHeight } from "./util.js";
export async function renderToSvg(model, opts) {
await when(() => model.initialized);
const { textHeight = 18, headerHeight = 40, rulerHeight = 50, fontSize = 13, cytobandHeight = 100, trackLabels = 'offset', themeName = 'default', showGridlines = false, Wrapper = ({ children }) => children, } = opts;
const session = getSession(model);
const { allThemes } = session;
const theme = allThemes?.()[themeName];
const jbrowseTheme = createJBrowseTheme(theme);
const { width, pinnedTracks, unpinnedTracks, tracks, showCytobands } = model;
const shift = 50;
const c = +showCytobands * cytobandHeight;
const offset = headerHeight + rulerHeight + c + 10;
const height = totalHeight(tracks, textHeight, trackLabels) + offset + 100;
const legendWidth = max([...pinnedTracks, ...unpinnedTracks].map(track => {
const display = track.displays[0];
return display?.svgLegendWidth?.(jbrowseTheme) ?? 0;
}), 0);
const displayResults = await Promise.all([...pinnedTracks, ...unpinnedTracks].map(async (track) => {
const display = track.displays[0];
await when(() => isReadyOrHasError(display));
return {
track,
result: await display.renderSvg({ ...opts, theme, legendWidth }),
};
}));
const trackLabelMaxLen = max(tracks.map(t => measureText(getTrackName(t.configuration, session), fontSize)), 0) + 40;
const trackLabelOffset = trackLabels === 'left' ? trackLabelMaxLen : 0;
const w = width + trackLabelOffset + legendWidth;
const tracksHeight = totalHeight(tracks, textHeight, trackLabels);
return renderToStaticMarkup(_jsx(ThemeProvider, { theme: createJBrowseTheme(theme), children: _jsx(Wrapper, { children: _jsxs("svg", { width: w, height: height, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, w + shift * 2, height].toString(), children: [_jsx(SVGBackground, { width: w, height: height, shift: shift }), _jsxs("g", { transform: `translate(${shift} 0)`, children: [_jsx("g", { transform: `translate(${trackLabelOffset})`, children: _jsx(SVGHeader, { model: model, fontSize: fontSize, rulerHeight: rulerHeight, cytobandHeight: cytobandHeight }) }), showGridlines ? (_jsx("g", { transform: `translate(${trackLabelOffset} ${offset})`, children: _jsx(SVGGridlines, { model: model, height: tracksHeight }) })) : null, _jsx("g", { transform: `translate(0 ${offset})`, children: _jsx(SVGTracks, { textHeight: textHeight, fontSize: fontSize, model: model, displayResults: displayResults, trackLabels: trackLabels, trackLabelOffset: trackLabelOffset }) })] })] }) }) }));
}
export { default as SVGGridlines } from "./SVGGridlines.js";
export { default as SVGRuler } from "./SVGRuler.js";
export { default as SVGTracks } from "./SVGTracks.js";