From 4f474e1098e7d297b270fefdfa0393c5eeef3308 Mon Sep 17 00:00:00 2001 From: rebecca554owen Date: Wed, 11 Jun 2025 13:21:24 +0800 Subject: [PATCH] feat: add proxy auto scroll toggle setting (#3674) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add proxy auto scroll toggle setting * refactor: rename enable_proxy_auto_scroll to enable_hover_jump_navigator * 参考 Unified Delay 调整式样 --- src-tauri/src/config/verge.rs | 7 ++++++ src/components/proxy/proxy-groups.tsx | 19 ++++++++++---- src/components/setting/mods/layout-viewer.tsx | 25 +++++++++++++++++++ src/components/setting/setting-system.tsx | 1 + src/locales/en.json | 2 ++ src/locales/zh.json | 2 ++ src/services/types.d.ts | 1 + 7 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index 1b8bf872..c26fe7bd 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -200,6 +200,9 @@ pub struct IVerge { /// 自动进入轻量模式的延迟(分钟) pub auto_light_weight_minutes: Option, + /// 启用代理页面自动滚动 + pub enable_hover_jump_navigator: Option, + /// 服务状态跟踪 pub service_state: Option, } @@ -275,6 +278,7 @@ impl IVerge { tun_tray_icon: Some(false), enable_auto_launch: Some(false), enable_silent_start: Some(false), + enable_hover_jump_navigator: Some(true), enable_system_proxy: Some(false), proxy_auto_config: Some(false), pac_file_content: Some(DEFAULT_PAC.into()), @@ -351,6 +355,7 @@ impl IVerge { patch!(enable_tun_mode); patch!(enable_auto_launch); patch!(enable_silent_start); + patch!(enable_hover_jump_navigator); patch!(enable_random_port); #[cfg(not(target_os = "windows"))] patch!(verge_redir_port); @@ -492,6 +497,7 @@ pub struct IVergeResponse { pub auto_light_weight_minutes: Option, pub enable_dns_settings: Option, pub home_cards: Option, + pub enable_hover_jump_navigator: Option, pub service_state: Option, } @@ -561,6 +567,7 @@ impl From for IVergeResponse { auto_light_weight_minutes: verge.auto_light_weight_minutes, enable_dns_settings: verge.enable_dns_settings, home_cards: verge.home_cards, + enable_hover_jump_navigator: verge.enable_hover_jump_navigator, service_state: verge.service_state, } } diff --git a/src/components/proxy/proxy-groups.tsx b/src/components/proxy/proxy-groups.tsx index 463e99cb..fdfe4d95 100644 --- a/src/components/proxy/proxy-groups.tsx +++ b/src/components/proxy/proxy-groups.tsx @@ -106,10 +106,12 @@ const LetterItem = memo( name, onClick, getFirstChar, + enableAutoScroll = true, }: { name: string; onClick: (name: string) => void; getFirstChar: (str: string) => string; + enableAutoScroll?: boolean; }) => { const [showTooltip, setShowTooltip] = useState(false); const letterRef = useRef(null); @@ -136,11 +138,14 @@ const LetterItem = memo( const handleMouseEnter = useCallback(() => { setShowTooltip(true); - // 添加 200ms 的延迟,避免鼠标快速划过时触发滚动 - hoverTimeoutRef.current = setTimeout(() => { - onClick(name); - }, 100); - }, [name, onClick]); + // 只有在启用自动滚动时才触发滚动 + if (enableAutoScroll) { + // 添加 100ms 的延迟,避免鼠标快速划过时触发滚动 + hoverTimeoutRef.current = setTimeout(() => { + onClick(name); + }, 100); + } + }, [name, onClick, enableAutoScroll]); const handleMouseLeave = useCallback(() => { setShowTooltip(false); @@ -198,6 +203,9 @@ export const ProxyGroups = (props: Props) => { const { verge } = useVerge(); const { current, patchCurrent } = useProfiles(); + + // 获取自动滚动开关状态,默认为 true + const enableAutoScroll = verge?.enable_hover_jump_navigator ?? true; const timeout = verge?.default_latency_timeout || 10000; const virtuosoRef = useRef(null); @@ -541,6 +549,7 @@ export const ProxyGroups = (props: Props) => { name={name} onClick={handleLetterClick} getFirstChar={getFirstChar} + enableAutoScroll={enableAutoScroll} /> ))} diff --git a/src/components/setting/mods/layout-viewer.tsx b/src/components/setting/mods/layout-viewer.tsx index c76f4c3a..55425e45 100644 --- a/src/components/setting/mods/layout-viewer.tsx +++ b/src/components/setting/mods/layout-viewer.tsx @@ -12,6 +12,7 @@ import { } from "@mui/material"; import { useVerge } from "@/hooks/use-verge"; import { BaseDialog, DialogRef, Switch } from "@/components/base"; +import { TooltipIcon } from "@/components/base/base-tooltip-icon"; import { GuardState } from "./guard-state"; import { open as openDialog } from "@tauri-apps/plugin-dialog"; import { convertFileSrc } from "@tauri-apps/api/core"; @@ -147,6 +148,30 @@ export const LayoutViewer = forwardRef((props, ref) => { + + + {t("Hover Jump Navigator")} + + + } + /> + onChangeData({ enable_hover_jump_navigator: e })} + onGuard={(e) => patchVerge({ enable_hover_jump_navigator: e })} + > + + + + { enable_silent_start, enable_system_proxy, proxy_auto_config, + enable_hover_jump_navigator, } = verge ?? {}; const onSwitchFormat = (_e: any, value: boolean) => value; diff --git a/src/locales/en.json b/src/locales/en.json index dbfab565..eaea973f 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -261,6 +261,8 @@ "Administrator mode may not support auto launch": "Administrator mode may not support auto launch", "Silent Start": "Silent Start", "Silent Start Info": "Start the program in background mode without displaying the panel", + "Hover Jump Navigator": "Hover Jump Navigator", + "Hover Jump Navigator Info": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters", "TG Channel": "Telegram Channel", "Manual": "Manual", "Github Repo": "Github Repo", diff --git a/src/locales/zh.json b/src/locales/zh.json index 67154fc7..14030788 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -261,6 +261,8 @@ "Administrator mode may not support auto launch": "管理员模式可能不支持开机自启", "Silent Start": "静默启动", "Silent Start Info": "程序启动时以后台模式运行,不显示程序面板", + "Hover Jump Navigator": "悬浮跳转导航", + "Hover Jump Navigator Info": "鼠标悬停在字母上时自动滚动到对应代理组", "TG Channel": "Telegram 频道", "Manual": "使用手册", "Github Repo": "GitHub 项目地址", diff --git a/src/services/types.d.ts b/src/services/types.d.ts index 913e8664..7e03111c 100644 --- a/src/services/types.d.ts +++ b/src/services/types.d.ts @@ -792,6 +792,7 @@ interface IVergeConfig { webdav_username?: string; webdav_password?: string; home_cards?: Record; + enable_hover_jump_navigator?: boolean; } interface IWebDavFile {