diff options
author | Kelvin Zhang <zhangxp1998@gmail.com> | 2020-01-09 20:41:17 -0500 |
---|---|---|
committer | Kelvin Zhang <zhangxp1998@gmail.com> | 2020-01-10 17:05:38 -0500 |
commit | 86e11a70885023628f0b4b81435a3d7cc3a4fd4a (patch) | |
tree | 1772cde46b8060b23dfcb046e3f686abf39e6342 | |
parent | c96512ae10cf4dc52876b56ce76ea97e30c6baaa (diff) |
Pause UI with <SPACE>
-rw-r--r-- | src/display/components/total_bandwidth.rs | 27 | ||||
-rw-r--r-- | src/display/ui.rs | 7 | ||||
-rw-r--r-- | src/main.rs | 16 |
3 files changed, 37 insertions, 13 deletions
diff --git a/src/display/components/total_bandwidth.rs b/src/display/components/total_bandwidth.rs index cd6a6f2..ba78d2d 100644 --- a/src/display/components/total_bandwidth.rs +++ b/src/display/components/total_bandwidth.rs @@ -8,18 +8,29 @@ use crate::display::{DisplayBandwidth, UIState}; pub struct TotalBandwidth<'a> { pub state: &'a UIState, + pub paused: bool, } impl<'a> TotalBandwidth<'a> { pub fn render(&self, frame: &mut Frame<impl Backend>, rect: Rect) { - let title_text = [Text::styled( - format!( - " Total Rate Up / Down: {} / {}", - DisplayBandwidth(self.state.total_bytes_uploaded as f64), - DisplayBandwidth(self.state.total_bytes_downloaded as f64) - ), - Style::default().fg(Color::Green).modifier(Modifier::BOLD), - )]; + let title_text = { + let paused_str = if self.paused { "[PAUSED]" } else { "" }; + let color = if self.paused { + Color::Yellow + } else { + Color::Green + }; + + [Text::styled( + format!( + " Total Rate Up / Down: {} / {} {}", + DisplayBandwidth(self.state.total_bytes_uploaded as f64), + DisplayBandwidth(self.state.total_bytes_downloaded as f64), + paused_str + ), + Style::default().fg(color).modifier(Modifier::BOLD), + )] + }; Paragraph::new(title_text.iter()) .block(Block::default().borders(Borders::NONE)) .alignment(Alignment::Left) diff --git a/src/display/ui.rs b/src/display/ui.rs index e61f5e7..e3464bb 100644 --- a/src/display/ui.rs +++ b/src/display/ui.rs @@ -74,7 +74,7 @@ where )); } } - pub fn draw(&mut self) { + pub fn draw(&mut self, paused: bool) { let state = &self.state; let ip_to_host = &self.ip_to_host; self.terminal @@ -83,7 +83,10 @@ where let connections = Table::create_connections_table(&state, &ip_to_host); let processes = Table::create_processes_table(&state); let remote_addresses = Table::create_remote_addresses_table(&state, &ip_to_host); - let total_bandwidth = TotalBandwidth { state: &state }; + let total_bandwidth = TotalBandwidth { + state: &state, + paused, + }; let layout = Layout { header: total_bandwidth, children: vec![processes, connections, remote_addresses], diff --git a/src/main.rs b/src/main.rs index ea40de0..30a9b25 100644 --- a/src/main.rs +++ b/src/main.rs @@ -100,6 +100,7 @@ where B: Backend + Send + 'static, { let running = Arc::new(AtomicBool::new(true)); + let paused = Arc::new(AtomicBool::new(false)); let mut active_threads = vec![]; @@ -121,11 +122,12 @@ where .name("resize_handler".to_string()) .spawn({ let ui = ui.clone(); + let paused = paused.clone(); move || { on_winch({ Box::new(move || { let mut ui = ui.lock().unwrap(); - ui.draw(); + ui.draw(paused.load(Ordering::SeqCst)); }) }); } @@ -138,6 +140,7 @@ where .name("display_handler".to_string()) .spawn({ let running = running.clone(); + let paused = paused.clone(); let network_utilization = network_utilization.clone(); move || { while running.load(Ordering::Acquire) { @@ -160,11 +163,14 @@ where } { let mut ui = ui.lock().unwrap(); - ui.update_state(sockets_to_procs, utilization, ip_to_host); + let paused = paused.load(Ordering::SeqCst); + if !paused { + ui.update_state(sockets_to_procs, utilization, ip_to_host); + } if raw_mode { ui.output_text(&mut write_to_stdout); } else { - ui.draw(); + ui.draw(paused); } } let render_duration = render_start_time.elapsed(); @@ -195,6 +201,10 @@ where display_handler.unpark(); break; } + Event::Key(Key::Char(' ')) => { + paused.fetch_xor(true, Ordering::SeqCst); + display_handler.unpark(); + } _ => (), }; } |