49 lines
1.7 KiB
TypeScript
49 lines
1.7 KiB
TypeScript
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,
|
|
};
|
|
}
|