diff --git a/veilid-cli/src/cursive_ui.rs b/veilid-cli/src/cursive_ui.rs index 3ef05691..ebaf5bbc 100644 --- a/veilid-cli/src/cursive_ui.rs +++ b/veilid-cli/src/cursive_ui.rs @@ -72,6 +72,7 @@ struct UIState { network_down_up: Dirty<(f32, f32)>, connection_state: Dirty, peers_state: Dirty>, + tunnels_state: Dirty>, node_id: Dirty, } @@ -85,6 +86,7 @@ impl UIState { network_down_up: Dirty::new((0.0, 0.0)), connection_state: Dirty::new(ConnectionState::Disconnected), peers_state: Dirty::new(Vec::new()), + tunnels_state: Dirty::new(Vec::new()), node_id: Dirty::new("".to_owned()), } } @@ -938,11 +940,48 @@ impl CursiveUI { ColorStyle::highlight_inactive(), ); status.append_styled("|", ColorStyle::highlight_inactive()); - // Add tunnel status - status.append_styled(" No Tunnels ", ColorStyle::highlight_inactive()); + // Check for tunnels first, fallback to node count if none + let tunnel_count = inner.ui_state.tunnels_state.get().len(); + if tunnel_count > 0 { + status.append_styled( + format!(" {} Tunnels ", tunnel_count), + ColorStyle::highlight_inactive(), + ); + } else { + status.append_styled(" No Tunnels ", ColorStyle::highlight_inactive()); + } + status.append_styled("|", ColorStyle::highlight_inactive()); + // Add connected vs total nodes count + let connected_nodes = inner.ui_state.peers_state.get().len(); + let total_nodes = inner + .ui_state + .peers_state + .get() + .iter() + .map(|peer| peer["node_ids"].len()) + .sum::(); + status.append_styled( + format!( + " {} Connected ({} Nodes Found) ", + connected_nodes, total_nodes + ), + ColorStyle::highlight_inactive(), + ); + let tunnel_count = inner.ui_state.tunnels_state.get().len(); + if tunnel_count > 0 { + status.append_styled( + format!(" {} Tunnels ", tunnel_count), + ColorStyle::highlight_inactive(), + ); + } else { + let peer_count = inner.ui_state.peers_state.get().len(); + status.append_styled( + format!(" {} Nodes ", peer_count), + ColorStyle::highlight_inactive(), + ); + } status.append_styled("|", ColorStyle::highlight_inactive()); }; - statusbar.set_content(status); } @@ -1330,6 +1369,14 @@ impl UISender for CursiveUISender { } let _ = self.cb_sink.send(Box::new(CursiveUI::update_cb)); } + fn set_tunnel_status(&mut self, tunnels: Option>) { + let mut inner = self.inner.lock(); + inner + .ui_state + .tunnels_state + .set(tunnels.unwrap_or_default()); + let _ = self.cb_sink.send(Box::new(CursiveUI::update_cb)); + } fn set_config(&mut self, config: &json::JsonValue) { let mut inner = self.inner.lock(); diff --git a/veilid-cli/src/interactive_ui.rs b/veilid-cli/src/interactive_ui.rs index 427853fc..b2cda8fb 100644 --- a/veilid-cli/src/interactive_ui.rs +++ b/veilid-cli/src/interactive_ui.rs @@ -366,6 +366,9 @@ impl UISender for InteractiveUISender { ) { // } + fn set_tunnel_status(&mut self, _tunnels: Option>) { + // + } fn set_config(&mut self, _config: &json::JsonValue) { // } diff --git a/veilid-cli/src/io_read_write_ui.rs b/veilid-cli/src/io_read_write_ui.rs index 83addc84..0efb6d09 100644 --- a/veilid-cli/src/io_read_write_ui.rs +++ b/veilid-cli/src/io_read_write_ui.rs @@ -248,6 +248,9 @@ impl>) { + // + } fn set_config(&mut self, _config: &json::JsonValue) { // } diff --git a/veilid-cli/src/log_viewer_ui.rs b/veilid-cli/src/log_viewer_ui.rs index 1e740ad0..b261e882 100644 --- a/veilid-cli/src/log_viewer_ui.rs +++ b/veilid-cli/src/log_viewer_ui.rs @@ -237,6 +237,9 @@ impl UISender for LogViewerUISender { ) { // } + fn set_tunnel_status(&mut self, _tunnels: Option>) { + // + } fn set_config(&mut self, _config: &json::JsonValue) { // } diff --git a/veilid-cli/src/ui.rs b/veilid-cli/src/ui.rs index 8ca14085..1f33136b 100644 --- a/veilid-cli/src/ui.rs +++ b/veilid-cli/src/ui.rs @@ -34,6 +34,8 @@ pub trait UISender: Send { bps_up: u64, peers: Vec, ); + #[expect(dead_code)] + fn set_tunnel_status(&mut self, tunnels: Option>); fn set_config(&mut self, config: &json::JsonValue); fn set_connection_state(&mut self, state: ConnectionState); fn add_node_event(&self, log_color: Level, event: &str);