From b7d6ea8e7a95523d14b5631f6af39760a6b981f1 Mon Sep 17 00:00:00 2001 From: Memory <134070804+Memory2314@users.noreply.github.com> Date: Sat, 20 Dec 2025 00:33:51 +0800 Subject: [PATCH] feat: add tray proxy group style option with submenu mode --- src/main/resolve/tray.ts | 23 ++++++++++--- src/main/utils/template.ts | 1 + .../components/settings/general-config.tsx | 34 ++++++++++++++----- src/renderer/src/locales/en-US.json | 4 +++ src/renderer/src/locales/fa-IR.json | 5 +++ src/renderer/src/locales/ru-RU.json | 5 +++ src/renderer/src/locales/zh-CN.json | 4 +++ src/renderer/src/locales/zh-TW.json | 4 +++ src/shared/types.d.ts | 1 + 9 files changed, 68 insertions(+), 13 deletions(-) diff --git a/src/main/resolve/tray.ts b/src/main/resolve/tray.ts index 740ba9a..5e46041 100644 --- a/src/main/resolve/tray.ts +++ b/src/main/resolve/tray.ts @@ -59,6 +59,7 @@ export const buildContextMenu = async (): Promise => { autoCloseConnection, proxyInTray = true, showCurrentProxyInTray = false, + trayProxyGroupStyle = 'default', triggerSysProxyShortcut = '', showFloatingWindowShortcut = '', showWindowShortcut = '', @@ -73,13 +74,13 @@ export const buildContextMenu = async (): Promise => { if (proxyInTray && process.platform !== 'linux') { try { const groups = await mihomoGroups() - groupsMenu = groups.map((group) => { + const groupItems: Electron.MenuItemConstructorOptions[] = groups.map((group) => { const groupLabel = showCurrentProxyInTray ? `${group.name} | ${group.now}` : group.name return { id: group.name, label: groupLabel, - type: 'submenu', + type: 'submenu' as const, submenu: group.all.map((proxy) => { const delay = proxy.history.length ? proxy.history[proxy.history.length - 1].delay : -1 let displayDelay = `(${delay}ms)` @@ -92,7 +93,7 @@ export const buildContextMenu = async (): Promise => { return { id: proxy.name, label: `${proxy.name} ${displayDelay}`, - type: 'radio', + type: 'radio' as const, checked: proxy.name === group.now, click: async (): Promise => { await mihomoChangeProxy(group.name, proxy.name) @@ -104,7 +105,21 @@ export const buildContextMenu = async (): Promise => { }) } }) - groupsMenu.unshift({ type: 'separator' }) + + if (trayProxyGroupStyle === 'submenu') { + groupsMenu = [ + { type: 'separator' }, + { + id: 'proxy-groups', + label: t('tray.proxyGroups'), + type: 'submenu', + submenu: groupItems + } + ] + } else { + groupsMenu = groupItems + groupsMenu.unshift({ type: 'separator' }) + } } catch (e) { // ignore // 避免出错时无法创建托盘菜单 diff --git a/src/main/utils/template.ts b/src/main/utils/template.ts index 53648f2..f0ff1d2 100644 --- a/src/main/utils/template.ts +++ b/src/main/utils/template.ts @@ -10,6 +10,7 @@ export const defaultConfig: IAppConfig = { useWindowFrame: false, proxyInTray: true, showCurrentProxyInTray: false, + trayProxyGroupStyle: 'default', disableTrayIconColor: false, maxLogDays: 7, proxyCols: 'auto', diff --git a/src/renderer/src/components/settings/general-config.tsx b/src/renderer/src/components/settings/general-config.tsx index 7282ed1..545c446 100644 --- a/src/renderer/src/components/settings/general-config.tsx +++ b/src/renderer/src/components/settings/general-config.tsx @@ -51,6 +51,7 @@ const GeneralConfig: React.FC = () => { showTraffic = false, proxyInTray = true, showCurrentProxyInTray = false, + trayProxyGroupStyle = 'default', disableTray = false, swapTrayClick = false, disableTrayIconColor = false, @@ -360,15 +361,30 @@ const GeneralConfig: React.FC = () => { /> {proxyInTray && ( - - { - await patchAppConfig({ showCurrentProxyInTray: v }) - }} - /> - + <> + + { + await patchAppConfig({ showCurrentProxyInTray: v }) + }} + /> + + + { + patchAppConfig({ trayProxyGroupStyle: key as 'default' | 'submenu' }) + }} + > + + + + + )}