From 61a515c1d2541289188799e6a4237be42deab637 Mon Sep 17 00:00:00 2001 From: Gabe Date: Sun, 26 Oct 2025 00:06:52 +0800 Subject: [PATCH] feat: Support multi-touch selection --- src/config/i18n.js | 6 ++-- src/config/setting.js | 3 +- src/libs/translatorManager.js | 66 ++++++++++++++++------------------- src/views/Options/Setting.js | 9 +++-- 4 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/config/i18n.js b/src/config/i18n.js index 1f3b9d2..df86624 100644 --- a/src/config/i18n.js +++ b/src/config/i18n.js @@ -1160,9 +1160,9 @@ export const I18N = { zh_TW: `觸控設定`, }, touch_translate_shortcut: { - zh: `触屏翻译快捷方式`, - en: `Touch Translate Shortcut`, - zh_TW: `觸控翻譯捷徑`, + zh: `触屏翻译快捷方式 (支持多选)`, + en: `Touch Translate Shortcut (multiple supported)`, + zh_TW: `觸控翻譯捷徑 (支援多選)`, }, touch_tap_0: { zh: `禁用`, diff --git a/src/config/setting.js b/src/config/setting.js index 44d8da7..2bb58b7 100644 --- a/src/config/setting.js +++ b/src/config/setting.js @@ -166,7 +166,8 @@ export const DEFAULT_SETTING = { shortcuts: DEFAULT_SHORTCUTS, // 快捷键 inputRule: DEFAULT_INPUT_RULE, // 输入框设置 tranboxSetting: DEFAULT_TRANBOX_SETTING, // 划词翻译设置 - touchTranslate: 2, // 触屏翻译 {5:单指双击,6:单指三击,7:双指双击} + // touchTranslate: 2, // 触屏翻译 {5:单指双击,6:单指三击,7:双指双击} (作废) + touchModes: [2], // 触屏翻译 {5:单指双击,6:单指三击,7:双指双击} (多选) blacklist: DEFAULT_BLACKLIST.join(",\n"), // 禁用翻译名单 csplist: DEFAULT_CSPLIST.join(",\n"), // 禁用CSP名单 orilist: DEFAULT_ORILIST.join(",\n"), // 禁用CSP名单 diff --git a/src/libs/translatorManager.js b/src/libs/translatorManager.js index 66c2a56..5a3547b 100644 --- a/src/libs/translatorManager.js +++ b/src/libs/translatorManager.js @@ -28,7 +28,7 @@ import { logger } from "./log"; export default class TranslatorManager { #clearShortcuts = []; #menuCommandIds = []; - #clearTouchListener = null; + #clearTouchListeners = []; #isActive = false; #isUserscript; #isIframe; @@ -110,10 +110,8 @@ export default class TranslatorManager { this.#clearShortcuts = []; // 触屏 - if (this.#clearTouchListener) { - this.#clearTouchListener(); - this.#clearTouchListener = null; - } + this.#clearTouchListeners.forEach((clear) => clear()); + this.#clearTouchListeners = []; // 油猴菜单 if (globalThis.GM && this.#menuCommandIds.length > 0) { @@ -145,8 +143,8 @@ export default class TranslatorManager { #setupTouchOperations() { if (this.#isIframe) return; - const { touchTranslate = 2 } = this._translator.setting; - if (touchTranslate === 0) { + const { touchModes = [2] } = this._translator.setting; + if (touchModes.length === 0) { return; } @@ -154,35 +152,31 @@ export default class TranslatorManager { this.#processActions({ action: MSG_TRANS_TOGGLE }); }; - switch (touchTranslate) { - case 2: - case 3: - case 4: - this.#clearTouchListener = touchTapListener(handleTap, { - taps: 1, - fingers: touchTranslate, - }); - break; - case 5: - this.#clearTouchListener = touchTapListener(handleTap, { - taps: 2, - fingers: 1, - }); - break; - case 6: - this.#clearTouchListener = touchTapListener(handleTap, { - taps: 3, - fingers: 1, - }); - break; - case 7: - this.#clearTouchListener = touchTapListener(handleTap, { - taps: 2, - fingers: 2, - }); - break; - default: - } + const handleListener = (mode) => { + let options = null; + switch (mode) { + case 2: + case 3: + case 4: + options = { taps: 1, fingers: mode }; + break; + case 5: + options = { taps: 2, fingers: 1 }; + break; + case 6: + options = { taps: 3, fingers: 1 }; + break; + case 7: + options = { taps: 2, fingers: 2 }; + break; + default: + } + if (options) { + this.#clearTouchListeners.push(touchTapListener(handleTap, options)); + } + }; + + touchModes.forEach((mode) => handleListener(mode)); } #handleWindowMessage(event) { diff --git a/src/views/Options/Setting.js b/src/views/Options/Setting.js index 7cc1ff1..61553a9 100644 --- a/src/views/Options/Setting.js +++ b/src/views/Options/Setting.js @@ -94,7 +94,7 @@ export default function Settings() { newlineLength = TRANS_NEWLINE_LENGTH, httpTimeout = DEFAULT_HTTP_TIMEOUT, contextMenuType = 1, - touchTranslate = 2, + touchModes = [2], blacklist = DEFAULT_BLACKLIST.join(",\n"), csplist = DEFAULT_CSPLIST.join(",\n"), orilist = DEFAULT_ORILIST.join(",\n"), @@ -268,10 +268,13 @@ export default function Settings() { select fullWidth size="small" - name="touchTranslate" - value={touchTranslate} + name="touchModes" + value={touchModes} label={i18n("touch_translate_shortcut")} onChange={handleChange} + SelectProps={{ + multiple: true, + }} > {[0, 2, 3, 4, 5, 6, 7].map((item) => (