diff options
Diffstat (limited to 'src/canvas/widgets/network_graph.rs')
-rw-r--r-- | src/canvas/widgets/network_graph.rs | 244 |
1 files changed, 136 insertions, 108 deletions
diff --git a/src/canvas/widgets/network_graph.rs b/src/canvas/widgets/network_graph.rs index 206c9cd4..b21e886e 100644 --- a/src/canvas/widgets/network_graph.rs +++ b/src/canvas/widgets/network_graph.rs @@ -2,14 +2,14 @@ use lazy_static::lazy_static; use std::cmp::max; use crate::{ - app::{App, WidgetPosition}, + app::App, canvas::{drawing_utils::get_variable_intrinsic_widths, Painter}, constants::*, }; use tui::{ backend::Backend, - layout::{Constraint, Rect}, + layout::{Constraint, Direction, Layout, Rect}, terminal::Frame, widgets::{Axis, Block, Borders, Chart, Dataset, Marker, Row, Table, Widget}, }; @@ -24,129 +24,156 @@ lazy_static! { } pub trait NetworkGraphWidget { + fn draw_network<B: Backend>( + &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64, + ); + fn draw_network_graph<B: Backend>( - &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, + &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64, ); fn draw_network_labels<B: Backend>( - &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, + &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64, ); } impl NetworkGraphWidget for Painter { + fn draw_network<B: Backend>( + &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64, + ) { + let network_chunk = Layout::default() + .direction(Direction::Vertical) + .margin(0) + .constraints( + [ + Constraint::Length(max(draw_loc.height as i64 - 5, 0) as u16), + Constraint::Length(5), + ] + .as_ref(), + ) + .split(draw_loc); + + self.draw_network_graph(f, app_state, network_chunk[0], widget_id); + self.draw_network_labels(f, app_state, network_chunk[1], widget_id); + } + fn draw_network_graph<B: Backend>( - &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, + &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64, ) { - let network_data_rx: &[(f64, f64)] = &app_state.canvas_data.network_data_rx; - let network_data_tx: &[(f64, f64)] = &app_state.canvas_data.network_data_tx; - - let display_time_labels = [ - format!("{}s", app_state.net_state.current_display_time / 1000), - "0s".to_string(), - ]; - let x_axis = if app_state.app_config_fields.hide_time - || (app_state.app_config_fields.autohide_time - && app_state.net_state.autohide_timer.is_none()) - { - Axis::default().bounds([0.0, app_state.net_state.current_display_time as f64]) - } else if let Some(time) = app_state.net_state.autohide_timer { - if std::time::Instant::now().duration_since(time).as_millis() - < AUTOHIDE_TIMEOUT_MILLISECONDS as u128 + if let Some(network_widget_state) = app_state.net_state.widget_states.get_mut(&widget_id) { + let network_data_rx: &[(f64, f64)] = &app_state.canvas_data.network_data_rx; + let network_data_tx: &[(f64, f64)] = &app_state.canvas_data.network_data_tx; + + let display_time_labels = [ + format!("{}s", network_widget_state.current_display_time / 1000), + "0s".to_string(), + ]; + let x_axis = if app_state.app_config_fields.hide_time + || (app_state.app_config_fields.autohide_time + && network_widget_state.autohide_timer.is_none()) { + Axis::default().bounds([-(network_widget_state.current_display_time as f64), 0.0]) + } else if let Some(time) = network_widget_state.autohide_timer { + if std::time::Instant::now().duration_since(time).as_millis() + < AUTOHIDE_TIMEOUT_MILLISECONDS as u128 + { + Axis::default() + .bounds([-(network_widget_state.current_display_time as f64), 0.0]) + .style(self.colours.graph_style) + .labels_style(self.colours.graph_style) + .labels(&display_time_labels) + } else { + network_widget_state.autohide_timer = None; + Axis::default() + .bounds([-(network_widget_state.current_display_time as f64), 0.0]) + } + } else { Axis::default() - .bounds([0.0, app_state.net_state.current_display_time as f64]) + .bounds([-(network_widget_state.current_display_time as f64), 0.0]) .style(self.colours.graph_style) .labels_style(self.colours.graph_style) .labels(&display_time_labels) - } else { - app_state.net_state.autohide_timer = None; - Axis::default().bounds([0.0, app_state.net_state.current_display_time as f64]) - } - } else { - Axis::default() - .bounds([0.0, app_state.net_state.current_display_time as f64]) + }; + + // 0 is offset. + let y_axis: Axis<'_, &str> = Axis::default() .style(self.colours.graph_style) .labels_style(self.colours.graph_style) - .labels(&display_time_labels) - }; - - // 0 is offset. - let y_axis: Axis<'_, &str> = Axis::default() - .style(self.colours.graph_style) - .labels_style(self.colours.graph_style) - .bounds([-0.5, 30_f64]) - .labels(&["0B", "1KiB", "1MiB", "1GiB"]); - - let title = if app_state.is_expanded { - const TITLE_BASE: &str = " Network ── Esc to go back "; - let repeat_num = max( - 0, - draw_loc.width as i32 - TITLE_BASE.chars().count() as i32 - 2, - ); - let result_title = format!( - " Network ─{}─ Esc to go back ", - "─".repeat(repeat_num as usize) - ); - - result_title - } else { - " Network ".to_string() - }; - - Chart::default() - .block( - Block::default() - .title(&title) - .title_style(if app_state.is_expanded { - self.colours.highlighted_border_style - } else { - self.colours.widget_title_style - }) - .borders(Borders::ALL) - .border_style(match app_state.current_widget_selected { - WidgetPosition::Network => self.colours.highlighted_border_style, - _ => self.colours.border_style, - }), - ) - .x_axis(x_axis) - .y_axis(y_axis) - .datasets(&[ - Dataset::default() - .name(&format!("RX: {:7}", app_state.canvas_data.rx_display)) - .marker(if app_state.app_config_fields.use_dot { - Marker::Dot - } else { - Marker::Braille - }) - .style(self.colours.rx_style) - .data(&network_data_rx), - Dataset::default() - .name(&format!("TX: {:7}", app_state.canvas_data.tx_display)) - .marker(if app_state.app_config_fields.use_dot { - Marker::Dot - } else { - Marker::Braille - }) - .style(self.colours.tx_style) - .data(&network_data_tx), - Dataset::default() - .name(&format!( - "Total RX: {:7}", - app_state.canvas_data.total_rx_display - )) - .style(self.colours.total_rx_style), - Dataset::default() - .name(&format!( - "Total TX: {:7}", - app_state.canvas_data.total_tx_display - )) - .style(self.colours.total_tx_style), - ]) - .render(f, draw_loc); + .bounds([-0.5, 30_f64]) + .labels(&["0B", "1KiB", "1MiB", "1GiB"]); + + let title = if app_state.is_expanded { + const TITLE_BASE: &str = " Network ── Esc to go back "; + let repeat_num = max( + 0, + draw_loc.width as i32 - TITLE_BASE.chars().count() as i32 - 2, + ); + let result_title = format!( + " Network ─{}─ Esc to go back ", + "─".repeat(repeat_num as usize) + ); + + result_title + } else { + " Network ".to_string() + }; + + Chart::default() + .block( + Block::default() + .title(&title) + .title_style(if app_state.is_expanded { + self.colours.highlighted_border_style + } else { + self.colours.widget_title_style + }) + .borders(Borders::ALL) + .border_style(if app_state.current_widget.widget_id == widget_id { + self.colours.highlighted_border_style + } else { + self.colours.border_style + }), + ) + .x_axis(x_axis) + .y_axis(y_axis) + .datasets(&[ + Dataset::default() + .name(&format!("RX: {:7}", app_state.canvas_data.rx_display)) + .marker(if app_state.app_config_fields.use_dot { + Marker::Dot + } else { + Marker::Braille + }) + .style(self.colours.rx_style) + .data(&network_data_rx), + Dataset::default() + .name(&format!("TX: {:7}", app_state.canvas_data.tx_display)) + .marker(if app_state.app_config_fields.use_dot { + Marker::Dot + } else { + Marker::Braille + }) + .style(self.colours.tx_style) + .data(&network_data_tx), + Dataset::default() + .name(&format!( + "Total RX: {:7}", + app_state.canvas_data.total_rx_display + )) + .style(self.colours.total_rx_style), + Dataset::default() + .name(&format!( + "Total TX: {:7}", + app_state.canvas_data.total_tx_display + )) + .style(self.colours.total_tx_style), + ]) + .render(f, draw_loc); + } } fn draw_network_labels<B: Backend>( - &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, + &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64, ) { let rx_display = &app_state.canvas_data.rx_display; let tx_display = &app_state.canvas_data.tx_display; @@ -176,9 +203,10 @@ impl NetworkGraphWidget for Painter { // Draw Table::new(NETWORK_HEADERS.iter(), mapped_network) .block(Block::default().borders(Borders::ALL).border_style( - match app_state.current_widget_selected { - WidgetPosition::Network => self.colours.highlighted_border_style, - _ => self.colours.border_style, + if app_state.current_widget.widget_id == widget_id { + self.colours.highlighted_border_style + } else { + self.colours.border_style }, )) .header_style(self.colours.table_header_style) |