summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClementTsang <cjhtsang@uwaterloo.ca>2021-07-12 22:28:11 -0400
committerClementTsang <cjhtsang@uwaterloo.ca>2021-07-15 21:33:44 -0400
commitafb350989369b8d66e32fe2046596fee72bc1c7e (patch)
tree8cae3c129c4e565626c2a58cdd50a6b0186afd16
parenta397684113d48e29c5127538c021705767386350 (diff)
Some changes on toprewrite_drawing
-rw-r--r--src/bin/main.rs105
-rw-r--r--src/canvas/canvas_colours.rs30
-rw-r--r--src/drawing/mod.rs8
-rw-r--r--src/drawing/rendering/widget.rs2
-rw-r--r--src/drawing/widgets/basic/alert.rs18
-rw-r--r--src/drawing/widgets/basic/carousel.rs1
-rw-r--r--src/drawing/widgets/basic/text.rs9
-rw-r--r--src/drawing/widgets/basic/text_table.rs4
-rw-r--r--src/drawing/widgets/basic/time_graph.rs8
-rw-r--r--src/lib.rs103
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.
diff --git a/src/lib.rs b/src/lib.rs
index 5a72c833..c9180ba2 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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,