feat: add tray proxy group style option with submenu mode

This commit is contained in:
Memory 2025-12-20 00:33:51 +08:00 committed by GitHub
parent 51d169d2e8
commit b7d6ea8e7a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 68 additions and 13 deletions

View File

@ -59,6 +59,7 @@ export const buildContextMenu = async (): Promise<Menu> => {
autoCloseConnection, autoCloseConnection,
proxyInTray = true, proxyInTray = true,
showCurrentProxyInTray = false, showCurrentProxyInTray = false,
trayProxyGroupStyle = 'default',
triggerSysProxyShortcut = '', triggerSysProxyShortcut = '',
showFloatingWindowShortcut = '', showFloatingWindowShortcut = '',
showWindowShortcut = '', showWindowShortcut = '',
@ -73,13 +74,13 @@ export const buildContextMenu = async (): Promise<Menu> => {
if (proxyInTray && process.platform !== 'linux') { if (proxyInTray && process.platform !== 'linux') {
try { try {
const groups = await mihomoGroups() const groups = await mihomoGroups()
groupsMenu = groups.map((group) => { const groupItems: Electron.MenuItemConstructorOptions[] = groups.map((group) => {
const groupLabel = showCurrentProxyInTray ? `${group.name} | ${group.now}` : group.name const groupLabel = showCurrentProxyInTray ? `${group.name} | ${group.now}` : group.name
return { return {
id: group.name, id: group.name,
label: groupLabel, label: groupLabel,
type: 'submenu', type: 'submenu' as const,
submenu: group.all.map((proxy) => { submenu: group.all.map((proxy) => {
const delay = proxy.history.length ? proxy.history[proxy.history.length - 1].delay : -1 const delay = proxy.history.length ? proxy.history[proxy.history.length - 1].delay : -1
let displayDelay = `(${delay}ms)` let displayDelay = `(${delay}ms)`
@ -92,7 +93,7 @@ export const buildContextMenu = async (): Promise<Menu> => {
return { return {
id: proxy.name, id: proxy.name,
label: `${proxy.name} ${displayDelay}`, label: `${proxy.name} ${displayDelay}`,
type: 'radio', type: 'radio' as const,
checked: proxy.name === group.now, checked: proxy.name === group.now,
click: async (): Promise<void> => { click: async (): Promise<void> => {
await mihomoChangeProxy(group.name, proxy.name) await mihomoChangeProxy(group.name, proxy.name)
@ -104,7 +105,21 @@ export const buildContextMenu = async (): Promise<Menu> => {
}) })
} }
}) })
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) { } catch (e) {
// ignore // ignore
// 避免出错时无法创建托盘菜单 // 避免出错时无法创建托盘菜单

View File

@ -10,6 +10,7 @@ export const defaultConfig: IAppConfig = {
useWindowFrame: false, useWindowFrame: false,
proxyInTray: true, proxyInTray: true,
showCurrentProxyInTray: false, showCurrentProxyInTray: false,
trayProxyGroupStyle: 'default',
disableTrayIconColor: false, disableTrayIconColor: false,
maxLogDays: 7, maxLogDays: 7,
proxyCols: 'auto', proxyCols: 'auto',

View File

@ -51,6 +51,7 @@ const GeneralConfig: React.FC = () => {
showTraffic = false, showTraffic = false,
proxyInTray = true, proxyInTray = true,
showCurrentProxyInTray = false, showCurrentProxyInTray = false,
trayProxyGroupStyle = 'default',
disableTray = false, disableTray = false,
swapTrayClick = false, swapTrayClick = false,
disableTrayIconColor = false, disableTrayIconColor = false,
@ -360,15 +361,30 @@ const GeneralConfig: React.FC = () => {
/> />
</SettingItem> </SettingItem>
{proxyInTray && ( {proxyInTray && (
<SettingItem title={t('settings.showCurrentProxyInTray')} divider> <>
<Switch <SettingItem title={t('settings.showCurrentProxyInTray')} divider>
size="sm" <Switch
isSelected={showCurrentProxyInTray} size="sm"
onValueChange={async (v) => { isSelected={showCurrentProxyInTray}
await patchAppConfig({ showCurrentProxyInTray: v }) onValueChange={async (v) => {
}} await patchAppConfig({ showCurrentProxyInTray: v })
/> }}
</SettingItem> />
</SettingItem>
<SettingItem title={t('settings.trayProxyGroupStyle')} divider>
<Tabs
size="sm"
color="primary"
selectedKey={trayProxyGroupStyle}
onSelectionChange={(key) => {
patchAppConfig({ trayProxyGroupStyle: key as 'default' | 'submenu' })
}}
>
<Tab key="default" title={t('settings.trayProxyGroupStyleDefault')} />
<Tab key="submenu" title={t('settings.trayProxyGroupStyleSubmenu')} />
</Tabs>
</SettingItem>
</>
)} )}
<SettingItem <SettingItem
title={t('settings.showTraffic', { title={t('settings.showTraffic', {

View File

@ -68,6 +68,9 @@
"settings.swapTrayClick": "Swap Tray Left/Right Click", "settings.swapTrayClick": "Swap Tray Left/Right Click",
"settings.proxyInTray": "Show Proxy Info in Tray Menu", "settings.proxyInTray": "Show Proxy Info in Tray Menu",
"settings.showCurrentProxyInTray": "Show Current Proxy in Tray Menu", "settings.showCurrentProxyInTray": "Show Current Proxy in Tray Menu",
"settings.trayProxyGroupStyle": "Tray Proxy Group Style",
"settings.trayProxyGroupStyleDefault": "Default",
"settings.trayProxyGroupStyleSubmenu": "Submenu",
"settings.disableTrayIconColor": "Disable Tray Icon Color Changes", "settings.disableTrayIconColor": "Disable Tray Icon Color Changes",
"settings.disableAnimations": "Disable Animation Effects", "settings.disableAnimations": "Disable Animation Effects",
"settings.showTraffic_windows": "Show Network Speed in Taskbar", "settings.showTraffic_windows": "Show Network Speed in Taskbar",
@ -596,6 +599,7 @@
"tray.systemProxy": "System Proxy", "tray.systemProxy": "System Proxy",
"tray.tun": "TUN", "tray.tun": "TUN",
"tray.profiles": "Profiles", "tray.profiles": "Profiles",
"tray.proxyGroups": "Proxy Groups",
"tray.openDirectories.title": "Open Directories", "tray.openDirectories.title": "Open Directories",
"tray.openDirectories.appDir": "App Directory", "tray.openDirectories.appDir": "App Directory",
"tray.openDirectories.workDir": "Work Directory", "tray.openDirectories.workDir": "Work Directory",

View File

@ -63,6 +63,10 @@
"settings.disableTray": "غیرفعال کردن آیکون سیستم‌تری", "settings.disableTray": "غیرفعال کردن آیکون سیستم‌تری",
"settings.swapTrayClick": "تعویض کلیک چپ/راست تری", "settings.swapTrayClick": "تعویض کلیک چپ/راست تری",
"settings.proxyInTray": "نمایش اطلاعات پراکسی در منوی سیستم‌تری", "settings.proxyInTray": "نمایش اطلاعات پراکسی در منوی سیستم‌تری",
"settings.showCurrentProxyInTray": "نمایش پراکسی فعلی در منوی تری",
"settings.trayProxyGroupStyle": "سبک گروه پراکسی در تری",
"settings.trayProxyGroupStyleDefault": "پیش‌فرض",
"settings.trayProxyGroupStyleSubmenu": "زیرمنو",
"settings.disableTrayIconColor": "غیرفعال کردن تغییر رنگ آیکون تری", "settings.disableTrayIconColor": "غیرفعال کردن تغییر رنگ آیکون تری",
"settings.disableAnimations": "غیرفعال کردن جلوه‌های انیمیشن", "settings.disableAnimations": "غیرفعال کردن جلوه‌های انیمیشن",
"settings.showTraffic_windows": "نمایش سرعت شبکه در نوار وظیفه", "settings.showTraffic_windows": "نمایش سرعت شبکه در نوار وظیفه",
@ -560,6 +564,7 @@
"tray.systemProxy": "پراکسی سیستم", "tray.systemProxy": "پراکسی سیستم",
"tray.tun": "TUN", "tray.tun": "TUN",
"tray.profiles": "پروفایل‌ها", "tray.profiles": "پروفایل‌ها",
"tray.proxyGroups": "گروه‌های پراکسی",
"tray.openDirectories.title": "باز کردن پوشه‌ها", "tray.openDirectories.title": "باز کردن پوشه‌ها",
"tray.openDirectories.appDir": "پوشه برنامه", "tray.openDirectories.appDir": "پوشه برنامه",
"tray.openDirectories.workDir": "پوشه کاری", "tray.openDirectories.workDir": "پوشه کاری",

View File

@ -63,6 +63,10 @@
"settings.disableTray": "Отключить значок в трее", "settings.disableTray": "Отключить значок в трее",
"settings.swapTrayClick": "Поменять местами левый/правый клик в трее", "settings.swapTrayClick": "Поменять местами левый/правый клик в трее",
"settings.proxyInTray": "Показывать информацию о прокси в трее", "settings.proxyInTray": "Показывать информацию о прокси в трее",
"settings.showCurrentProxyInTray": "Показывать текущий прокси в трее",
"settings.trayProxyGroupStyle": "Стиль групп прокси в трее",
"settings.trayProxyGroupStyleDefault": "По умолчанию",
"settings.trayProxyGroupStyleSubmenu": "Подменю",
"settings.disableTrayIconColor": "Отключить смену цвета значка в трее", "settings.disableTrayIconColor": "Отключить смену цвета значка в трее",
"settings.disableAnimations": "Отключить анимационные эффекты", "settings.disableAnimations": "Отключить анимационные эффекты",
"settings.showTraffic_windows": "Показывать скорость в панели задач", "settings.showTraffic_windows": "Показывать скорость в панели задач",
@ -560,6 +564,7 @@
"tray.systemProxy": "Системный прокси", "tray.systemProxy": "Системный прокси",
"tray.tun": "TUN", "tray.tun": "TUN",
"tray.profiles": "Профили", "tray.profiles": "Профили",
"tray.proxyGroups": "Группы прокси",
"tray.openDirectories.title": "Открыть директории", "tray.openDirectories.title": "Открыть директории",
"tray.openDirectories.appDir": "Директория приложения", "tray.openDirectories.appDir": "Директория приложения",
"tray.openDirectories.workDir": "Рабочая директория", "tray.openDirectories.workDir": "Рабочая директория",

View File

@ -68,6 +68,9 @@
"settings.swapTrayClick": "交换托盘左右键功能", "settings.swapTrayClick": "交换托盘左右键功能",
"settings.proxyInTray": "在托盘菜单显示代理信息", "settings.proxyInTray": "在托盘菜单显示代理信息",
"settings.showCurrentProxyInTray": "托盘菜单显示当前代理", "settings.showCurrentProxyInTray": "托盘菜单显示当前代理",
"settings.trayProxyGroupStyle": "托盘代理组样式",
"settings.trayProxyGroupStyleDefault": "默认",
"settings.trayProxyGroupStyleSubmenu": "子菜单",
"settings.disableTrayIconColor": "禁用托盘图标颜色变化", "settings.disableTrayIconColor": "禁用托盘图标颜色变化",
"settings.disableAnimations": "禁用动画效果", "settings.disableAnimations": "禁用动画效果",
"settings.showTraffic_windows": "在任务栏显示网速", "settings.showTraffic_windows": "在任务栏显示网速",
@ -596,6 +599,7 @@
"tray.systemProxy": "系统代理", "tray.systemProxy": "系统代理",
"tray.tun": "虚拟网卡", "tray.tun": "虚拟网卡",
"tray.profiles": "订阅配置", "tray.profiles": "订阅配置",
"tray.proxyGroups": "代理分组",
"tray.openDirectories.title": "打开目录", "tray.openDirectories.title": "打开目录",
"tray.openDirectories.appDir": "应用目录", "tray.openDirectories.appDir": "应用目录",
"tray.openDirectories.workDir": "工作目录", "tray.openDirectories.workDir": "工作目录",

View File

@ -68,6 +68,9 @@
"settings.swapTrayClick": "交換托盤左右鍵功能", "settings.swapTrayClick": "交換托盤左右鍵功能",
"settings.proxyInTray": "在托盤菜單顯示代理信息", "settings.proxyInTray": "在托盤菜單顯示代理信息",
"settings.showCurrentProxyInTray": "托盤菜單顯示當前代理", "settings.showCurrentProxyInTray": "托盤菜單顯示當前代理",
"settings.trayProxyGroupStyle": "托盤代理組樣式",
"settings.trayProxyGroupStyleDefault": "默認",
"settings.trayProxyGroupStyleSubmenu": "子菜單",
"settings.disableTrayIconColor": "禁用托盤圖標顏色變化", "settings.disableTrayIconColor": "禁用托盤圖標顏色變化",
"settings.disableAnimations": "禁用動畫效果", "settings.disableAnimations": "禁用動畫效果",
"settings.showTraffic_windows": "在任务列顯示網速", "settings.showTraffic_windows": "在任务列顯示網速",
@ -596,6 +599,7 @@
"tray.systemProxy": "系統代理", "tray.systemProxy": "系統代理",
"tray.tun": "虛擬網卡", "tray.tun": "虛擬網卡",
"tray.profiles": "訂閱配置", "tray.profiles": "訂閱配置",
"tray.proxyGroups": "代理分組",
"tray.openDirectories.title": "打開目錄", "tray.openDirectories.title": "打開目錄",
"tray.openDirectories.appDir": "應用目錄", "tray.openDirectories.appDir": "應用目錄",
"tray.openDirectories.workDir": "工作目錄", "tray.openDirectories.workDir": "工作目錄",

View File

@ -295,6 +295,7 @@ interface IAppConfig {
useDockIcon?: boolean useDockIcon?: boolean
showTraffic?: boolean showTraffic?: boolean
disableTrayIconColor?: boolean disableTrayIconColor?: boolean
trayProxyGroupStyle?: 'default' | 'submenu'
disableAnimations?: boolean disableAnimations?: boolean
webdavUrl?: string webdavUrl?: string
webdavDir?: string webdavDir?: string