summaryrefslogtreecommitdiffstats
path: root/src/canvas/widgets/network_graph.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/canvas/widgets/network_graph.rs')
-rw-r--r--src/canvas/widgets/network_graph.rs244
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)