goview_vue/src/views/chart/hooks/useKeyboard.hook.ts

220 lines
7.1 KiB
TypeScript
Raw Normal View History

2022-03-04 20:57:36 +08:00
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
2022-04-12 12:01:40 +08:00
import { WinKeyboard, MacKeyboard, MenuEnum } from '@/enums/editPageEnum'
import throttle from 'lodash/throttle'
import debounce from 'lodash/debounce'
import keymaster from 'keymaster'
// Keymaster可以支持识别以下组合键shiftoptionaltctrlcontrolcommand和⌘
2022-03-04 20:57:36 +08:00
const chartEditStore = useChartEditStore()
2022-02-03 22:54:31 +08:00
2022-04-12 12:01:40 +08:00
const winCtrlMerge = (e: string) => `${WinKeyboard.CTRL}+${e}`
const winShiftMerge = (e: string) => `${WinKeyboard.SHIFT}+${e}`
const winAltMerge = (e: string) => `${WinKeyboard.ALT}+${e}`
export const winKeyboardValue = {
2022-04-13 11:03:30 +08:00
[MenuEnum.ARROW_UP]: winCtrlMerge('up'),
[MenuEnum.ARROW_RIGHT]: winCtrlMerge('right'),
[MenuEnum.ARROW_DOWN]: winCtrlMerge('down'),
[MenuEnum.ARROW_LEFT]: winCtrlMerge('left'),
2022-04-12 12:01:40 +08:00
[MenuEnum.COPY]: winCtrlMerge('c'),
[MenuEnum.CUT]: winCtrlMerge('x'),
[MenuEnum.PARSE]: winCtrlMerge('v'),
2022-02-04 12:17:50 +08:00
[MenuEnum.DELETE]: 'delete',
2022-04-12 12:01:40 +08:00
[MenuEnum.BACK]: winCtrlMerge('z'),
[MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')),
2022-08-09 20:12:44 +08:00
[MenuEnum.GROUP]: winCtrlMerge('g'),
[MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')),
[MenuEnum.LOCK]: winCtrlMerge('l'),
[MenuEnum.UNLOCK]: winCtrlMerge(winShiftMerge('l')),
[MenuEnum.HIDE]: winCtrlMerge('h'),
[MenuEnum.SHOW]: winCtrlMerge(winShiftMerge('h')),
2022-02-04 12:17:50 +08:00
}
2022-04-13 11:03:30 +08:00
// 这个 Ctrl 后面还是换成了 ⌘
2022-04-12 12:01:40 +08:00
const macCtrlMerge = (e: string) => `${MacKeyboard.CTRL}+${e}`
const macShiftMerge = (e: string) => `${MacKeyboard.SHIFT}+${e}`
const macAltMerge = (e: string) => `${MacKeyboard.ALT}+${e}`
// 没有测试 macOS 系统,因为我没有😤👻
export const macKeyboardValue = {
[MenuEnum.ARROW_UP]: macCtrlMerge('arrowup'),
[MenuEnum.ARROW_RIGHT]: macCtrlMerge('arrowright'),
[MenuEnum.ARROW_DOWN]: macCtrlMerge('arrowdown'),
[MenuEnum.ARROW_LEFT]: macCtrlMerge('arrowleft'),
[MenuEnum.COPY]: macCtrlMerge('c'),
[MenuEnum.CUT]: macCtrlMerge('x'),
[MenuEnum.PARSE]: macCtrlMerge('v'),
2022-04-13 11:03:30 +08:00
[MenuEnum.DELETE]: macCtrlMerge('backspace'),
2022-04-12 12:01:40 +08:00
[MenuEnum.BACK]: macCtrlMerge('z'),
[MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')),
2022-08-09 20:12:44 +08:00
[MenuEnum.GROUP]: macCtrlMerge('g'),
[MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')),
[MenuEnum.LOCK]: macCtrlMerge('l'),
[MenuEnum.UNLOCK]: macCtrlMerge(macShiftMerge('l')),
[MenuEnum.HIDE]: macCtrlMerge('h'),
[MenuEnum.SHOW]: macCtrlMerge(macShiftMerge('h')),
2022-04-12 12:01:40 +08:00
}
// Win 快捷键列表
const winKeyList: Array<string> = [
winKeyboardValue.up,
winKeyboardValue.right,
winKeyboardValue.down,
winKeyboardValue.left,
winKeyboardValue.delete,
winKeyboardValue.copy,
winKeyboardValue.cut,
winKeyboardValue.parse,
winKeyboardValue.back,
winKeyboardValue.forward,
2022-08-09 20:12:44 +08:00
winKeyboardValue.group,
winKeyboardValue.unGroup,
winKeyboardValue.lock,
winKeyboardValue.unLock,
winKeyboardValue.hide,
winKeyboardValue.show,
2022-04-12 12:01:40 +08:00
]
// Mac 快捷键列表
const macKeyList: Array<string> = [
macKeyboardValue.up,
macKeyboardValue.right,
macKeyboardValue.down,
macKeyboardValue.left,
2022-02-04 12:17:50 +08:00
2022-04-12 12:01:40 +08:00
macKeyboardValue.delete,
macKeyboardValue.copy,
macKeyboardValue.cut,
macKeyboardValue.parse,
macKeyboardValue.back,
macKeyboardValue.forward,
2022-08-09 20:12:44 +08:00
macKeyboardValue.group,
macKeyboardValue.unGroup,
macKeyboardValue.lock,
macKeyboardValue.unLock,
macKeyboardValue.hide,
macKeyboardValue.show,
2022-04-12 12:01:40 +08:00
]
2022-06-22 14:31:53 +08:00
// 处理键盘记录
const keyRecordHandle = () => {
// 初始化清空
if(window.$KeyboardActive) window.$KeyboardActive = new Set([])
document.onkeydown = (e: KeyboardEvent) => {
2022-06-22 14:31:53 +08:00
if(window.$KeyboardActive) window.$KeyboardActive.add(e.key.toLocaleLowerCase())
else window.$KeyboardActive = new Set([e.key.toLocaleLowerCase()])
}
2022-06-22 14:31:53 +08:00
document.onkeyup = (e: KeyboardEvent) => {
2022-06-22 14:31:53 +08:00
if(window.$KeyboardActive) window.$KeyboardActive.delete(e.key.toLocaleLowerCase())
}
2022-06-22 14:31:53 +08:00
}
2022-04-12 12:01:40 +08:00
// 初始化监听事件
export const useAddKeyboard = () => {
2022-08-09 20:12:44 +08:00
const throttleTime = 50
2022-06-22 14:31:53 +08:00
const switchHandle = (keyboardValue: typeof winKeyboardValue, e: string) => {
2022-04-12 12:01:40 +08:00
switch (e) {
2022-04-13 11:03:30 +08:00
// ct+↑
2022-04-12 12:01:40 +08:00
case keyboardValue.up:
2022-08-09 20:12:44 +08:00
keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_UP); return false }, throttleTime))
break;
2022-04-13 11:03:30 +08:00
// ct+→
2022-04-12 12:01:40 +08:00
case keyboardValue.right:
2022-08-09 20:12:44 +08:00
keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_RIGHT); return false }, throttleTime))
break;
2022-04-13 11:03:30 +08:00
// ct+↓
2022-04-12 12:01:40 +08:00
case keyboardValue.down:
2022-08-09 20:12:44 +08:00
keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_DOWN); return false }, throttleTime))
break;
2022-04-13 11:03:30 +08:00
// ct+←
2022-04-12 12:01:40 +08:00
case keyboardValue.left:
2022-08-09 20:12:44 +08:00
keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_LEFT); return false }, throttleTime))
break;
2022-04-12 12:01:40 +08:00
2022-04-13 11:03:30 +08:00
// 删除 delete
2022-04-12 12:01:40 +08:00
case keyboardValue.delete:
2022-08-09 20:12:44 +08:00
keymaster(e, debounce(() => { chartEditStore.removeComponentList(); return false }, throttleTime))
2022-03-22 10:33:40 +08:00
break;
2022-04-13 11:03:30 +08:00
// 复制 ct+v
2022-04-12 12:01:40 +08:00
case keyboardValue.copy:
2022-08-09 20:12:44 +08:00
keymaster(e, debounce(() => { chartEditStore.setCopy(); return false }, throttleTime))
2022-02-04 12:17:50 +08:00
break;
2022-04-13 11:03:30 +08:00
// 剪切 ct+x
2022-04-12 12:01:40 +08:00
case keyboardValue.cut:
2022-08-09 20:12:44 +08:00
keymaster(e, debounce(() => { chartEditStore.setCut(); return false }, throttleTime))
2022-02-03 22:54:31 +08:00
break;
2022-04-13 11:03:30 +08:00
// 粘贴 ct+v
2022-04-12 12:01:40 +08:00
case keyboardValue.parse:
2022-08-09 20:12:44 +08:00
keymaster(e, throttle(() => { chartEditStore.setParse(); return false }, throttleTime))
2022-02-04 12:17:50 +08:00
break;
2022-04-12 12:01:40 +08:00
2022-04-13 11:03:30 +08:00
// 撤回 ct+z
2022-04-12 12:01:40 +08:00
case keyboardValue.back:
2022-08-09 20:12:44 +08:00
keymaster(e, throttle(() => { chartEditStore.setBack(); return false }, throttleTime))
2022-04-12 12:01:40 +08:00
break;
2022-04-13 11:03:30 +08:00
// 前进 ct+sh+z
2022-04-12 12:01:40 +08:00
case keyboardValue.forward:
2022-08-09 20:12:44 +08:00
keymaster(e, throttle(() => { chartEditStore.setForward(); return false }, throttleTime))
break;
// 创建分组 ct+g
case keyboardValue.group:
keymaster(e, throttle(() => { chartEditStore.setGroup(); return false }, throttleTime))
break;
// 解除分组 ct+sh+g
case keyboardValue.unGroup:
keymaster(e, throttle(() => { chartEditStore.setUnGroup(); return false }, throttleTime))
2022-02-03 22:54:31 +08:00
break;
// 锁定 ct+l
case keyboardValue.lock:
keymaster(e, throttle(() => { chartEditStore.setLock(); return false }, throttleTime))
break;
// 解除锁定 ct+sh+l
case keyboardValue.unLock:
keymaster(e, throttle(() => { chartEditStore.setUnLock(); return false }, throttleTime))
break;
// 锁定 ct+h
case keyboardValue.hide:
keymaster(e, throttle(() => { chartEditStore.setHide(); return false }, throttleTime))
break;
// 解除锁定 ct+sh+h
case keyboardValue.show:
keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime))
break;
2022-02-03 22:54:31 +08:00
}
}
2022-04-12 12:01:40 +08:00
winKeyList.forEach((key: string) => {
2022-06-22 14:31:53 +08:00
switchHandle(winKeyboardValue, key)
2022-04-12 12:01:40 +08:00
})
macKeyList.forEach((key: string) => {
2022-06-22 14:31:53 +08:00
switchHandle(macKeyboardValue, key)
2022-04-12 12:01:40 +08:00
})
2022-06-22 14:31:53 +08:00
keyRecordHandle()
2022-02-03 22:54:31 +08:00
}
2022-04-12 12:01:40 +08:00
// 卸载监听事件
2022-02-03 22:54:31 +08:00
export const useRemoveKeyboard = () => {
2022-06-22 14:31:53 +08:00
document.onkeydown = () => {};
document.onkeyup = () => {};
2022-04-12 12:01:40 +08:00
winKeyList.forEach((key: string) => {
keymaster.unbind(key)
})
macKeyList.forEach((key: string) => {
keymaster.unbind(key)
})
2022-04-13 11:03:30 +08:00
}