Files
rsgp/src/lib/utils/keyboard.ts

64 lines
1.6 KiB
TypeScript

export interface KeyboardActions {
onMutate?: () => void;
onRandom?: () => void;
onProcess?: () => void;
onDownload?: () => void;
onDurationDecrease?: (large: boolean) => void;
onDurationIncrease?: (large: boolean) => void;
onVolumeDecrease?: (large: boolean) => void;
onVolumeIncrease?: (large: boolean) => void;
onEscape?: () => void;
onUndo?: () => void;
onPlayFromStart?: () => void;
}
export function createKeyboardHandler(actions: KeyboardActions) {
return (event: KeyboardEvent) => {
if (event.target instanceof HTMLInputElement) return;
const key = event.key.toLowerCase();
const isLargeAdjustment = event.shiftKey;
switch (key) {
case 'z':
actions.onUndo?.();
break;
case 'm':
actions.onMutate?.();
break;
case 'r':
actions.onRandom?.();
break;
case 'p':
actions.onProcess?.();
break;
case 'd':
actions.onDownload?.();
break;
case ' ':
event.preventDefault();
actions.onPlayFromStart?.();
break;
case 'arrowleft':
event.preventDefault();
actions.onDurationDecrease?.(isLargeAdjustment);
break;
case 'arrowright':
event.preventDefault();
actions.onDurationIncrease?.(isLargeAdjustment);
break;
case 'arrowdown':
event.preventDefault();
actions.onVolumeDecrease?.(isLargeAdjustment);
break;
case 'arrowup':
event.preventDefault();
actions.onVolumeIncrease?.(isLargeAdjustment);
break;
case 'escape':
actions.onEscape?.();
break;
}
};
}