feat: Allow toggling pause of traffic stats animation on blur (#6463)

* feat: Allow toggling pause of traffic stats animation on blur

* fix: React Hook useCallback has a missing dependency

* chore: i18n

---------

Co-authored-by: Slinetrac <realakayuki@gmail.com>
This commit is contained in:
wysha-object
2026-03-16 08:17:12 +00:00
committed by GitHub
co-authored by Slinetrac
parent c19381a857
commit 4ceb7e6043
19 changed files with 71 additions and 18 deletions
+5
View File
@@ -49,6 +49,9 @@ pub struct IVerge {
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_group_icon: Option<bool>,
/// pause render traffic stats on blur
pub pause_render_traffic_stats_on_blur: Option<bool>,
/// common tray icon
#[serde(skip_serializing_if = "Option::is_none")]
pub common_tray_icon: Option<bool>,
@@ -391,6 +394,7 @@ impl IVerge {
traffic_graph: Some(true),
enable_memory_usage: Some(true),
enable_group_icon: Some(true),
pause_render_traffic_stats_on_blur: Some(true),
#[cfg(target_os = "macos")]
tray_icon: Some("monochrome".into()),
menu_icon: Some("monochrome".into()),
@@ -478,6 +482,7 @@ impl IVerge {
patch!(traffic_graph);
patch!(enable_memory_usage);
patch!(enable_group_icon);
patch!(pause_render_traffic_stats_on_blur);
#[cfg(target_os = "macos")]
patch!(tray_icon);
patch!(menu_icon);
@@ -13,6 +13,7 @@ import {
import { useTranslation } from 'react-i18next'
import { useTrafficGraphDataEnhanced } from '@/hooks/use-traffic-monitor'
import { useVerge } from '@/hooks/use-verge'
import { debugLog } from '@/utils/debug'
import parseTraffic from '@/utils/parse-traffic'
@@ -105,6 +106,9 @@ export const EnhancedCanvasTrafficGraph = memo(
}: EnhancedCanvasTrafficGraphProps) {
const theme = useTheme()
const { t } = useTranslation()
const verge = useVerge()
const pause_render_traffic_stats_on_blur =
verge.verge?.pause_render_traffic_stats_on_blur ?? true
// 使用增强版全局流量数据管理
const { dataPoints, requestRange, samplerStats } =
@@ -227,7 +231,7 @@ export const EnhancedCanvasTrafficGraph = memo(
const highResNow = getNow()
lastRenderTimeRef.current = highResNow
if (focused) {
if (focused || !pause_render_traffic_stats_on_blur) {
resumeCooldownRef.current = Date.now()
const controller = fpsControllerRef.current
const resumeTarget = Math.max(
@@ -242,7 +246,7 @@ export const EnhancedCanvasTrafficGraph = memo(
resumeCooldownRef.current = 0
}
},
[setIsWindowFocused, setCurrentFPS],
[setIsWindowFocused, setCurrentFPS, pause_render_traffic_stats_on_blur],
)
useEffect(() => {
@@ -985,7 +989,7 @@ export const EnhancedCanvasTrafficGraph = memo(
// 受控的动画循环
useEffect(() => {
if (
!isWindowFocused ||
(!isWindowFocused && pause_render_traffic_stats_on_blur) ||
displayData.length === 0 ||
dataStaleRef.current
) {
@@ -998,7 +1002,7 @@ export const EnhancedCanvasTrafficGraph = memo(
}
const animate = (currentTime: number) => {
if (!isWindowFocusedRef.current) {
if (!isWindowFocusedRef.current && pause_render_traffic_stats_on_blur) {
lastRenderTimeRef.current = getNow()
animationFrameRef.current = undefined
return
@@ -1046,7 +1050,13 @@ export const EnhancedCanvasTrafficGraph = memo(
animationFrameRef.current = undefined
}
}
}, [drawGraph, displayData.length, isWindowFocused, collectFrameSample])
}, [
drawGraph,
displayData.length,
isWindowFocused,
pause_render_traffic_stats_on_blur,
collectFrameSample,
])
// 切换时间范围
const handleTimeRangeClick = useCallback((event: React.MouseEvent) => {
@@ -189,6 +189,28 @@ export const LayoutViewer = forwardRef<DialogRef>((_, ref) => {
</GuardState>
</Item>
<Item>
<ListItemText
primary={t(
'settings.components.verge.layout.fields.pauseRenderTrafficStatsOnBlur',
)}
/>
<GuardState
value={verge?.pause_render_traffic_stats_on_blur ?? true}
valueProps="checked"
onCatch={onError}
onFormat={onSwitchFormat}
onChange={(e) =>
onChangeData({ pause_render_traffic_stats_on_blur: e })
}
onGuard={(e) =>
patchVerge({ pause_render_traffic_stats_on_blur: e })
}
>
<Switch edge="end" />
</GuardState>
</Item>
<Item>
<ListItemText
primary={t('settings.components.verge.layout.fields.toastPosition')}
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "أيقونة شريط المهام لوكيل النظام",
"tunTrayIcon": "أيقونة شريط المهام لـ TUN",
"enableTrayIcon": "Enable Tray Icon",
"enableTraySpeed": "تفعيل سرعة التراي"
"enableTraySpeed": "تفعيل سرعة التراي",
"pauseRenderTrafficStatsOnBlur": "إيقاف عرض إحصاءات حركة المرور مؤقتًا عند فقدان التركيز"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "Systemproxy-Tray-Symbol",
"tunTrayIcon": "TUN-Modus-Tray-Symbol",
"enableTrayIcon": "Tray-Symbol aktivieren",
"enableTraySpeed": "Tray-Geschwindigkeit aktivieren"
"enableTraySpeed": "Tray-Geschwindigkeit aktivieren",
"pauseRenderTrafficStatsOnBlur": "Rendering der Verkehrsstatistiken bei Fokusverlust pausieren"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "System Proxy Tray Icon",
"tunTrayIcon": "Tun Tray Icon",
"enableTrayIcon": "Enable Tray Icon",
"enableTraySpeed": "Enable Tray Speed"
"enableTraySpeed": "Enable Tray Speed",
"pauseRenderTrafficStatsOnBlur": "Pause rendering traffic statistics when blurred"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "Icono de bandeja del proxy del sistema",
"tunTrayIcon": "Icono de bandeja del modo TUN",
"enableTrayIcon": "Habilitar icono de la bandeja",
"enableTraySpeed": "Habilitar velocidad en la bandeja"
"enableTraySpeed": "Habilitar velocidad en la bandeja",
"pauseRenderTrafficStatsOnBlur": "Pausar el renderizado de estadísticas de tráfico al perder el foco"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "آیکون سینی پراکسی سیستم",
"tunTrayIcon": "آیکون سینی Tun",
"enableTrayIcon": "Enable Tray Icon",
"enableTraySpeed": "فعال کردن سرعت ترای"
"enableTraySpeed": "فعال کردن سرعت ترای",
"pauseRenderTrafficStatsOnBlur": "توقف رندر آمار ترافیک هنگام از دست رفتن فوکوس"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "Ikon Tray Proksi Sistem",
"tunTrayIcon": "Ikon Tray Tun",
"enableTrayIcon": "Enable Tray Icon",
"enableTraySpeed": "Aktifkan Tray Speed"
"enableTraySpeed": "Aktifkan Tray Speed",
"pauseRenderTrafficStatsOnBlur": "Jeda render statistik lalu lintas saat jendela tidak fokus"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "システムプロキシトレイアイコン",
"tunTrayIcon": "TUNモードトレイアイコン",
"enableTrayIcon": "トレイアイコンを有効にする",
"enableTraySpeed": "トレイの速度表示を有効にする"
"enableTraySpeed": "トレイの速度表示を有効にする",
"pauseRenderTrafficStatsOnBlur": "フォーカスを失ったときにトラフィック統計の描画を一時停止"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "시스템 프록시 트레이 아이콘",
"tunTrayIcon": "TUN 트레이 아이콘",
"enableTrayIcon": "트레이 아이콘 사용",
"enableTraySpeed": "트레이 속도 표시 사용"
"enableTraySpeed": "트레이 속도 표시 사용",
"pauseRenderTrafficStatsOnBlur": "포커스를 잃으면 트래픽 통계 렌더링 일시 중지"
},
"tooltips": {
"hoverNavigator": "알파벳에 마우스를 올리면 해당 프록시 그룹으로 자동 스크롤합니다",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "Значок системного прокси в трее",
"tunTrayIcon": "Значок TUN в трее",
"enableTrayIcon": "Показывать значок в трее",
"enableTraySpeed": "Показывать скорость в трее"
"enableTraySpeed": "Показывать скорость в трее",
"pauseRenderTrafficStatsOnBlur": "При потере фокуса приостанавливать отрисовку статистики трафика"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "Sistem Vekil Tepsi Simgesi",
"tunTrayIcon": "Tun Tepsi Simgesi",
"enableTrayIcon": "Tepsi Simgesini Etkinleştir",
"enableTraySpeed": "Tepsi Hızını Etkinleştir"
"enableTraySpeed": "Tepsi Hızını Etkinleştir",
"pauseRenderTrafficStatsOnBlur": "Odak kaybolduğunda trafik istatistiklerinin işlenmesini duraklat"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "Системалы прокси иконкасы",
"tunTrayIcon": "Tun (виртуаль адаптер) иконкасы",
"enableTrayIcon": "Enable Tray Icon",
"enableTraySpeed": "Трей скоростьне үстерү"
"enableTraySpeed": "Трей скоростьне үстерү",
"pauseRenderTrafficStatsOnBlur": "Фокус югалганда трафик статистикасын сызуны туктатып тору"
},
"tooltips": {
"hoverNavigator": "Automatically scroll to the corresponding proxy group when hovering over alphabet letters",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "系统代理托盘图标",
"tunTrayIcon": "TUN 模式托盘图标",
"enableTrayIcon": "启用托盘图标",
"enableTraySpeed": "启用托盘速率"
"enableTraySpeed": "启用托盘速率",
"pauseRenderTrafficStatsOnBlur": "失去焦点时暂停渲染流量统计"
},
"tooltips": {
"hoverNavigator": "鼠标悬停在字母上时自动滚动到对应代理组",
+2 -1
View File
@@ -240,7 +240,8 @@
"systemProxyTrayIcon": "系統代理系統匣圖示",
"tunTrayIcon": "虛擬網路介面卡模式系統匣圖示",
"enableTrayIcon": "啟用系統匣圖示",
"enableTraySpeed": "啟用系統匣速率"
"enableTraySpeed": "啟用系統匣速率",
"pauseRenderTrafficStatsOnBlur": "失去焦點時暫停渲染流量統計"
},
"tooltips": {
"hoverNavigator": "滑鼠懸停在字母上時自動捲動到對應代理組",
+1
View File
@@ -458,6 +458,7 @@ export const translationKeys = [
'settings.components.verge.layout.fields.tunTrayIcon',
'settings.components.verge.layout.fields.enableTrayIcon',
'settings.components.verge.layout.fields.enableTraySpeed',
'settings.components.verge.layout.fields.pauseRenderTrafficStatsOnBlur',
'settings.components.verge.layout.tooltips.hoverNavigator',
'settings.components.verge.layout.tooltips.hoverNavigatorDelay',
'settings.components.verge.layout.options.icon.monochrome',
+1
View File
@@ -625,6 +625,7 @@ export interface TranslationResources {
hoverNavigatorDelay: string
memoryUsage: string
navIcon: string
pauseRenderTrafficStatsOnBlur: string
preferSystemTitlebar: string
proxyGroupIcon: string
proxyGroupsDisplayMode: string
+1
View File
@@ -904,6 +904,7 @@ interface IVergeConfig {
traffic_graph?: boolean
enable_memory_usage?: boolean
enable_group_icon?: boolean
pause_render_traffic_stats_on_blur?: boolean
menu_icon?: 'monochrome' | 'colorful' | 'disable'
menu_order?: string[]
notice_position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'