feat: Support multi-touch selection
This commit is contained in:
@@ -1160,9 +1160,9 @@ export const I18N = {
|
|||||||
zh_TW: `觸控設定`,
|
zh_TW: `觸控設定`,
|
||||||
},
|
},
|
||||||
touch_translate_shortcut: {
|
touch_translate_shortcut: {
|
||||||
zh: `触屏翻译快捷方式`,
|
zh: `触屏翻译快捷方式 (支持多选)`,
|
||||||
en: `Touch Translate Shortcut`,
|
en: `Touch Translate Shortcut (multiple supported)`,
|
||||||
zh_TW: `觸控翻譯捷徑`,
|
zh_TW: `觸控翻譯捷徑 (支援多選)`,
|
||||||
},
|
},
|
||||||
touch_tap_0: {
|
touch_tap_0: {
|
||||||
zh: `禁用`,
|
zh: `禁用`,
|
||||||
|
|||||||
@@ -166,7 +166,8 @@ export const DEFAULT_SETTING = {
|
|||||||
shortcuts: DEFAULT_SHORTCUTS, // 快捷键
|
shortcuts: DEFAULT_SHORTCUTS, // 快捷键
|
||||||
inputRule: DEFAULT_INPUT_RULE, // 输入框设置
|
inputRule: DEFAULT_INPUT_RULE, // 输入框设置
|
||||||
tranboxSetting: DEFAULT_TRANBOX_SETTING, // 划词翻译设置
|
tranboxSetting: DEFAULT_TRANBOX_SETTING, // 划词翻译设置
|
||||||
touchTranslate: 2, // 触屏翻译 {5:单指双击,6:单指三击,7:双指双击}
|
// touchTranslate: 2, // 触屏翻译 {5:单指双击,6:单指三击,7:双指双击} (作废)
|
||||||
|
touchModes: [2], // 触屏翻译 {5:单指双击,6:单指三击,7:双指双击} (多选)
|
||||||
blacklist: DEFAULT_BLACKLIST.join(",\n"), // 禁用翻译名单
|
blacklist: DEFAULT_BLACKLIST.join(",\n"), // 禁用翻译名单
|
||||||
csplist: DEFAULT_CSPLIST.join(",\n"), // 禁用CSP名单
|
csplist: DEFAULT_CSPLIST.join(",\n"), // 禁用CSP名单
|
||||||
orilist: DEFAULT_ORILIST.join(",\n"), // 禁用CSP名单
|
orilist: DEFAULT_ORILIST.join(",\n"), // 禁用CSP名单
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import { logger } from "./log";
|
|||||||
export default class TranslatorManager {
|
export default class TranslatorManager {
|
||||||
#clearShortcuts = [];
|
#clearShortcuts = [];
|
||||||
#menuCommandIds = [];
|
#menuCommandIds = [];
|
||||||
#clearTouchListener = null;
|
#clearTouchListeners = [];
|
||||||
#isActive = false;
|
#isActive = false;
|
||||||
#isUserscript;
|
#isUserscript;
|
||||||
#isIframe;
|
#isIframe;
|
||||||
@@ -110,10 +110,8 @@ export default class TranslatorManager {
|
|||||||
this.#clearShortcuts = [];
|
this.#clearShortcuts = [];
|
||||||
|
|
||||||
// 触屏
|
// 触屏
|
||||||
if (this.#clearTouchListener) {
|
this.#clearTouchListeners.forEach((clear) => clear());
|
||||||
this.#clearTouchListener();
|
this.#clearTouchListeners = [];
|
||||||
this.#clearTouchListener = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 油猴菜单
|
// 油猴菜单
|
||||||
if (globalThis.GM && this.#menuCommandIds.length > 0) {
|
if (globalThis.GM && this.#menuCommandIds.length > 0) {
|
||||||
@@ -145,8 +143,8 @@ export default class TranslatorManager {
|
|||||||
#setupTouchOperations() {
|
#setupTouchOperations() {
|
||||||
if (this.#isIframe) return;
|
if (this.#isIframe) return;
|
||||||
|
|
||||||
const { touchTranslate = 2 } = this._translator.setting;
|
const { touchModes = [2] } = this._translator.setting;
|
||||||
if (touchTranslate === 0) {
|
if (touchModes.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,35 +152,31 @@ export default class TranslatorManager {
|
|||||||
this.#processActions({ action: MSG_TRANS_TOGGLE });
|
this.#processActions({ action: MSG_TRANS_TOGGLE });
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (touchTranslate) {
|
const handleListener = (mode) => {
|
||||||
case 2:
|
let options = null;
|
||||||
case 3:
|
switch (mode) {
|
||||||
case 4:
|
case 2:
|
||||||
this.#clearTouchListener = touchTapListener(handleTap, {
|
case 3:
|
||||||
taps: 1,
|
case 4:
|
||||||
fingers: touchTranslate,
|
options = { taps: 1, fingers: mode };
|
||||||
});
|
break;
|
||||||
break;
|
case 5:
|
||||||
case 5:
|
options = { taps: 2, fingers: 1 };
|
||||||
this.#clearTouchListener = touchTapListener(handleTap, {
|
break;
|
||||||
taps: 2,
|
case 6:
|
||||||
fingers: 1,
|
options = { taps: 3, fingers: 1 };
|
||||||
});
|
break;
|
||||||
break;
|
case 7:
|
||||||
case 6:
|
options = { taps: 2, fingers: 2 };
|
||||||
this.#clearTouchListener = touchTapListener(handleTap, {
|
break;
|
||||||
taps: 3,
|
default:
|
||||||
fingers: 1,
|
}
|
||||||
});
|
if (options) {
|
||||||
break;
|
this.#clearTouchListeners.push(touchTapListener(handleTap, options));
|
||||||
case 7:
|
}
|
||||||
this.#clearTouchListener = touchTapListener(handleTap, {
|
};
|
||||||
taps: 2,
|
|
||||||
fingers: 2,
|
touchModes.forEach((mode) => handleListener(mode));
|
||||||
});
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#handleWindowMessage(event) {
|
#handleWindowMessage(event) {
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ export default function Settings() {
|
|||||||
newlineLength = TRANS_NEWLINE_LENGTH,
|
newlineLength = TRANS_NEWLINE_LENGTH,
|
||||||
httpTimeout = DEFAULT_HTTP_TIMEOUT,
|
httpTimeout = DEFAULT_HTTP_TIMEOUT,
|
||||||
contextMenuType = 1,
|
contextMenuType = 1,
|
||||||
touchTranslate = 2,
|
touchModes = [2],
|
||||||
blacklist = DEFAULT_BLACKLIST.join(",\n"),
|
blacklist = DEFAULT_BLACKLIST.join(",\n"),
|
||||||
csplist = DEFAULT_CSPLIST.join(",\n"),
|
csplist = DEFAULT_CSPLIST.join(",\n"),
|
||||||
orilist = DEFAULT_ORILIST.join(",\n"),
|
orilist = DEFAULT_ORILIST.join(",\n"),
|
||||||
@@ -268,10 +268,13 @@ export default function Settings() {
|
|||||||
select
|
select
|
||||||
fullWidth
|
fullWidth
|
||||||
size="small"
|
size="small"
|
||||||
name="touchTranslate"
|
name="touchModes"
|
||||||
value={touchTranslate}
|
value={touchModes}
|
||||||
label={i18n("touch_translate_shortcut")}
|
label={i18n("touch_translate_shortcut")}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
|
SelectProps={{
|
||||||
|
multiple: true,
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{[0, 2, 3, 4, 5, 6, 7].map((item) => (
|
{[0, 2, 3, 4, 5, 6, 7].map((item) => (
|
||||||
<MenuItem key={item} value={item}>
|
<MenuItem key={item} value={item}>
|
||||||
|
|||||||
Reference in New Issue
Block a user