UNPKG

@jbrowse/plugin-linear-genome-view

Version:

JBrowse 2 linear genome view

46 lines (45 loc) 3.44 kB
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";