UNPKG

@jbrowse/plugin-linear-genome-view

Version:

JBrowse 2 linear genome view

63 lines (62 loc) 2.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useWheelScroll = useWheelScroll; const react_1 = require("react"); const util_1 = require("@jbrowse/core/util"); function useWheelScroll(ref, model) { const delta = (0, react_1.useRef)(0); const timeout = (0, react_1.useRef)(null); const scheduled = (0, react_1.useRef)(false); (0, react_1.useEffect)(() => { let samples = []; const curr = ref.current; function onWheel(event) { if (event.ctrlKey) { event.preventDefault(); samples.push(event.deltaY); const averageDeltaY = Math.abs((0, util_1.sum)(samples)) / samples.length; const normalizer = averageDeltaY < 6 ? 25 : averageDeltaY > 30 ? averageDeltaY > 150 ? 500 : 150 : 75; delta.current += event.deltaY / normalizer; model.setScaleFactor(delta.current < 0 ? 1 - delta.current : 1 / (1 + delta.current)); if (timeout.current) { clearTimeout(timeout.current); } timeout.current = setTimeout(() => { model.setScaleFactor(1); model.zoomTo(delta.current > 0 ? model.bpPerPx * (1 + delta.current) : model.bpPerPx / (1 - delta.current), event.clientX - ((curr === null || curr === void 0 ? void 0 : curr.getBoundingClientRect().left) || 0)); delta.current = 0; samples = []; }, 300); } else { if (Math.abs(event.deltaX) > Math.abs(2 * event.deltaY)) { event.preventDefault(); } delta.current += event.deltaX; if (!scheduled.current) { scheduled.current = true; window.requestAnimationFrame(() => { model.horizontalScroll(delta.current); delta.current = 0; scheduled.current = false; }); } } } if (curr) { curr.addEventListener('wheel', onWheel); return () => { curr.removeEventListener('wheel', onWheel); }; } return () => { }; }, [model, ref]); }