grungnet/src/shortcuts.ts

111 lines
3.7 KiB
TypeScript

/**
* @param {KeyboardEvent} event
* @returns {boolean}
*/
function hasModifier(event: KeyboardEvent): boolean {
return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
}
/**
* Key press without any modifiers and ignoring capitals
* @param {KeyboardEvent} event
* @param {string} key
* @returns {boolean}
*/
function singleKey(event: KeyboardEvent, key: string): boolean {
return (
!hasModifier(event) &&
(event.key === key || event.key === key.toUpperCase())
);
}
function undo(event: KeyboardEvent): boolean {
const { key, ctrlKey, metaKey, shiftKey } = event;
return (key === "z" || key === "Z") && (ctrlKey || metaKey) && !shiftKey;
}
function redo(event: KeyboardEvent): boolean {
const { key, ctrlKey, metaKey, shiftKey } = event;
return (key === "z" || key === "Z") && (ctrlKey || metaKey) && shiftKey;
}
function copy(event: KeyboardEvent): boolean {
const { key, ctrlKey, metaKey, shiftKey } = event;
return (key === "c" || key === "C") && (ctrlKey || metaKey) && !shiftKey;
}
function paste(event: KeyboardEvent): boolean {
const { key, ctrlKey, metaKey, shiftKey } = event;
return (key === "v" || key === "V") && (ctrlKey || metaKey) && !shiftKey;
}
function zoomIn(event: KeyboardEvent): boolean {
const { key, ctrlKey, metaKey } = event;
return (key === "=" || key === "+") && !ctrlKey && !metaKey;
}
function zoomOut(event: KeyboardEvent): boolean {
const { key, ctrlKey, metaKey } = event;
return (key === "-" || key === "_") && !ctrlKey && !metaKey;
}
type Shortcut = (event: KeyboardEvent) => boolean;
const shortcuts: Record<string, Shortcut> = {
// Tools
move: (event) => singleKey(event, " "),
moveTool: (event) => singleKey(event, "w"),
drawingTool: (event) => singleKey(event, "d"),
fogTool: (event) => singleKey(event, "f"),
measureTool: (event) => singleKey(event, "m"),
pointerTool: (event) => singleKey(event, "q"),
noteTool: (event) => singleKey(event, "n"),
// Map editor
gridNudgeUp: ({ key }) => key === "ArrowUp",
gridNudgeLeft: ({ key }) => key === "ArrowLeft",
gridNudgeRight: ({ key }) => key === "ArrowRight",
gridNudgeDown: ({ key }) => key === "ArrowDown",
// Drawing tool
drawBrush: (event) => singleKey(event, "b"),
drawPaint: (event) => singleKey(event, "p"),
drawLine: (event) => singleKey(event, "l"),
drawRect: (event) => singleKey(event, "r"),
drawCircle: (event) => singleKey(event, "c"),
drawTriangle: (event) => singleKey(event, "t"),
drawErase: (event) => singleKey(event, "e"),
drawBlend: (event) => singleKey(event, "o"),
drawFill: (event) => singleKey(event, "g"),
// Fog tool
fogPolygon: (event) => singleKey(event, "p"),
fogRectangle: (event) => singleKey(event, "r"),
fogBrush: (event) => singleKey(event, "b"),
fogToggle: (event) => singleKey(event, "t"),
fogErase: (event) => singleKey(event, "e"),
fogLayer: (event) => singleKey(event, "l"),
fogPreview: (event) => singleKey(event, "f"),
fogCut: (event) => singleKey(event, "c"),
fogFinishPolygon: ({ key }) => key === "Enter",
fogCancelPolygon: ({ key }) => key === "Escape",
// Select tool
selectTool: (event) => singleKey(event, "s"),
selectPath: (event) => singleKey(event, "l"),
selectRect: (event) => singleKey(event, "r"),
// Stage interaction
stageZoomIn: zoomIn,
stageZoomOut: zoomOut,
stagePrecisionZoom: ({ key }) => key === "Shift",
// Select
selectRange: ({ key }) => key === "Shift",
selectMultiple: ({ key }) => key === "Control" || key === "Meta",
// Common
undo,
redo,
copy,
paste,
delete: ({ key }) => key === "Backspace" || key === "Delete",
disableSnapping: ({ key }) => key === "Control" || key === "Meta",
duplicate: ({ key }) => key === "Alt",
};
export default shortcuts;