import { default as getComputedTransformMatrix, extractNum, track, getTracked } from './utils';
function zoomIn(deltaY) {
return deltaY < 0;
}
function getScale(deltaY, factor) {
const outMult = 1 - factor;
const inMult = 1 + factor / outMult
return zoomIn(deltaY) ? inMult : outMult;
}
function getTranslateMatrix(el, clientX, clientY) {
const inverseScreenCTM = el.getScreenCTM().inverse();
const translateMtx = new DOMMatrix();
const pointer = new DOMPoint(clientX, clientY)
const { x, y } = pointer.matrixTransform(inverseScreenCTM);
return translateMtx.translate(x, y);
}
function setTransform(el, computedMtx, translateMtx, scale) {
const transformMtx =
computedMtx.multiply(translateMtx).scale(scale).multiply(translateMtx.inverse());
//groups.forEach(([z, p]) => track(z, p, transformMtx));
el.style.transform = transformMtx;
}
//let groups = [];
export function programmaticZoom(el, point, scale, cb) {
const computedMtx = getComputedTransformMatrix(el);
const translateMtx = getTranslateMatrix(el, point.x, point.y);
el.style.transition = 'transform 0.5s';
setTransform(el, computedMtx, translateMtx, scale);
el.addEventListener('transitionend', () => el.style.transition = '', { once: true });
cb();
}
export default function (el, factor = 0.1, cb) {
//groups = getTracked(document.querySelectorAll('svg g[class] use'));
return e => {
e.preventDefault();
const computedMtx = getComputedTransformMatrix(el);
const scale = getScale(e.deltaY, factor);
const translateMtx = getTranslateMatrix(el, e.clientX, e.clientY);
setTransform(el, computedMtx, translateMtx, scale);
cb();
//groups.forEach(([z, p]) => {
// z.style.display = '';
// const { width } = z.getBoundingClientRect();
// width < 40 ? z.style.display = 'none' : z.style.display = '';
//});
}
}