@jbrowse/plugin-wiggle
Version:
JBrowse 2 wiggle adapters, tracks, etc.
82 lines (81 loc) • 3.44 kB
JavaScript
;
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;