useKeyboard.hook.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  2. import { useSync } from './useSync.hook'
  3. import { WinKeyboard, MacKeyboard, MenuEnum } from '@/enums/editPageEnum'
  4. import throttle from 'lodash/throttle'
  5. import debounce from 'lodash/debounce'
  6. import keymaster from 'keymaster'
  7. // Keymaster可以支持识别以下组合键: ⇧,shift,option,⌥,alt,ctrl,control,command,和⌘
  8. const chartEditStore = useChartEditStore()
  9. const useSyncIns = useSync()
  10. const winCtrlMerge = (e: string) => `${WinKeyboard.CTRL}+${e}`
  11. const winShiftMerge = (e: string) => `${WinKeyboard.SHIFT}+${e}`
  12. const winAltMerge = (e: string) => `${WinKeyboard.ALT}+${e}`
  13. export const winKeyboardValue = {
  14. [MenuEnum.ARROW_UP]: winCtrlMerge('up'),
  15. [MenuEnum.ARROW_RIGHT]: winCtrlMerge('right'),
  16. [MenuEnum.ARROW_DOWN]: winCtrlMerge('down'),
  17. [MenuEnum.ARROW_LEFT]: winCtrlMerge('left'),
  18. [MenuEnum.COPY]: winCtrlMerge('c'),
  19. [MenuEnum.CUT]: winCtrlMerge('x'),
  20. [MenuEnum.PARSE]: winCtrlMerge('v'),
  21. [MenuEnum.DELETE]: 'delete',
  22. [MenuEnum.BACK]: winCtrlMerge('z'),
  23. [MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')),
  24. [MenuEnum.SAVE]: winCtrlMerge('s'),
  25. [MenuEnum.GROUP]: winCtrlMerge('g'),
  26. [MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')),
  27. }
  28. // 这个 Ctrl 后面还是换成了 ⌘
  29. const macCtrlMerge = (e: string) => `${MacKeyboard.CTRL}+${e}`
  30. const macShiftMerge = (e: string) => `${MacKeyboard.SHIFT}+${e}`
  31. const macAltMerge = (e: string) => `${MacKeyboard.ALT}+${e}`
  32. // 没有测试 macOS 系统,因为我没有😤👻
  33. export const macKeyboardValue = {
  34. [MenuEnum.ARROW_UP]: macCtrlMerge('arrowup'),
  35. [MenuEnum.ARROW_RIGHT]: macCtrlMerge('arrowright'),
  36. [MenuEnum.ARROW_DOWN]: macCtrlMerge('arrowdown'),
  37. [MenuEnum.ARROW_LEFT]: macCtrlMerge('arrowleft'),
  38. [MenuEnum.COPY]: macCtrlMerge('c'),
  39. [MenuEnum.CUT]: macCtrlMerge('x'),
  40. [MenuEnum.PARSE]: macCtrlMerge('v'),
  41. [MenuEnum.DELETE]: macCtrlMerge('backspace'),
  42. [MenuEnum.BACK]: macCtrlMerge('z'),
  43. [MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')),
  44. [MenuEnum.SAVE]: macCtrlMerge('s'),
  45. [MenuEnum.GROUP]: macCtrlMerge('g'),
  46. [MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')),
  47. }
  48. // Win 快捷键列表
  49. const winKeyList: Array<string> = [
  50. winKeyboardValue.up,
  51. winKeyboardValue.right,
  52. winKeyboardValue.down,
  53. winKeyboardValue.left,
  54. winKeyboardValue.delete,
  55. winKeyboardValue.copy,
  56. winKeyboardValue.cut,
  57. winKeyboardValue.parse,
  58. winKeyboardValue.back,
  59. winKeyboardValue.forward,
  60. winKeyboardValue.save,
  61. winKeyboardValue.group,
  62. winKeyboardValue.unGroup,
  63. ]
  64. // Mac 快捷键列表
  65. const macKeyList: Array<string> = [
  66. macKeyboardValue.up,
  67. macKeyboardValue.right,
  68. macKeyboardValue.down,
  69. macKeyboardValue.left,
  70. macKeyboardValue.delete,
  71. macKeyboardValue.copy,
  72. macKeyboardValue.cut,
  73. macKeyboardValue.parse,
  74. macKeyboardValue.back,
  75. macKeyboardValue.forward,
  76. macKeyboardValue.save,
  77. macKeyboardValue.group,
  78. macKeyboardValue.unGroup,
  79. ]
  80. // 处理键盘记录
  81. const keyRecordHandle = () => {
  82. // 初始化清空
  83. if(window.$KeyboardActive) window.$KeyboardActive = new Set([])
  84. document.onkeydown = (e: KeyboardEvent) => {
  85. if(window.$KeyboardActive) window.$KeyboardActive.add(e.key.toLocaleLowerCase())
  86. else window.$KeyboardActive = new Set([e.key.toLocaleLowerCase()])
  87. }
  88. document.onkeyup = (e: KeyboardEvent) => {
  89. if(window.$KeyboardActive) window.$KeyboardActive.delete(e.key.toLocaleLowerCase())
  90. }
  91. }
  92. // 初始化监听事件
  93. export const useAddKeyboard = () => {
  94. const throttleTime = 50
  95. const switchHandle = (keyboardValue: typeof winKeyboardValue, e: string) => {
  96. switch (e) {
  97. // ct+↑
  98. case keyboardValue.up:
  99. keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_UP); return false }, throttleTime))
  100. break;
  101. // ct+→
  102. case keyboardValue.right:
  103. keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_RIGHT); return false }, throttleTime))
  104. break;
  105. // ct+↓
  106. case keyboardValue.down:
  107. keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_DOWN); return false }, throttleTime))
  108. break;
  109. // ct+←
  110. case keyboardValue.left:
  111. keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_LEFT); return false }, throttleTime))
  112. break;
  113. // 删除 delete
  114. case keyboardValue.delete:
  115. keymaster(e, debounce(() => { chartEditStore.removeComponentList(); return false }, throttleTime))
  116. break;
  117. // 复制 ct+v
  118. case keyboardValue.copy:
  119. keymaster(e, debounce(() => { chartEditStore.setCopy(); return false }, throttleTime))
  120. break;
  121. // 剪切 ct+x
  122. case keyboardValue.cut:
  123. keymaster(e, debounce(() => { chartEditStore.setCut(); return false }, throttleTime))
  124. break;
  125. // 粘贴 ct+v
  126. case keyboardValue.parse:
  127. keymaster(e, throttle(() => { chartEditStore.setParse(); return false }, throttleTime))
  128. break;
  129. // 撤回 ct+z
  130. case keyboardValue.back:
  131. keymaster(e, throttle(() => { chartEditStore.setBack(); return false }, throttleTime))
  132. break;
  133. // 前进 ct+sh+z
  134. case keyboardValue.forward:
  135. keymaster(e, throttle(() => { chartEditStore.setForward(); return false }, throttleTime))
  136. break;
  137. // 创建分组 ct+g
  138. case keyboardValue.group:
  139. keymaster(e, throttle(() => { chartEditStore.setGroup(); return false }, throttleTime))
  140. break;
  141. // 解除分组 ct+sh+g
  142. case keyboardValue.unGroup:
  143. keymaster(e, throttle(() => { chartEditStore.setUnGroup(); return false }, throttleTime))
  144. break;
  145. // 保存 ct+s
  146. case keyboardValue.save:
  147. keymaster(e, throttle(() => { useSyncIns.dataSyncUpdate(); return false }, 200))
  148. break;
  149. }
  150. }
  151. winKeyList.forEach((key: string) => {
  152. switchHandle(winKeyboardValue, key)
  153. })
  154. macKeyList.forEach((key: string) => {
  155. switchHandle(macKeyboardValue, key)
  156. })
  157. keyRecordHandle()
  158. }
  159. // 卸载监听事件
  160. export const useRemoveKeyboard = () => {
  161. document.onkeydown = () => {};
  162. document.onkeyup = () => {};
  163. winKeyList.forEach((key: string) => {
  164. keymaster.unbind(key)
  165. })
  166. macKeyList.forEach((key: string) => {
  167. keymaster.unbind(key)
  168. })
  169. }