@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
34 lines (33 loc) • 2.75 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 SVGBackground from './SVGBackground';
import SVGHeader from './SVGHeader';
import SVGTracks from './SVGTracks';
import { totalHeight } from './util';
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', Wrapper = ({ children }) => children, } = opts;
const session = getSession(model);
const { allThemes } = session;
const theme = allThemes === null || allThemes === void 0 ? void 0 : allThemes()[themeName];
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 displayResults = await Promise.all([...pinnedTracks, ...unpinnedTracks].map(async (track) => {
const display = track.displays[0];
await when(() => !display.renderProps().notReady);
return { track, result: await display.renderSvg({ ...opts, theme }) };
}));
const trackLabelMaxLen = max(tracks.map(t => measureText(getTrackName(t.configuration, session), fontSize)), 0) + 40;
const trackLabelOffset = trackLabels === 'left' ? trackLabelMaxLen : 0;
const w = width + trackLabelOffset;
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 }) }), _jsx("g", { transform: `translate(0 ${offset})`, children: _jsx(SVGTracks, { textHeight: textHeight, fontSize: fontSize, model: model, displayResults: displayResults, trackLabels: trackLabels, trackLabelOffset: trackLabelOffset }) })] })] }) }) }));
}
export { default as SVGRuler } from './SVGRuler';
export { default as SVGTracks } from './SVGTracks';