diff options
author | Aram Drevekenin <aram@poor.dev> | 2019-10-14 14:16:01 +0200 |
---|---|---|
committer | Aram Drevekenin <aram@poor.dev> | 2019-10-14 14:16:01 +0200 |
commit | 09e5492889069a7ed94da00580fef77cd383637b (patch) | |
tree | a7180e85402b8b0d5dc9bcfc9a2555e7755d0cf6 | |
parent | f23d5b9bb709024dff4634220a2271a23ea38970 (diff) |
fix(ui): atomic drawing
-rw-r--r-- | src/display/ui.rs | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/src/display/ui.rs b/src/display/ui.rs index e603601..8832de7 100644 --- a/src/display/ui.rs +++ b/src/display/ui.rs @@ -8,6 +8,7 @@ use crate::network::{Connection, Utilization}; use crate::display::components::{Table, Layout, TotalBandwidth}; use ::std::net::Ipv4Addr; +use ::std::sync::atomic::{AtomicBool, Ordering}; pub struct Ui<B> where @@ -16,6 +17,7 @@ where terminal: Terminal<B>, state: UIState, ip_to_host: HashMap<Ipv4Addr, String>, + drawing: AtomicBool, } impl<B> Ui<B> @@ -30,25 +32,30 @@ where terminal, state: Default::default(), ip_to_host: Default::default(), + drawing: AtomicBool::new(false), } } pub fn draw(&mut self) { - let state = &self.state; - let ip_to_host = &self.ip_to_host; - self.terminal - .draw(|mut frame| { - let size = frame.size(); - let connections = Table::create_connections_table(&state, &ip_to_host); - let processes = Table::create_processes_table(&state); - let remote_ips = Table::create_remote_ips_table(&state, &ip_to_host); - let total_bandwidth = TotalBandwidth { state: &state }; - let layout = Layout { - header: total_bandwidth, - children: vec![connections, processes, remote_ips], - }; - layout.render(&mut frame, size); - }) - .unwrap(); + if !self.drawing.load(Ordering::Acquire) { + self.drawing.store(true, Ordering::Release); + let state = &self.state; + let ip_to_host = &self.ip_to_host; + self.terminal + .draw(|mut frame| { + let size = frame.size(); + let connections = Table::create_connections_table(&state, &ip_to_host); + let processes = Table::create_processes_table(&state); + let remote_ips = Table::create_remote_ips_table(&state, &ip_to_host); + let total_bandwidth = TotalBandwidth { state: &state }; + let layout = Layout { + header: total_bandwidth, + children: vec![connections, processes, remote_ips], + }; + layout.render(&mut frame, size); + }) + .unwrap(); + self.drawing.store(false, Ordering::Release); + } } pub fn update_state( &mut self, |