diff options
author | ClementTsang <cjhtsang@uwaterloo.ca> | 2021-07-12 22:28:11 -0400 |
---|---|---|
committer | ClementTsang <cjhtsang@uwaterloo.ca> | 2021-07-15 21:33:44 -0400 |
commit | afb350989369b8d66e32fe2046596fee72bc1c7e (patch) | |
tree | 8cae3c129c4e565626c2a58cdd50a6b0186afd16 | |
parent | a397684113d48e29c5127538c021705767386350 (diff) |
Some changes on toprewrite_drawing
-rw-r--r-- | src/bin/main.rs | 105 | ||||
-rw-r--r-- | src/canvas/canvas_colours.rs | 30 | ||||
-rw-r--r-- | src/drawing/mod.rs | 8 | ||||
-rw-r--r-- | src/drawing/rendering/widget.rs | 2 | ||||
-rw-r--r-- | src/drawing/widgets/basic/alert.rs | 18 | ||||
-rw-r--r-- | src/drawing/widgets/basic/carousel.rs | 1 | ||||
-rw-r--r-- | src/drawing/widgets/basic/text.rs | 9 | ||||
-rw-r--r-- | src/drawing/widgets/basic/text_table.rs | 4 | ||||
-rw-r--r-- | src/drawing/widgets/basic/time_graph.rs | 8 | ||||
-rw-r--r-- | src/lib.rs | 103 |
10 files changed, 123 insertions, 165 deletions
diff --git a/src/bin/main.rs b/src/bin/main.rs index 4afea173..742f06a4 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -4,7 +4,12 @@ #[macro_use] extern crate log; -use bottom::{canvas, data_conversion::*, options::*, *}; +use bottom::{ + canvas, + drawing::{paint, View}, + options::*, + *, +}; use std::{ boxed::Box, @@ -139,18 +144,10 @@ fn main() -> Result<()> { break; } handle_force_redraws(&mut app); - - if try_drawing(&mut terminal, &mut app, &mut painter).is_err() { - break; - } } BottomEvent::MouseInput(event) => { handle_mouse_event(event, &mut app); handle_force_redraws(&mut app); - - if try_drawing(&mut terminal, &mut app, &mut painter).is_err() { - break; - } } BottomEvent::Update(data) => { app.data_collection.eat_data(data); @@ -162,97 +159,29 @@ fn main() -> Result<()> { app.is_force_redraw = true; } - if !app.is_frozen { - // Convert all data into tui-compliant components - - // Network - if app.used_widgets.use_net { - let network_data = convert_network_data_points( - &app.data_collection, - false, - app.app_config_fields.use_basic_mode - || app.app_config_fields.use_old_network_legend, - &app.app_config_fields.network_scale_type, - &app.app_config_fields.network_unit_type, - app.app_config_fields.network_use_binary_prefix, - ); - app.canvas_data.network_data_rx = network_data.rx; - app.canvas_data.network_data_tx = network_data.tx; - app.canvas_data.rx_display = network_data.rx_display; - app.canvas_data.tx_display = network_data.tx_display; - if let Some(total_rx_display) = network_data.total_rx_display { - app.canvas_data.total_rx_display = total_rx_display; - } - if let Some(total_tx_display) = network_data.total_tx_display { - app.canvas_data.total_tx_display = total_tx_display; - } - } - - // Disk - if app.used_widgets.use_disk { - app.canvas_data.disk_data = convert_disk_row(&app.data_collection); - } - - // Temperatures - if app.used_widgets.use_temp { - app.canvas_data.temp_sensor_data = convert_temp_row(&app); - } - - // Memory - if app.used_widgets.use_mem { - app.canvas_data.mem_data = - convert_mem_data_points(&app.data_collection, false); - app.canvas_data.swap_data = - convert_swap_data_points(&app.data_collection, false); - let (memory_labels, swap_labels) = - convert_mem_labels(&app.data_collection); - - app.canvas_data.mem_labels = memory_labels; - app.canvas_data.swap_labels = swap_labels; - } - - if app.used_widgets.use_cpu { - // CPU - - convert_cpu_data_points( - &app.data_collection, - &mut app.canvas_data.cpu_data, - false, - ); - app.canvas_data.load_avg_data = app.data_collection.load_avg_harvest; - } - - // Processes - if app.used_widgets.use_proc { - update_all_process_lists(&mut app); - } - - // Battery - if app.used_widgets.use_battery { - app.canvas_data.battery_data = - convert_battery_harvest(&app.data_collection); - } - } - - if try_drawing(&mut terminal, &mut app, &mut painter).is_err() { - break; - } + update_app_data(&mut app); } BottomEvent::Clean => { app.data_collection .clean_data(constants::STALE_MAX_MILLISECONDS); + + continue; } BottomEvent::RequestRedraw => { - if try_drawing(&mut terminal, &mut app, &mut painter).is_err() { - break; - } + // FIXME: Add draws back to all required locations! } } + + // TODO: Create new draw state. + let mut root = View::new(drawing::Axis::Horizontal).into(); + if paint(&mut terminal, &mut root).is_err() { + break; + } } } *thread_termination_lock.lock().unwrap() = true; - thread_termination_cvar.notify_all(); + thread_termination_cvar.notify_all(); // Tell all threads to stop, even if they are sleeping. cleanup_terminal(&mut terminal)?; // ===== End of actual thread creation and loop ===== diff --git a/src/canvas/canvas_colours.rs b/src/canvas/canvas_colours.rs index 316b8e3c..f1707ea6 100644 --- a/src/canvas/canvas_colours.rs +++ b/src/canvas/canvas_colours.rs @@ -79,77 +79,77 @@ impl CanvasColours { pub fn set_colours_from_palette(&mut self, colours: &ConfigColours) -> anyhow::Result<()> { if let Some(border_color) = &colours.border_color { self.set_border_colour(border_color) - .context("Update 'border_color' in your config file..")?; + .context("Update 'border_color' in your config file.")?; } if let Some(highlighted_border_color) = &colours.highlighted_border_color { self.set_highlighted_border_colour(highlighted_border_color) - .context("Update 'highlighted_border_color' in your config file..")?; + .context("Update 'highlighted_border_color' in your config file.")?; } if let Some(text_color) = &colours.text_color { self.set_text_colour(text_color) - .context("Update 'text_color' in your config file..")?; + .context("Update 'text_color' in your config file.")?; } if let Some(avg_cpu_color) = &colours.avg_cpu_color { self.set_avg_cpu_colour(avg_cpu_color) - .context("Update 'avg_cpu_color' in your config file..")?; + .context("Update 'avg_cpu_color' in your config file.")?; } if let Some(all_cpu_color) = &colours.all_cpu_color { self.set_all_cpu_colour(all_cpu_color) - .context("Update 'all_cpu_color' in your config file..")?; + .context("Update 'all_cpu_color' in your config file.")?; } if let Some(cpu_core_colors) = &colours.cpu_core_colors { self.set_cpu_colours(cpu_core_colors) - .context("Update 'cpu_core_colors' in your config file..")?; + .context("Update 'cpu_core_colors' in your config file.")?; } if let Some(ram_color) = &colours.ram_color { self.set_ram_colour(ram_color) - .context("Update 'ram_color' in your config file..")?; + .context("Update 'ram_color' in your config file.")?; } if let Some(swap_color) = &colours.swap_color { self.set_swap_colour(swap_color) - .context("Update 'swap_color' in your config file..")?; + .context("Update 'swap_color' in your config file.")?; } if let Some(rx_color) = &colours.rx_color { self.set_rx_colour(rx_color) - .context("Update 'rx_color' in your config file..")?; + .context("Update 'rx_color' in your config file.")?; } if let Some(tx_color) = &colours.tx_color { self.set_tx_colour(tx_color) - .context("Update 'tx_color' in your config file..")?; + .context("Update 'tx_color' in your config file.")?; } if let Some(table_header_color) = &colours.table_header_color { self.set_table_header_colour(table_header_color) - .context("Update 'table_header_color' in your config file..")?; + .context("Update 'table_header_color' in your config file.")?; } if let Some(scroll_entry_text_color) = &colours.selected_text_color { self.set_scroll_entry_text_color(scroll_entry_text_color) - .context("Update 'selected_text_color' in your config file..")?; + .context("Update 'selected_text_color' in your config file.")?; } if let Some(scroll_entry_bg_color) = &colours.selected_bg_color { self.set_scroll_entry_bg_color(scroll_entry_bg_color) - .context("Update 'selected_bg_color' in your config file..")?; + .context("Update 'selected_bg_color' in your config file.")?; } if let Some(widget_title_color) = &colours.widget_title_color { self.set_widget_title_colour(widget_title_color) - .context("Update 'widget_title_color' in your config file..")?; + .context("Update 'widget_title_color' in your config file.")?; } if let Some(graph_color) = &colours.graph_color { self.set_graph_colour(graph_color) - .context("Update 'graph_color' in your config file..")?; + .context("Update 'graph_color' in your config file.")?; } if let Some(high_battery_color) = &colours.high_battery_color { diff --git a/src/drawing/mod.rs b/src/drawing/mod.rs index 49236450..7958bdfb 100644 --- a/src/drawing/mod.rs +++ b/src/drawing/mod.rs @@ -13,8 +13,8 @@ pub use hasher::Hasher; use crate::utils::error; -/// The draw function. Draws the entire app. -/// Goes through a few phases: +/// The paint function. Draws the entire app. +/// Intended to go through a few phases: /// /// 0. Create our "Element" tree from "Widgets". This is from our given [`Widget`] representation. /// This should have access to app state, and we can do caching checks here to see if we can avoid computations. @@ -26,11 +26,11 @@ use crate::utils::error; /// This is *sort of* like how Flutter does it. We have our Widget tree, which is the non-instantiated representation /// of our hierarchy. We then actually instantiate this into Elements. Then, we finally actually lay it out, which /// would correspond to the RenderObject tree. Then, we draw! -pub fn draw<B: Backend>( +pub fn paint<B: Backend>( terminal: &mut Terminal<B>, root: &mut Element<'_, B>, ) -> error::Result<()> { terminal.draw(|ctx| { - // Current implementation does zero caching. + // Current implementation does zero caching. Just blind draws. Sorry~ let layout = root.layout(ctx.size()); root.draw(ctx, &layout); diff --git a/src/drawing/rendering/widget.rs b/src/drawing/rendering/widget.rs index 2f2f50f3..7029fcdd 100644 --- a/src/drawing/rendering/widget.rs +++ b/src/drawing/rendering/widget.rs @@ -14,7 +14,7 @@ pub trait Widget<B: Backend> { // fn hash(&self, state: &mut Hasher); /// How the [`Widget`] should handle an event. Defaults to ignoring the event. - fn on_event(&mut self, event: Event) -> EventStatus { + fn on_event(&mut self, _event: Event) -> EventStatus { EventStatus::Ignored } diff --git a/src/drawing/widgets/basic/alert.rs b/src/drawing/widgets/basic/alert.rs index 014e311e..31485cdc 100644 --- a/src/drawing/widgets/basic/alert.rs +++ b/src/drawing/widgets/basic/alert.rs @@ -1,4 +1,7 @@ -use tui::{backend::Backend, layout::Constraint}; +use tui::{ + backend::Backend, + layout::{Constraint, Rect}, +}; use crate::drawing::{Axis, Button, Element, Event, Text, View, Widget}; @@ -51,22 +54,15 @@ impl<'a, B: Backend> Widget<B> for Alert<'a, B> { self.body.draw(ctx, node); } - fn layout(&self, bounds: tui::layout::Rect) -> crate::drawing::Node { + fn layout(&self, bounds: Rect) -> crate::drawing::Node { self.body.layout(bounds) } - fn width(&self) -> tui::layout::Constraint { + fn width(&self) -> Constraint { self.body.width() } - fn height(&self) -> tui::layout::Constraint { + fn height(&self) -> Constraint { self.body.height() } - fn on_event(&mut self, event: Event) -> crate::drawing::EventStatus { - crate::drawing::EventStatus::Ignored - // match event { - // Event::Mouse(event) => todo!(), - // Event::Keyboard(event) => todo!(), - // } - } } diff --git a/src/drawing/widgets/basic/carousel.rs b/src/drawing/widgets/basic/carousel.rs index 04eddfdb..2d05d411 100644 --- a/src/drawing/widgets/basic/carousel.rs +++ b/src/drawing/widgets/basic/carousel.rs @@ -56,6 +56,7 @@ impl<'a, B: Backend> Widget<B> for Carousel<'a, B> { // Draw arrows // Now draw the rest of the element... + todo!() } fn layout(&self, bounds: tui::layout::Rect) -> crate::drawing::Node { diff --git a/src/drawing/widgets/basic/text.rs b/src/drawing/widgets/basic/text.rs index 0668a762..54623f6f 100644 --- a/src/drawing/widgets/basic/text.rs +++ b/src/drawing/widgets/basic/text.rs @@ -70,15 +70,6 @@ where fn height(&self) -> tui::layout::Constraint { self.height } - - fn on_event(&mut self, event: Event) -> crate::drawing::EventStatus { - // Support the enter key and a left click action. - crate::drawing::EventStatus::Ignored - // match event { - // Event::Mouse(event) => todo!(), - // Event::Keyboard(event) => todo!(), - // } - } } impl<'a, B: Backend> From<Text<'a>> for Element<'a, B> { diff --git a/src/drawing/widgets/basic/text_table.rs b/src/drawing/widgets/basic/text_table.rs index 967fd7cf..a25dfa05 100644 --- a/src/drawing/widgets/basic/text_table.rs +++ b/src/drawing/widgets/basic/text_table.rs @@ -183,8 +183,4 @@ where fn height(&self) -> Constraint { self.height } - - fn on_event(&mut self, event: Event) -> EventStatus { - EventStatus::Ignored - } } diff --git a/src/drawing/widgets/basic/time_graph.rs b/src/drawing/widgets/basic/time_graph.rs index 1bc24210..838f85af 100644 --- a/src/drawing/widgets/basic/time_graph.rs +++ b/src/drawing/widgets/basic/time_graph.rs @@ -206,14 +206,6 @@ impl<'a, B: Backend> Widget<B> for TimeGraph<'a> { fn height(&self) -> Constraint { self.height } - - fn on_event(&mut self, event: Event) -> EventStatus { - crate::drawing::EventStatus::Ignored - // match event { - // Event::Mouse(event) => todo!(), - // Event::Keyboard(event) => todo!(), - // } - } } /// Interpolates between two points. Mainly used to help fill in tui-rs blanks in certain situations. @@ -6,6 +6,19 @@ extern crate log; // TODO: Deny unused imports. +pub mod utils { + pub mod error; + pub mod gen_util; + pub mod logging; +} +pub mod canvas; +pub mod clap; +pub mod constants; +pub mod data_conversion; +pub mod drawing; +pub mod options; +pub mod units; + use std::{ boxed::Box, fs, @@ -37,18 +50,6 @@ use options::*; use utils::error; pub mod app; -pub mod utils { - pub mod error; - pub mod gen_util; - pub mod logging; -} -pub mod canvas; -pub mod clap; -pub mod constants; -pub mod data_conversion; -mod drawing; -pub mod options; -pub mod units; #[cfg(target_family = "windows")] pub type Pid = usize; @@ -240,19 +241,6 @@ pub fn create_or_get_config(config_path: &Option<PathBuf>) -> error::Result<Conf } } -/// TODO: This function is useless. -pub fn try_drawing( - terminal: &mut tui::terminal::Terminal<tui::backend::CrosstermBackend<std::io::Stdout>>, - app: &mut AppState, painter: &mut canvas::Painter, -) -> error::Result<()> { - if let Err(err) = painter.draw_data(terminal, app) { - cleanup_terminal(terminal)?; - return Err(err); - } - - Ok(()) -} - pub fn cleanup_terminal( terminal: &mut tui::terminal::Terminal<tui::backend::CrosstermBackend<std::io::Stdout>>, ) -> error::Result<()> { @@ -345,6 +333,71 @@ pub fn handle_force_redraws(app: &mut AppState) { } } +pub fn update_app_data(app: &mut AppState) { + if !app.is_frozen { + // Convert all data into tui-compliant components + + // Network + if app.used_widgets.use_net { + let network_data = convert_network_data_points( + &app.data_collection, + false, + app.app_config_fields.use_basic_mode + || app.app_config_fields.use_old_network_legend, + &app.app_config_fields.network_scale_type, + &app.app_config_fields.network_unit_type, + app.app_config_fields.network_use_binary_prefix, + ); + app.canvas_data.network_data_rx = network_data.rx; + app.canvas_data.network_data_tx = network_data.tx; + app.canvas_data.rx_display = network_data.rx_display; + app.canvas_data.tx_display = network_data.tx_display; + if let Some(total_rx_display) = network_data.total_rx_display { + app.canvas_data.total_rx_display = total_rx_display; + } + if let Some(total_tx_display) = network_data.total_tx_display { + app.canvas_data.total_tx_display = total_tx_display; + } + } + + // Disk + if app.used_widgets.use_disk { + app.canvas_data.disk_data = convert_disk_row(&app.data_collection); + } + + // Temperatures + if app.used_widgets.use_temp { + app.canvas_data.temp_sensor_data = convert_temp_row(&app); + } + + // Memory + if app.used_widgets.use_mem { + app.canvas_data.mem_data = convert_mem_data_points(&app.data_collection, false); + app.canvas_data.swap_data = convert_swap_data_points(&app.data_collection, false); + let (memory_labels, swap_labels) = convert_mem_labels(&app.data_collection); + + app.canvas_data.mem_labels = memory_labels; + app.canvas_data.swap_labels = swap_labels; + } + + if app.used_widgets.use_cpu { + // CPU + convert_cpu_data_points(&app.data_collection, &mut app.canvas_data.cpu_data, false); + app.canvas_data.load_avg_data = app.data_collection.load_avg_harvest; + } + + // Processes + if app.used_widgets.use_proc { + update_all_process_lists(app); + } + + // Battery + if app.used_widgets.use_battery { + app.canvas_data.battery_data = convert_battery_harvest(&app.data_collection); + } + } +} + #[allow(clippy::needless_collect)] pub fn update_all_process_lists(app: &mut AppState) { // According to clippy, I can avoid a collect... but if I follow it, |