Create dedicated network collector with physical/virtual interface grouping
All checks were successful
Build and Release / build-and-release (push) Successful in 1m43s

Move network collection from NixOS collector to dedicated NetworkCollector. Add link status detection for physical interfaces (up/down). Group interfaces by physical/virtual, show status icons for physical NICs only. Down interfaces show as Inactive instead of Critical.

Version bump to 0.1.165
This commit is contained in:
2025-11-26 19:02:50 +01:00
parent 00fe8c28ab
commit fc247bd0ad
10 changed files with 196 additions and 81 deletions

View File

@@ -616,7 +616,7 @@ impl SystemWidget {
result.join(", ")
}
/// Render network section for display
/// Render network section for display with physical/virtual grouping
fn render_network(&self) -> Vec<Line<'_>> {
let mut lines = Vec::new();
@@ -624,11 +624,16 @@ impl SystemWidget {
return lines;
}
for (i, interface) in self.network_interfaces.iter().enumerate() {
let is_last = i == self.network_interfaces.len() - 1;
// Separate physical and virtual interfaces
let physical: Vec<_> = self.network_interfaces.iter().filter(|i| i.is_physical).collect();
let virtual_interfaces: Vec<_> = self.network_interfaces.iter().filter(|i| !i.is_physical).collect();
// Render physical interfaces first
for (i, interface) in physical.iter().enumerate() {
let is_last = i == physical.len() - 1 && virtual_interfaces.is_empty();
let tree_symbol = if is_last { " └─ " } else { " ├─ " };
// Show interface name
// Show interface name with IPs
let mut interface_text = format!("{}: ", interface.name);
// Add compressed IPv4 addresses
@@ -644,6 +649,39 @@ impl SystemWidget {
interface_text.push_str(&interface.ipv6_addresses.join(", "));
}
// Physical interfaces show status icon
let mut spans = vec![
Span::styled(tree_symbol, Typography::tree()),
];
spans.extend(StatusIcons::create_status_spans(
interface.link_status.clone(),
&interface_text
));
lines.push(Line::from(spans));
}
// Render virtual interfaces
for (i, interface) in virtual_interfaces.iter().enumerate() {
let is_last = i == virtual_interfaces.len() - 1;
let tree_symbol = if is_last { " └─ " } else { " ├─ " };
// Show interface name with IPs
let mut interface_text = format!("{}: ", interface.name);
// Add compressed IPv4 addresses
if !interface.ipv4_addresses.is_empty() {
interface_text.push_str(&Self::compress_ipv4_addresses(&interface.ipv4_addresses));
}
// Add IPv6 addresses (no compression for now)
if !interface.ipv6_addresses.is_empty() {
if !interface.ipv4_addresses.is_empty() {
interface_text.push_str(", ");
}
interface_text.push_str(&interface.ipv6_addresses.join(", "));
}
// Virtual interfaces don't show status icon
lines.push(Line::from(vec![
Span::styled(tree_symbol, Typography::tree()),
Span::styled(interface_text, Typography::secondary()),