94 lines
2.4 KiB
TypeScript
94 lines
2.4 KiB
TypeScript
import { type KeyBinding, KeyBindings, KeyCommand } from './types';
|
|
|
|
export function isControlElement(event: Event) {
|
|
return (
|
|
event.target instanceof HTMLButtonElement ||
|
|
event.target instanceof HTMLInputElement ||
|
|
event.target instanceof HTMLLabelElement ||
|
|
event.target instanceof HTMLSelectElement ||
|
|
event.target instanceof HTMLOptionElement ||
|
|
event.target instanceof HTMLTextAreaElement ||
|
|
(event.target instanceof HTMLElement && event.target.isContentEditable)
|
|
);
|
|
}
|
|
|
|
export function isMouseButton(value: number, event: Event) {
|
|
return event instanceof MouseEvent && event.button === value;
|
|
}
|
|
|
|
export const commonKeyBindings: Record<
|
|
string,
|
|
KeyBinding | [enable: KeyBinding, disable: KeyBinding]
|
|
> = {
|
|
spacebar: [
|
|
{
|
|
eventName: 'keydown',
|
|
discriminator: (event) => {
|
|
return event.code === 'Space' && !isControlElement(event);
|
|
},
|
|
},
|
|
{
|
|
eventName: 'keyup',
|
|
discriminator: (event) => event.code === 'Space',
|
|
},
|
|
],
|
|
leftMouse: [
|
|
{
|
|
eventName: 'mousedown',
|
|
discriminator: (event) => {
|
|
return isMouseButton(0, event) && !isControlElement(event);
|
|
},
|
|
},
|
|
{
|
|
eventName: 'mouseup',
|
|
discriminator: (event) => isMouseButton(0, event),
|
|
},
|
|
],
|
|
middleMouse: [
|
|
{
|
|
eventName: 'mousedown',
|
|
discriminator: (event) => isMouseButton(1, event),
|
|
},
|
|
{
|
|
eventName: 'mouseup',
|
|
discriminator: (event) => isMouseButton(1, event),
|
|
},
|
|
],
|
|
metaShiftA: {
|
|
eventName: 'keydown',
|
|
discriminator: (event) => event.key === 'A' && (event.ctrlKey || event.metaKey),
|
|
},
|
|
metaShiftV: {
|
|
eventName: 'keydown',
|
|
discriminator: (event) => event.key === 'V' && (event.ctrlKey || event.metaKey),
|
|
},
|
|
} as const;
|
|
|
|
export const defaultKeyBindings: KeyBindings = {
|
|
[KeyCommand.PTT]: commonKeyBindings.spacebar,
|
|
[KeyCommand.ToggleMic]: commonKeyBindings.metaShiftA,
|
|
[KeyCommand.ToggleCamera]: commonKeyBindings.metaShiftV,
|
|
};
|
|
|
|
export const keybindingOptions: Partial<
|
|
Record<
|
|
KeyCommand,
|
|
{ label: string; binds: KeyBinding | [enable: KeyBinding, disable: KeyBinding] }[]
|
|
>
|
|
> = {
|
|
[KeyCommand.PTT]: [
|
|
{
|
|
label: 'Spacebar',
|
|
binds: commonKeyBindings.spacebar,
|
|
},
|
|
{
|
|
label: 'Left Mouse Button',
|
|
binds: commonKeyBindings.leftMouse,
|
|
},
|
|
{
|
|
label: 'Middle Mouse Button',
|
|
binds: commonKeyBindings.middleMouse,
|
|
},
|
|
],
|
|
};
|