feat: Support multi-touch selection

This commit is contained in:
Gabe
2025-10-26 00:06:52 +08:00
parent 1b646df908
commit 61a515c1d2
4 changed files with 41 additions and 43 deletions

View File

@@ -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: `禁用`,

View File

@@ -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名单

View File

@@ -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) {

View File

@@ -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}>