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 { handleKeybind, keybindFromEvent } from "./keyboard";
|
||||
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