useHotkey.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import { computed, onMounted, onUnmounted } from 'vue'
  2. import { useStore } from 'vuex'
  3. import { State, MutationTypes } from '@/store'
  4. import { KEYS } from '@/configs/hotkey'
  5. import { enterFullscreen } from '@/utils/fullscreen'
  6. import useSlideHandler from '@/hooks/useSlideHandler'
  7. import useLockElement from '@/hooks/useLockElement'
  8. import useDeleteElement from '@/hooks/useDeleteElement'
  9. import useCombineElement from '@/hooks/useCombineElement'
  10. import useCopyAndPasteElement from '@/hooks/useCopyAndPasteElement'
  11. import useSelectAllElement from '@/hooks/useSelectAllElement'
  12. import useMoveElement from '@/hooks/useMoveElement'
  13. import useHistorySnapshot from '@/hooks/useHistorySnapshot'
  14. export default () => {
  15. const store = useStore<State>()
  16. const ctrlKeyActive = computed(() => store.state.ctrlKeyState)
  17. const shiftKeyActive = computed(() => store.state.shiftKeyState)
  18. const disableHotkeys = computed(() => store.state.disableHotkeys)
  19. const activeElementIdList = computed(() => store.state.activeElementIdList)
  20. const editorAreaFocus = computed(() => store.state.editorAreaFocus)
  21. const thumbnailsFocus = computed(() => store.state.thumbnailsFocus)
  22. const {
  23. updateSlideIndex,
  24. copySlide,
  25. createSlide,
  26. deleteSlide,
  27. cutSlide,
  28. } = useSlideHandler()
  29. const { combineElements, uncombineElements } = useCombineElement()
  30. const { deleteElement } = useDeleteElement()
  31. const { lockElement } = useLockElement()
  32. const { copyElement, cutElement } = useCopyAndPasteElement()
  33. const { selectAllElement } = useSelectAllElement()
  34. const { moveElement } = useMoveElement()
  35. const { redo, undo } = useHistorySnapshot()
  36. const copy = () => {
  37. if(activeElementIdList.value.length) copyElement()
  38. else if(thumbnailsFocus.value) copySlide()
  39. }
  40. const cut = () => {
  41. if(disableHotkeys.value) return
  42. if(activeElementIdList.value.length) cutElement()
  43. else if(thumbnailsFocus.value) cutSlide()
  44. }
  45. const selectAll = () => {
  46. if(!editorAreaFocus.value) return
  47. selectAllElement()
  48. }
  49. const lock = () => {
  50. if(!editorAreaFocus.value) return
  51. lockElement()
  52. }
  53. const combine = () => {
  54. if(!editorAreaFocus.value) return
  55. combineElements()
  56. }
  57. const uncombine = () => {
  58. if(!editorAreaFocus.value) return
  59. uncombineElements()
  60. }
  61. const remove = () => {
  62. if(activeElementIdList.value.length) deleteElement()
  63. else if(thumbnailsFocus.value) deleteSlide()
  64. }
  65. const move = (key: string) => {
  66. if(activeElementIdList.value.length) moveElement(key)
  67. else if(key === KEYS.UP || key === KEYS.DOWN) updateSlideIndex(key)
  68. }
  69. const create = () => {
  70. if(!thumbnailsFocus.value) return
  71. createSlide()
  72. }
  73. const enterScreening = () => {
  74. enterFullscreen()
  75. store.commit(MutationTypes.SET_SCREENING, true)
  76. }
  77. const keydownListener = (e: KeyboardEvent) => {
  78. const { ctrlKey, shiftKey } = e
  79. const key = e.key.toUpperCase()
  80. if(ctrlKey && !ctrlKeyActive.value) store.commit(MutationTypes.SET_CTRL_KEY_STATE, true)
  81. if(shiftKey && !shiftKeyActive.value) store.commit(MutationTypes.SET_SHIFT_KEY_STATE, true)
  82. if(ctrlKey && key === KEYS.F) {
  83. e.preventDefault()
  84. enterScreening()
  85. store.commit(MutationTypes.SET_CTRL_KEY_STATE, false)
  86. }
  87. if(!editorAreaFocus.value && !thumbnailsFocus.value) return
  88. if(ctrlKey && key === KEYS.C) {
  89. if(disableHotkeys.value) return
  90. e.preventDefault()
  91. copy()
  92. }
  93. if(ctrlKey && key === KEYS.X) {
  94. if(disableHotkeys.value) return
  95. e.preventDefault()
  96. cut()
  97. }
  98. if(ctrlKey && key === KEYS.Z) {
  99. if(disableHotkeys.value) return
  100. e.preventDefault()
  101. undo()
  102. }
  103. if(ctrlKey && key === KEYS.Y) {
  104. if(disableHotkeys.value) return
  105. e.preventDefault()
  106. redo()
  107. }
  108. if(ctrlKey && key === KEYS.A) {
  109. if(disableHotkeys.value) return
  110. e.preventDefault()
  111. selectAll()
  112. }
  113. if(ctrlKey && key === KEYS.L) {
  114. if(disableHotkeys.value) return
  115. e.preventDefault()
  116. lock()
  117. }
  118. if(!shiftKey && ctrlKey && key === KEYS.G) {
  119. if(disableHotkeys.value) return
  120. e.preventDefault()
  121. combine()
  122. }
  123. if(shiftKey && ctrlKey && key === KEYS.G) {
  124. if(disableHotkeys.value) return
  125. e.preventDefault()
  126. uncombine()
  127. }
  128. if(key === KEYS.DELETE) {
  129. if(disableHotkeys.value) return
  130. e.preventDefault()
  131. remove()
  132. }
  133. if(key === KEYS.UP) {
  134. if(disableHotkeys.value) return
  135. e.preventDefault()
  136. move(KEYS.UP)
  137. }
  138. if(key === KEYS.DOWN) {
  139. if(disableHotkeys.value) return
  140. e.preventDefault()
  141. move(KEYS.DOWN)
  142. }
  143. if(key === KEYS.LEFT) {
  144. if(disableHotkeys.value) return
  145. e.preventDefault()
  146. move(KEYS.LEFT)
  147. }
  148. if(key === KEYS.RIGHT) {
  149. if(disableHotkeys.value) return
  150. e.preventDefault()
  151. move(KEYS.RIGHT)
  152. }
  153. if(key === KEYS.ENTER) {
  154. if(disableHotkeys.value) return
  155. e.preventDefault()
  156. create()
  157. }
  158. }
  159. const keyupListener = () => {
  160. if(ctrlKeyActive.value) store.commit(MutationTypes.SET_CTRL_KEY_STATE, false)
  161. if(shiftKeyActive.value) store.commit(MutationTypes.SET_SHIFT_KEY_STATE, false)
  162. }
  163. onMounted(() => {
  164. document.addEventListener('keydown', keydownListener)
  165. document.addEventListener('keyup', keyupListener)
  166. window.addEventListener('blur', keyupListener)
  167. })
  168. onUnmounted(() => {
  169. document.removeEventListener('keydown', keydownListener)
  170. document.removeEventListener('keyup', keyupListener)
  171. window.removeEventListener('blur', keyupListener)
  172. })
  173. }