summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKelvin Zhang <zhangxp1998@gmail.com>2020-01-09 20:41:17 -0500
committerKelvin Zhang <zhangxp1998@gmail.com>2020-01-10 17:05:38 -0500
commit86e11a70885023628f0b4b81435a3d7cc3a4fd4a (patch)
tree1772cde46b8060b23dfcb046e3f686abf39e6342
parentc96512ae10cf4dc52876b56ce76ea97e30c6baaa (diff)
Pause UI with <SPACE>
-rw-r--r--src/display/components/total_bandwidth.rs27
-rw-r--r--src/display/ui.rs7
-rw-r--r--src/main.rs16
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();
+ }
_ => (),
};
}