import { PINCH_ZOOM_EXPONENT, WHEEL_LINE_PX, WHEEL_PAGE_PX, WHEEL_ZOOM_EXPONENT, } from '../App.consts.ts'; import { wheelEventIn } from '../../../../A00_Common/input_prefs'; /** * 휠 한 번 → 화면 확대(`zoomScreen` 인자). 휠은 늘 줌 · 커서 자리 고정(153-3) — 마우스 · 트랙패드를 * 가르지 않는다(옛 판정은 확대율 ≠ 100 % 등에서 휠을 팬으로 오판). 팬 = 가운데 단추 끌기. * null = 델타 0 이라 안 움직임. */ export function wheelZoom( evt: Pick ): { delta: number; exponent: number } | null { // deltaY 단위를 픽셀로 맞춘다 — 브라우저에 따라 줄(1)·쪽(2) 단위로 오기도 한다. const unitPx = evt.deltaMode === 1 ? WHEEL_LINE_PX : evt.deltaMode === 2 ? WHEEL_PAGE_PX : 1; const deltaY = evt.deltaY * unitPx; if (deltaY === 0) return null; // 방향 = ☰ [설정] 휠 확대 방향(기본 밂 = 앞으로 굴리면 확대 · 오토캐드 · 모든 화면 일체) · // 트랙패드 핀치는 늘 벌리면 확대. zoomScreen 은 음수 = 확대. // 핀치(ctrl+휠)는 델타가 잘아 지수만 크게. const size = Math.abs(deltaY); return { delta: wheelEventIn({ ctrlKey: evt.ctrlKey, deltaY }) ? -size : size, exponent: evt.ctrlKey ? PINCH_ZOOM_EXPONENT : WHEEL_ZOOM_EXPONENT, }; }