@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
63 lines (62 loc) • 2.54 kB
JavaScript
;
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]);
}