UNPKG

@jbrowse/plugin-wiggle

Version:

JBrowse 2 wiggle adapters, tracks, etc.

80 lines (79 loc) 3.29 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { useRef } from 'react'; import { PrerenderedCanvas } from '@jbrowse/core/ui'; import { SimpleFeature } from '@jbrowse/core/util'; import { observer } from 'mobx-react'; const MultiWiggleRendering = observer(function (props) { const { regions, features, bpPerPx, width, height, sources, onMouseLeave = () => { }, onMouseMove = () => { }, onFeatureClick = () => { }, displayModel, } = props; const region = regions[0]; const ref = useRef(null); const { isMultiRow } = displayModel || {}; function getFeatureUnderMouse(eventClientX, eventClientY) { if (!ref.current) { return; } const rect = ref.current.getBoundingClientRect(); const offsetX = eventClientX - rect.left; const offsetY = eventClientY - rect.top; const source = sources[Math.floor((offsetY / height) * sources.length)]; if (!source) { return; } const px = region.reversed ? width - offsetX : offsetX; const mouseoverBp = region.start + bpPerPx * px; let featureUnderMouse; if (isMultiRow) { for (const feature of features.values()) { if (feature.get('source') !== source.name) { continue; } if (mouseoverBp <= feature.get('end') + bpPerPx && mouseoverBp >= feature.get('start')) { featureUnderMouse = feature; break; } } } else { const featuresUnderMouse = []; for (const feature of features.values()) { if (mouseoverBp <= feature.get('end') + bpPerPx && mouseoverBp >= feature.get('start')) { featuresUnderMouse.push(feature); } } if (featuresUnderMouse.length) { const pos = Math.floor(mouseoverBp); featureUnderMouse = new SimpleFeature({ uniqueId: 'mouseoverfeat', sources: Object.fromEntries(featuresUnderMouse .map(f => f.toJSON()) .map(f => { const { refName, start, end, source, ...rest } = f; return [source, rest]; })), ...region, start: pos, end: pos + 1, }); } } return featureUnderMouse; } return (_jsx("div", { ref: ref, onMouseMove: event => { const { clientX, clientY } = event; const featureUnderMouse = getFeatureUnderMouse(clientX, clientY); onMouseMove(event, featureUnderMouse); }, onClick: event => { const { clientX, clientY } = event; const featureUnderMouse = getFeatureUnderMouse(clientX, clientY); onFeatureClick(event, featureUnderMouse); }, onMouseLeave: event => { onMouseLeave(event); }, style: { overflow: 'visible', position: 'relative', height, }, children: _jsx(PrerenderedCanvas, { ...props }) })); }); export default MultiWiggleRendering;