This commit is contained in:
marlon-erler
2026-09-24 15:47:15 +02:00
parent ffb56b8843
commit f3896c497b
+41 -9
View File
@@ -229,6 +229,8 @@ export function localeCompare(a: string, b: string): number {
// ui // ui
export function implementPinchZoom(canvas: HTMLElement) { export function implementPinchZoom(canvas: HTMLElement) {
let pinching = false; let pinching = false;
let dragging = false;
let scrolling = false;
let lastElement: HTMLElement | undefined = undefined; let lastElement: HTMLElement | undefined = undefined;
let initialDistance: number, let initialDistance: number,
@@ -292,25 +294,55 @@ export function implementPinchZoom(canvas: HTMLElement) {
canvas.addEventListener("wheel", (event: WheelEvent) => { canvas.addEventListener("wheel", (event: WheelEvent) => {
event.preventDefault(); event.preventDefault();
if (!scrolling) {
initialZoom = currentZoom; initialZoom = currentZoom;
initialX = currentX; initialX = currentX;
initialY = currentY; initialY = currentY;
scrolling = true
if (!event.shiftKey) {
apply(currentZoom, [
currentX - event.deltaX,
currentY - event.deltaY,
]);
return;
} }
apply(currentZoom - event.deltaY * 0.01);
const canvasWidth = canvas.offsetWidth;
const canvasHeight = canvas.offsetHeight;
const initialWidth = canvasWidth * initialZoom;
const initialHeight = canvasHeight * initialZoom;
const currentWidth = canvasWidth * currentZoom;
const currentHeight = canvasHeight * currentZoom;
const differenceWidth = currentWidth - initialWidth;
const differenceHeight = currentHeight - initialHeight;
apply(currentZoom - event.deltaY * 0.005, [initialX - differenceWidth, initialY - differenceHeight]);
}); });
canvas.addEventListener("scrollend", () => {
scrolling = false;
})
canvas.addEventListener("scroll", (event: Event) => { canvas.addEventListener("scroll", (event: Event) => {
event.preventDefault(); event.preventDefault();
}); });
canvas.addEventListener("mousedown", (event: MouseEvent) => {
initialZoom = currentZoom;
initialX = currentX;
initialY = currentY;
initialTouchX = event.clientX;
initialTouchY = event.clientY;
dragging = true;
})
canvas.addEventListener("mouseup", () => {
dragging = false;
})
canvas.addEventListener("mousemove", (event: MouseEvent) => {
if (!dragging) return;
apply(currentZoom, [
initialX +
(event.clientX - initialTouchX) / initialZoom,
initialY +
(event.clientY - initialTouchY) / initialZoom,
]);
})
canvas.addEventListener("touchstart", (event: TouchEvent) => { canvas.addEventListener("touchstart", (event: TouchEvent) => {
(document.activeElement as HTMLElement).blur(); (document.activeElement as HTMLElement)?.blur();
const el = element(); const el = element();
if (!el) return; if (!el) return;