diff --git a/input/dom.ts b/input/dom.ts new file mode 100644 index 0000000..59edc05 --- /dev/null +++ b/input/dom.ts @@ -0,0 +1,42 @@ +import type { KeybindEvent } from "./keyboard"; +import type { PointerInputEvent, WheelInputEvent } from "./pointer"; + +export function keybindEventFromKeyboardEvent(event: KeyboardEvent): KeybindEvent { + return { + key: event.key, + code: event.code, + altKey: event.altKey, + ctrlKey: event.ctrlKey, + metaKey: event.metaKey, + shiftKey: event.shiftKey, + }; +} + +function normalizePointerType(pointerType: string): PointerInputEvent["pointerType"] { + if (pointerType === "pen" || pointerType === "touch") return pointerType; + return "mouse"; +} + +export function pointerInputEventFromPointerEvent(event: PointerEvent): PointerInputEvent { + return { + pointerId: event.pointerId, + pointerType: normalizePointerType(event.pointerType), + position: { x: event.offsetX, y: event.offsetY }, + buttons: event.buttons, + altKey: event.altKey, + ctrlKey: event.ctrlKey, + metaKey: event.metaKey, + shiftKey: event.shiftKey, + }; +} + +export function wheelInputEventFromWheelEvent(event: WheelEvent): WheelInputEvent { + return { + position: { x: event.offsetX, y: event.offsetY }, + delta: { x: event.deltaX, y: event.deltaY }, + altKey: event.altKey, + ctrlKey: event.ctrlKey, + metaKey: event.metaKey, + shiftKey: event.shiftKey, + }; +} diff --git a/input/index.ts b/input/index.ts index 5f97067..f6043d9 100644 --- a/input/index.ts +++ b/input/index.ts @@ -1,3 +1,9 @@ +export { + keybindEventFromKeyboardEvent, + pointerInputEventFromPointerEvent, + wheelInputEventFromWheelEvent, +} from "./dom"; export type { CommandKeybind, GlobalKeybindConsumer, Keybind, KeybindEvent, KeybindMap } from "./keyboard"; export { handleKeybind, keybindFromEvent } from "./keyboard"; export type { GlobalPointerConsumer, GlobalWheelConsumer, PointerInputEvent, WheelInputEvent } from "./pointer"; +export { handleViewportWheel } from "./viewport"; diff --git a/input/viewport.ts b/input/viewport.ts new file mode 100644 index 0000000..13b9b5d --- /dev/null +++ b/input/viewport.ts @@ -0,0 +1,19 @@ +import type { Dispatch } from "@commands/dispatcher"; +import type { GlobalWheelConsumer, WheelInputEvent } from "./pointer"; + +export function handleViewportWheel(options: { + event: WheelInputEvent; + globalConsumer: GlobalWheelConsumer; + dispatch: Dispatch; + currentZoom: number; +}): boolean { + if (options.globalConsumer(options.event)) return true; + + const zoomFactor = Math.exp(-options.event.delta.y * 0.001); + options.dispatch("viewport.zoomAroundPoint", { + zoom: options.currentZoom * zoomFactor, + point: options.event.position, + }); + + return true; +}