useKeyboard.hook.ts 7.0 KB

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