UNPKG

@jbrowse/plugin-wiggle

Version:

JBrowse 2 wiggle adapters, tracks, etc.

82 lines (81 loc) 3.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = require("react"); const ui_1 = require("@jbrowse/core/ui"); const util_1 = require("@jbrowse/core/util"); const mobx_react_1 = require("mobx-react"); const MultiWiggleRendering = (0, mobx_react_1.observer)(function (props) { const { regions, features, bpPerPx, width, height, sources, onMouseLeave = () => { }, onMouseMove = () => { }, onFeatureClick = () => { }, displayModel, } = props; const region = regions[0]; const ref = (0, react_1.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 util_1.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 ((0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)(ui_1.PrerenderedCanvas, { ...props }) })); }); exports.default = MultiWiggleRendering;