gardesk/gartop / 342f826

Browse files

Add GPU usage display to header bar

Authored by espadonne
SHA
342f826d3b1c7a3e17026d48f95003144f626888
Parents
9d84a3d
Tree
898819b

1 changed file

StatusFile+-
M gartop/src/gui/header.rs 31 2
gartop/src/gui/header.rsmodified
@@ -13,6 +13,7 @@ pub struct HeaderBar {
13
     net_rate: f64,   // Combined rx+tx bytes/sec
13
     net_rate: f64,   // Combined rx+tx bytes/sec
14
     disk_rate: f64,  // Combined read+write bytes/sec
14
     disk_rate: f64,  // Combined read+write bytes/sec
15
     max_temp: Option<f64>,  // Maximum temperature reading
15
     max_temp: Option<f64>,  // Maximum temperature reading
16
+    gpu_usage: Option<f64>,  // GPU utilization percentage
16
 }
17
 }
17
 
18
 
18
 impl HeaderBar {
19
 impl HeaderBar {
@@ -26,6 +27,7 @@ impl HeaderBar {
26
             net_rate: 0.0,
27
             net_rate: 0.0,
27
             disk_rate: 0.0,
28
             disk_rate: 0.0,
28
             max_temp: None,
29
             max_temp: None,
30
+            gpu_usage: None,
29
         }
31
         }
30
     }
32
     }
31
 
33
 
@@ -43,6 +45,11 @@ impl HeaderBar {
43
         self.max_temp = max_temp;
45
         self.max_temp = max_temp;
44
     }
46
     }
45
 
47
 
48
+    /// Update GPU usage.
49
+    pub fn update_gpu(&mut self, gpu_usage: Option<f64>) {
50
+        self.gpu_usage = gpu_usage;
51
+    }
52
+
46
     /// Render the header bar.
53
     /// Render the header bar.
47
     pub fn render(&self, renderer: &Renderer, theme: &Theme) -> anyhow::Result<()> {
54
     pub fn render(&self, renderer: &Renderer, theme: &Theme) -> anyhow::Result<()> {
48
         // Background - use panel_bg for seamless transition to tab bar
55
         // Background - use panel_bg for seamless transition to tab bar
@@ -104,6 +111,15 @@ impl HeaderBar {
104
             ..stats_style.clone()
111
             ..stats_style.clone()
105
         };
112
         };
106
 
113
 
114
+        // GPU indicator (if available)
115
+        let gpu_text = self.gpu_usage
116
+            .map(|u| format!("GPU: {:.0}%", u))
117
+            .unwrap_or_default();
118
+        let gpu_style = TextStyle {
119
+            color: theme.gpu_color,
120
+            ..stats_style.clone()
121
+        };
122
+
107
         // Uptime
123
         // Uptime
108
         let uptime_text = format!("up {}", self.uptime);
124
         let uptime_text = format!("up {}", self.uptime);
109
 
125
 
@@ -113,6 +129,11 @@ impl HeaderBar {
113
         let y = self.bounds.y as f64 + (self.bounds.height as f64 * 0.4) + 6.0;
129
         let y = self.bounds.y as f64 + (self.bounds.height as f64 * 0.4) + 6.0;
114
 
130
 
115
         let uptime_width = renderer.measure_text(&uptime_text, &stats_style)?.width as f64;
131
         let uptime_width = renderer.measure_text(&uptime_text, &stats_style)?.width as f64;
132
+        let gpu_width = if self.gpu_usage.is_some() {
133
+            renderer.measure_text(&gpu_text, &gpu_style)?.width as f64
134
+        } else {
135
+            0.0
136
+        };
116
         let temp_width = if self.max_temp.is_some() {
137
         let temp_width = if self.max_temp.is_some() {
117
             renderer.measure_text(&temp_text, &temp_style)?.width as f64
138
             renderer.measure_text(&temp_text, &temp_style)?.width as f64
118
         } else {
139
         } else {
@@ -126,11 +147,16 @@ impl HeaderBar {
126
         let right_edge = (self.bounds.x + self.bounds.width as i32) as f64;
147
         let right_edge = (self.bounds.x + self.bounds.width as i32) as f64;
127
 
148
 
128
         let uptime_x = right_edge - right_margin - uptime_width;
149
         let uptime_x = right_edge - right_margin - uptime_width;
129
-        let temp_x = if self.max_temp.is_some() {
150
+        let gpu_x = if self.gpu_usage.is_some() {
130
-            uptime_x - spacing - temp_width
151
+            uptime_x - spacing - gpu_width
131
         } else {
152
         } else {
132
             uptime_x
153
             uptime_x
133
         };
154
         };
155
+        let temp_x = if self.max_temp.is_some() {
156
+            gpu_x - spacing - temp_width
157
+        } else {
158
+            gpu_x
159
+        };
134
         let disk_x = temp_x - spacing - disk_width;
160
         let disk_x = temp_x - spacing - disk_width;
135
         let net_x = disk_x - spacing - net_width;
161
         let net_x = disk_x - spacing - net_width;
136
         let mem_x = net_x - spacing - mem_width;
162
         let mem_x = net_x - spacing - mem_width;
@@ -143,6 +169,9 @@ impl HeaderBar {
143
         if self.max_temp.is_some() {
169
         if self.max_temp.is_some() {
144
             renderer.text(&temp_text, temp_x, y, &temp_style)?;
170
             renderer.text(&temp_text, temp_x, y, &temp_style)?;
145
         }
171
         }
172
+        if self.gpu_usage.is_some() {
173
+            renderer.text(&gpu_text, gpu_x, y, &gpu_style)?;
174
+        }
146
         renderer.text(&uptime_text, uptime_x, y, &stats_style)?;
175
         renderer.text(&uptime_text, uptime_x, y, &stats_style)?;
147
 
176
 
148
         Ok(())
177
         Ok(())