2022-05-26 15:18:53 +08:00
|
|
|
|
import {isCtrl} from "./compatibility";
|
2022-09-25 12:25:01 +08:00
|
|
|
|
import {Constants} from "../../constants";
|
2022-05-26 15:18:53 +08:00
|
|
|
|
|
2022-09-25 12:25:01 +08:00
|
|
|
|
// 是否匹配 ⇧⌘[] / ⌘[] / ⌥[] / ⌥⌘[] / ⌥⇧[] / ⌥⇧⌘[] / ⇧[] / []
|
2022-05-26 15:18:53 +08:00
|
|
|
|
export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
|
|
|
|
|
|
if (hotKey === "") {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// []
|
|
|
|
|
|
if (hotKey.indexOf("⇧") === -1 && hotKey.indexOf("⌘") === -1 && hotKey.indexOf("⌥") === -1 && hotKey.indexOf("⌃") === -1) {
|
|
|
|
|
|
if (hotKey === "⇥") {
|
|
|
|
|
|
hotKey = "Tab";
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!event.ctrlKey && !isCtrl(event) && !event.altKey && !event.shiftKey && event.code === hotKey) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-18 20:11:20 +08:00
|
|
|
|
const hotKeys = hotKey.split("");
|
|
|
|
|
|
if (hotKey.endsWith("↑") || hotKey.endsWith("↓") || hotKey.endsWith("→") || hotKey.endsWith("←") ||
|
|
|
|
|
|
hotKey.endsWith("↩") || hotKey.endsWith("⇥") || hotKey.indexOf("F") > -1) {
|
2022-05-26 15:18:53 +08:00
|
|
|
|
hotKeys.forEach((item, index) => {
|
|
|
|
|
|
if (item === "↑") {
|
|
|
|
|
|
hotKeys[index] = "ArrowUp";
|
|
|
|
|
|
} else if (item === "↓") {
|
|
|
|
|
|
hotKeys[index] = "ArrowDown";
|
|
|
|
|
|
} else if (item === "←") {
|
|
|
|
|
|
hotKeys[index] = "ArrowLeft";
|
|
|
|
|
|
} else if (item === "→") {
|
|
|
|
|
|
hotKeys[index] = "ArrowRight";
|
|
|
|
|
|
} else if (item === "⇥") {
|
|
|
|
|
|
hotKeys[index] = "Tab";
|
2022-06-18 20:11:20 +08:00
|
|
|
|
} else if (item === "↩") {
|
2022-05-26 15:18:53 +08:00
|
|
|
|
hotKeys[index] = "Enter";
|
2022-06-18 20:11:20 +08:00
|
|
|
|
} else if (item === "F") {
|
|
|
|
|
|
// F1-F12
|
|
|
|
|
|
hotKeys[index] = "F" + hotKeys.splice(index + 1, 1);
|
|
|
|
|
|
if (hotKeys[index + 1]) {
|
|
|
|
|
|
hotKeys[index + 1] += hotKeys.splice(index + 1, 1);
|
|
|
|
|
|
}
|
2022-05-26 15:18:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-25 12:25:01 +08:00
|
|
|
|
// 是否匹配 ⇧[]
|
2022-10-08 14:58:22 +08:00
|
|
|
|
if (hotKey.startsWith("⇧") && hotKeys.length === 2) {
|
|
|
|
|
|
if (!event.ctrlKey && !isCtrl(event) && !event.altKey && event.shiftKey) {
|
|
|
|
|
|
if (event.code.startsWith("Digit") || event.code.startsWith("Numpad")) {
|
2022-11-02 19:11:26 +08:00
|
|
|
|
if (hotKeys[1] === event.code.slice(-1) || event.key === hotKeys[1]) {
|
2022-10-08 14:58:22 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (event.key === hotKeys[1]) {
|
2022-09-25 12:25:01 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2022-05-26 15:18:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (hotKey.startsWith("⌥")) {
|
2022-09-09 11:17:19 +08:00
|
|
|
|
let keyCode = hotKeys.length === 3 ? hotKeys[2] : hotKeys[1];
|
|
|
|
|
|
if (hotKeys.length === 4) {
|
|
|
|
|
|
keyCode = hotKeys[3];
|
|
|
|
|
|
}
|
2022-09-25 12:25:01 +08:00
|
|
|
|
|
|
|
|
|
|
let isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) ||
|
2022-11-02 19:11:26 +08:00
|
|
|
|
event.code === keyCode ||
|
|
|
|
|
|
event.key === keyCode; // 小键盘上的 /*-+.
|
2022-09-25 12:25:01 +08:00
|
|
|
|
if (Constants.KEYCODE[event.keyCode]) {
|
|
|
|
|
|
if (event.shiftKey) {
|
|
|
|
|
|
isMatchKey = Constants.KEYCODE[event.keyCode][1] === keyCode;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
isMatchKey = Constants.KEYCODE[event.keyCode][0] === keyCode;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-05-26 15:18:53 +08:00
|
|
|
|
// 是否匹配 ⌥[] / ⌥⌘[]
|
2022-10-07 23:31:43 +08:00
|
|
|
|
if (isMatchKey && event.altKey && !event.shiftKey &&
|
|
|
|
|
|
(hotKeys.length === 3 ? (isCtrl(event) && hotKey.startsWith("⌥⌘")) : !isCtrl(event))) {
|
2022-09-09 11:17:19 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
// ⌥⇧⌘[]
|
2022-10-07 23:31:43 +08:00
|
|
|
|
if (isMatchKey && hotKey.startsWith("⌥⇧⌘") && hotKeys.length === 4 &&
|
|
|
|
|
|
event.altKey && event.shiftKey && isCtrl(event)) {
|
2022-09-09 11:17:19 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
// ⌥⇧[]
|
2022-10-07 23:31:43 +08:00
|
|
|
|
if (isMatchKey && hotKey.startsWith("⌥⇧") && hotKeys.length === 3 &&
|
|
|
|
|
|
event.altKey && event.shiftKey && !isCtrl(event)) {
|
2022-05-26 15:18:53 +08:00
|
|
|
|
return true;
|
2023-04-15 11:39:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 是否匹配 ⌃[] / ⌃⌥[] / ⌃⇧[]/ ⌃⌥⇧[]
|
|
|
|
|
|
if (hotKey.startsWith("⌃")) {
|
|
|
|
|
|
let keyCode = hotKeys.length === 3 ? hotKeys[2] : hotKeys[1];
|
|
|
|
|
|
if (hotKeys.length === 4) {
|
|
|
|
|
|
keyCode = hotKeys[3];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) ||
|
|
|
|
|
|
event.code === keyCode ||
|
|
|
|
|
|
event.key === keyCode; // 小键盘上的 /*-+.
|
|
|
|
|
|
if (Constants.KEYCODE[event.keyCode]) {
|
|
|
|
|
|
if (event.shiftKey) {
|
|
|
|
|
|
isMatchKey = Constants.KEYCODE[event.keyCode][1] === keyCode;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
isMatchKey = Constants.KEYCODE[event.keyCode][0] === keyCode;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 是否匹配 ⌃[]
|
|
|
|
|
|
if (isMatchKey && hotKeys.length === 2 &&
|
|
|
|
|
|
event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
// ⌃⇧[]
|
|
|
|
|
|
if (isMatchKey && hotKey.startsWith("⌃⇧") && hotKeys.length === 3 &&
|
|
|
|
|
|
event.ctrlKey && !event.altKey && event.shiftKey && !event.metaKey) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
// ⌃⌥[]
|
|
|
|
|
|
if (isMatchKey && hotKey.startsWith("⌃⌥") && hotKeys.length === 3 &&
|
|
|
|
|
|
event.ctrlKey && event.altKey && !event.shiftKey && !event.metaKey) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
// ⌃⌥⇧[]
|
|
|
|
|
|
if (isMatchKey && hotKey.startsWith("⌃⌥⇧") && hotKeys.length === 4 &&
|
|
|
|
|
|
event.ctrlKey && event.altKey && event.shiftKey && !event.metaKey) {
|
|
|
|
|
|
return true;
|
2022-05-26 15:18:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 是否匹配 ⇧⌘[] / ⌘[]
|
|
|
|
|
|
const hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧");
|
2022-09-25 12:25:01 +08:00
|
|
|
|
if (isCtrl(event) && !event.altKey && ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) {
|
|
|
|
|
|
const keyCode = (hasShift ? hotKeys[2] : hotKeys[1]);
|
2022-09-27 00:35:50 +08:00
|
|
|
|
let isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) ||
|
|
|
|
|
|
event.code === keyCode || event.key.toLowerCase() === keyCode.toLowerCase();
|
2022-09-25 12:25:01 +08:00
|
|
|
|
// 更新 electron 后不需要判断 Mac,但 Mac 下中英文有区别,需使用 keyCode 辅助
|
|
|
|
|
|
if (Constants.KEYCODE[event.keyCode]) {
|
|
|
|
|
|
if (event.shiftKey) {
|
|
|
|
|
|
isMatchKey = Constants.KEYCODE[event.keyCode][1] === keyCode;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
isMatchKey = Constants.KEYCODE[event.keyCode][0] === keyCode;
|
|
|
|
|
|
}
|
2022-05-26 15:18:53 +08:00
|
|
|
|
}
|
2022-09-25 12:25:01 +08:00
|
|
|
|
return isMatchKey;
|
2022-05-26 15:18:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
};
|
|
|
|
|
|
|