useHotkey.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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 { message } from 'ant-design-vue'
  6. export default () => {
  7. const store = useStore<State>()
  8. const ctrlKeyActive = computed(() => store.state.ctrlKeyState)
  9. const shiftKeyActive = computed(() => store.state.shiftKeyState)
  10. const editorAreaFocus = computed(() => store.state.editorAreaFocus)
  11. const thumbnailsFocus = computed(() => store.state.thumbnailsFocus)
  12. const copy = () => {
  13. message.success('copy')
  14. }
  15. const cut = () => {
  16. message.success('cut')
  17. }
  18. const undo = () => {
  19. message.success('undo')
  20. }
  21. const redo = () => {
  22. message.success('redo')
  23. }
  24. const selectAll = () => {
  25. message.success('selectAll')
  26. }
  27. const lock = () => {
  28. message.success('lock')
  29. }
  30. const combine = () => {
  31. message.success('combine')
  32. }
  33. const uncombine = () => {
  34. message.success('uncombine')
  35. }
  36. const remove = () => {
  37. message.success('remove')
  38. }
  39. const move = (key: string) => {
  40. message.success(`move: ${key}`)
  41. }
  42. const create = () => {
  43. message.success('create')
  44. }
  45. const keydownListener = (e: KeyboardEvent) => {
  46. const { ctrlKey, shiftKey } = e
  47. const key = e.key.toUpperCase()
  48. if(ctrlKey && !ctrlKeyActive.value) store.commit(MutationTypes.SET_CTRL_KEY_STATE, true)
  49. if(shiftKey && !shiftKeyActive.value) store.commit(MutationTypes.SET_SHIFT_KEY_STATE, true)
  50. if(!editorAreaFocus.value && !thumbnailsFocus.value) return
  51. if(ctrlKey && key === KEYS.C) {
  52. e.preventDefault()
  53. copy()
  54. }
  55. if(ctrlKey && key === KEYS.X) {
  56. e.preventDefault()
  57. cut()
  58. }
  59. if(ctrlKey && key === KEYS.Z) {
  60. e.preventDefault()
  61. undo()
  62. }
  63. if(ctrlKey && key === KEYS.Y) {
  64. e.preventDefault()
  65. redo()
  66. }
  67. if(ctrlKey && key === KEYS.A) {
  68. e.preventDefault()
  69. selectAll()
  70. }
  71. if(ctrlKey && key === KEYS.L) {
  72. e.preventDefault()
  73. lock()
  74. }
  75. if(!shiftKey && ctrlKey && key === KEYS.G) {
  76. e.preventDefault()
  77. combine()
  78. }
  79. if(shiftKey && ctrlKey && key === KEYS.G) {
  80. e.preventDefault()
  81. uncombine()
  82. }
  83. if(key === KEYS.DELETE) {
  84. e.preventDefault()
  85. remove()
  86. }
  87. if(key === KEYS.UP) {
  88. e.preventDefault()
  89. move(KEYS.UP)
  90. }
  91. if(key === KEYS.DOWN) {
  92. e.preventDefault()
  93. move(KEYS.DOWN)
  94. }
  95. if(key === KEYS.LEFT) {
  96. e.preventDefault()
  97. move(KEYS.LEFT)
  98. }
  99. if(key === KEYS.RIGHT) {
  100. e.preventDefault()
  101. move(KEYS.RIGHT)
  102. }
  103. if(key === KEYS.ENTER) {
  104. e.preventDefault()
  105. create()
  106. }
  107. }
  108. const keyupListener = () => {
  109. if(ctrlKeyActive.value) store.commit(MutationTypes.SET_CTRL_KEY_STATE, false)
  110. if(shiftKeyActive.value) store.commit(MutationTypes.SET_SHIFT_KEY_STATE, false)
  111. }
  112. onMounted(() => {
  113. document.addEventListener('keydown', keydownListener)
  114. document.addEventListener('keyup', keyupListener)
  115. window.addEventListener('blur', keyupListener)
  116. })
  117. onUnmounted(() => {
  118. document.removeEventListener('keydown', keydownListener)
  119. document.removeEventListener('keyup', keyupListener)
  120. window.removeEventListener('blur', keyupListener)
  121. })
  122. }