import type { Dispatch } from "@commands/dispatcher"; import type { GlobalKeybindConsumer, KeybindEvent } from "./keyboard"; import type { GlobalPointerConsumer, PointerInputEvent } from "./pointer"; import { createViewportPointerPanHandler } from "./viewport"; export type ViewportPanInputController = { keyDown(event: KeybindEvent): boolean; keyUp(event: KeybindEvent): boolean; pointerDown(event: PointerInputEvent): boolean; pointerMove(event: PointerInputEvent): boolean; pointerUp(event: PointerInputEvent): boolean; isPanMode(): boolean; }; export function createViewportPanInputController(options: { globalKeyConsumer: GlobalKeybindConsumer; globalPointerConsumer: GlobalPointerConsumer; dispatch: Dispatch; getCurrentZoom: () => number; isPanMode: () => boolean; }): ViewportPanInputController { const pointerPan = createViewportPointerPanHandler({ globalConsumer: options.globalPointerConsumer, dispatch: options.dispatch, getCurrentZoom: options.getCurrentZoom, canPan: (event) => event.pointerType !== "mouse" || (event.buttons & 4) === 4 || (options.isPanMode() && (event.buttons & 1) === 1), }); return { keyDown(event) { if (options.globalKeyConsumer(event)) return true; if (event.code !== "Space") return false; options.dispatch("tool.enterTemporaryPan", undefined); return true; }, keyUp(event) { if (event.code !== "Space") return false; options.dispatch("tool.exitTemporaryPan", undefined); return true; }, pointerDown: pointerPan.pointerDown, pointerMove: pointerPan.pointerMove, pointerUp: pointerPan.pointerUp, isPanMode: options.isPanMode, }; }