feat(input): add DOM event command adapters
This commit is contained in:
42
input/dom.ts
Normal file
42
input/dom.ts
Normal file
@@ -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,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,3 +1,9 @@
|
|||||||
|
export {
|
||||||
|
keybindEventFromKeyboardEvent,
|
||||||
|
pointerInputEventFromPointerEvent,
|
||||||
|
wheelInputEventFromWheelEvent,
|
||||||
|
} from "./dom";
|
||||||
export type { CommandKeybind, GlobalKeybindConsumer, Keybind, KeybindEvent, KeybindMap } from "./keyboard";
|
export type { CommandKeybind, GlobalKeybindConsumer, Keybind, KeybindEvent, KeybindMap } from "./keyboard";
|
||||||
export { handleKeybind, keybindFromEvent } from "./keyboard";
|
export { handleKeybind, keybindFromEvent } from "./keyboard";
|
||||||
export type { GlobalPointerConsumer, GlobalWheelConsumer, PointerInputEvent, WheelInputEvent } from "./pointer";
|
export type { GlobalPointerConsumer, GlobalWheelConsumer, PointerInputEvent, WheelInputEvent } from "./pointer";
|
||||||
|
export { handleViewportWheel } from "./viewport";
|
||||||
|
|||||||
19
input/viewport.ts
Normal file
19
input/viewport.ts
Normal file
@@ -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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user