All files / src/functions HotkeyScope.ts

88.67% Statements 47/53
75% Branches 6/8
72.72% Functions 8/11
88.23% Lines 45/51

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104        10x 10x 10x 10x 10x 10x 10x         10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x       60x                                                 60x 60x 1x                 1x 1x   1x     1x 1x       1x 1x         60x       60x      
import hotkeys, { HotkeysEvent } from 'hotkeys-js';
import { isMac } from '@/functions/platform';
import { MaybePromise } from 'rollup';
 
export enum HotkeyScope {
  MCAD_MENU = 'mcad_menu',
  PRIMARY = 'primary',
  MEASUREMENT_MENU = 'measurement_menu',
  ANNOTATION_MENU = 'annotation_menu',
  ANNOTATION_TOOLS = 'annotation_tools',
  MEASUREMENT_TOOLS = 'measurement_tools',
  // NAVIGATION_DRAWER = 'navigation_drawer'
}
 
// Always Windows keys. Mac keys will be generated at runtime.
export enum Hotkeys {
  CTRL_SHIFT_A = 'ctrl+shift+a',
  CTRL_SHIFT_C = 'ctrl+shift+c',
  CTRL_SHIFT_D = 'ctrl+shift+d',
  CTRL_SHIFT_DEL = 'ctrl+shift+del',
  CTRL_SHIFT_E = 'ctrl+shift+e',
  CTRL_SHIFT_F = 'ctrl+shift+f',
  CTRL_SHIFT_G = 'ctrl+shift+g',
  CTRL_SHIFT_H = 'ctrl+shift+h',
  CTRL_SHIFT_L = 'ctrl+shift+l',
  CTRL_SHIFT_M = 'ctrl+shift+m',
  CTRL_SHIFT_P = 'ctrl+shift+p',
  CTRL_SHIFT_Q = 'ctrl+shift+q',
  CTRL_SHIFT_R = 'ctrl+shift+r',
  CTRL_SHIFT_S = 'ctrl+shift+s',
  CTRL_SHIFT_V = 'ctrl+shift+v',
  CTRL_SHIFT_PLUS = 'ctrl+shift++',
  CTRL_SHIFT_MINUS = 'ctrl+shift+-',
  CTRL_SHIFT_SPACE = 'ctrl+shift+space',
  ALT_A = 'alt+a',
  ALT_H = 'alt+h',
  ALT_D = 'alt+d',
  ALT_M = 'alt+m',
  ALT_E = 'alt+e',
  ALT_F = 'alt+f',
}
 
function generateHotkey(...params: Array<string[]>) {
  return params.map(String).join(',');
}
 
type HotkeyDefinition = {
  [key in Hotkeys]?: (event: any, handler: any) => MaybePromise<void>;
};
 
// Vitest not liking us testing defaultfunctions with object modifiers
/* v8 ignore start -- @preserve */
export function defineHotkeys(
  scope: HotkeyScope,
  definition: HotkeyDefinition,
) {
  const keys = transformHotkeysMac(Object.values(Object.keys(definition)));
  hotkeys(
    generateHotkey(keys),
    scope,
    (event: KeyboardEvent, handler: HotkeysEvent) =>
      hotKeyHandler(definition, event, handler),
  );
  hotkeys.setScope(scope);
}
/* v8 ignore stop -- @preserve */
 
export function defaultHotkeys(definition: HotkeyDefinition) {
  const keys = transformHotkeysMac(Object.values(Object.keys(definition)));
  hotkeys(generateHotkey(keys), (event: KeyboardEvent, handler: HotkeysEvent) =>
    hotKeyHandler(definition, event, handler),
  );
}
 
function hotKeyHandler(
  definition: HotkeyDefinition,
  event: KeyboardEvent,
  handler: HotkeysEvent,
) {
  event.preventDefault();
  const key = handler.key as Hotkeys;
  const method =
    definition[
      key.replace('command', 'ctrl').replace('option', 'alt') as Hotkeys
    ];
  Eif (method) {
    method(event, handler);
  }
}
export function resetScope(scope: HotkeyScope) {
  hotkeys.deleteScope(scope);
  hotkeys.setScope(HotkeyScope.PRIMARY);
}
 
/* v8 ignore start -- @preserve */
function transformHotkeysMac(keys: string[]): string[] {
  Iif (isMac())
    return keys.map((key) =>
      key.replace('ctrl', 'command').replace('alt', 'option'),
    );
  return keys;
}
/* v8 ignore stop -- @preserve */