From 77777ef5887c2e1bd1a10c55cbb329c0471d4388 Mon Sep 17 00:00:00 2001 From: Clement Tsang <34804052+ClementTsang@users.noreply.github.com> Date: Tue, 2 Jan 2024 06:24:13 +0000 Subject: [PATCH] refactor: clean up some more drawing/component code (#1372) * rename battery info widget file * add widget trait * move basic table arrows over * some renaming * more renaming and shuffling * cleanup * fmt --- src/canvas.rs | 10 ++++++---- src/canvas/components.rs | 8 ++++++++ src/canvas/{tui_widgets => components}/data_table.rs | 0 .../{tui_widgets => components}/data_table/column.rs | 0 .../data_table/data_type.rs | 0 .../{tui_widgets => components}/data_table/draw.rs | 0 .../{tui_widgets => components}/data_table/props.rs | 0 .../data_table/sortable.rs | 0 .../{tui_widgets => components}/data_table/state.rs | 0 .../{tui_widgets => components}/data_table/styling.rs | 0 src/canvas/{tui_widgets => components}/time_graph.rs | 2 +- src/canvas/components/tui.rs | 4 ++++ .../{tui_widgets => components/tui}/pipe_gauge.rs | 0 .../{tui_widgets => components/tui}/time_chart.rs | 0 .../tui}/time_chart/canvas.rs | 0 .../widget_carousel.rs} | 0 src/canvas/tui_widgets.rs | 6 ------ src/canvas/widgets.rs | 1 - src/canvas/widgets/cpu_basic.rs | 2 +- src/canvas/widgets/cpu_graph.rs | 4 ++-- src/canvas/widgets/disk_table.rs | 2 +- src/canvas/widgets/mem_basic.rs | 2 +- src/canvas/widgets/mem_graph.rs | 2 +- src/canvas/widgets/network_graph.rs | 4 ++-- src/canvas/widgets/process_table.rs | 2 +- src/canvas/widgets/temperature_table.rs | 2 +- src/data_conversion.rs | 2 +- src/widgets.rs | 11 +++++++++-- src/widgets/{battery_widget.rs => battery_info.rs} | 0 src/widgets/cpu_graph.rs | 4 ++-- src/widgets/disk_table.rs | 4 ++-- src/widgets/process_table.rs | 4 ++-- src/widgets/process_table/proc_widget_column.rs | 2 +- src/widgets/process_table/proc_widget_data.rs | 2 +- src/widgets/process_table/sort_table.rs | 2 +- src/widgets/temperature_table.rs | 4 ++-- 36 files changed, 50 insertions(+), 36 deletions(-) create mode 100644 src/canvas/components.rs rename src/canvas/{tui_widgets => components}/data_table.rs (100%) rename src/canvas/{tui_widgets => components}/data_table/column.rs (100%) rename src/canvas/{tui_widgets => components}/data_table/data_type.rs (100%) rename src/canvas/{tui_widgets => components}/data_table/draw.rs (100%) rename src/canvas/{tui_widgets => components}/data_table/props.rs (100%) rename src/canvas/{tui_widgets => components}/data_table/sortable.rs (100%) rename src/canvas/{tui_widgets => components}/data_table/state.rs (100%) rename src/canvas/{tui_widgets => components}/data_table/styling.rs (100%) rename src/canvas/{tui_widgets => components}/time_graph.rs (99%) create mode 100644 src/canvas/components/tui.rs rename src/canvas/{tui_widgets => components/tui}/pipe_gauge.rs (100%) rename src/canvas/{tui_widgets => components/tui}/time_chart.rs (100%) rename src/canvas/{tui_widgets => components/tui}/time_chart/canvas.rs (100%) rename src/canvas/{widgets/basic_table_arrows.rs => components/widget_carousel.rs} (100%) delete mode 100644 src/canvas/tui_widgets.rs rename src/widgets/{battery_widget.rs => battery_info.rs} (100%) diff --git a/src/canvas.rs b/src/canvas.rs index 6b18f1c7..38194f04 100644 --- a/src/canvas.rs +++ b/src/canvas.rs @@ -1,7 +1,7 @@ +pub mod components; mod dialogs; mod drawing_utils; pub mod styling; -pub mod tui_widgets; mod widgets; use std::str::FromStr; @@ -49,7 +49,7 @@ impl FromStr for ColourScheme { "nord" => Ok(ColourScheme::Nord), "nord-light" => Ok(ColourScheme::NordLight), _ => Err(BottomError::ConfigError(format!( - "\"{s}\" is an invalid built-in color scheme." + "`{s}` is an invalid built-in color scheme." ))), } } @@ -71,8 +71,10 @@ pub struct Painter { widget_layout: BottomLayout, } -// Part of a temporary fix for https://github.com/ClementTsang/bottom/issues/896 -enum LayoutConstraint { +/// The constraints of a widget relative to its parent. +/// +/// This is used over ratatui's internal representation due to https://github.com/ClementTsang/bottom/issues/896. +pub enum LayoutConstraint { CanvasHandled, Grow, Ratio(u32, u32), diff --git a/src/canvas/components.rs b/src/canvas/components.rs new file mode 100644 index 00000000..13a2d371 --- /dev/null +++ b/src/canvas/components.rs @@ -0,0 +1,8 @@ +//! Lower-level components used throughout bottom. + +pub mod data_table; +pub mod time_graph; +mod tui; +pub mod widget_carousel; + +pub use tui::*; diff --git a/src/canvas/tui_widgets/data_table.rs b/src/canvas/components/data_table.rs similarity index 100% rename from src/canvas/tui_widgets/data_table.rs rename to src/canvas/components/data_table.rs diff --git a/src/canvas/tui_widgets/data_table/column.rs b/src/canvas/components/data_table/column.rs similarity index 100% rename from src/canvas/tui_widgets/data_table/column.rs rename to src/canvas/components/data_table/column.rs diff --git a/src/canvas/tui_widgets/data_table/data_type.rs b/src/canvas/components/data_table/data_type.rs similarity index 100% rename from src/canvas/tui_widgets/data_table/data_type.rs rename to src/canvas/components/data_table/data_type.rs diff --git a/src/canvas/tui_widgets/data_table/draw.rs b/src/canvas/components/data_table/draw.rs similarity index 100% rename from src/canvas/tui_widgets/data_table/draw.rs rename to src/canvas/components/data_table/draw.rs diff --git a/src/canvas/tui_widgets/data_table/props.rs b/src/canvas/components/data_table/props.rs similarity index 100% rename from src/canvas/tui_widgets/data_table/props.rs rename to src/canvas/components/data_table/props.rs diff --git a/src/canvas/tui_widgets/data_table/sortable.rs b/src/canvas/components/data_table/sortable.rs similarity index 100% rename from src/canvas/tui_widgets/data_table/sortable.rs rename to src/canvas/components/data_table/sortable.rs diff --git a/src/canvas/tui_widgets/data_table/state.rs b/src/canvas/components/data_table/state.rs similarity index 100% rename from src/canvas/tui_widgets/data_table/state.rs rename to src/canvas/components/data_table/state.rs diff --git a/src/canvas/tui_widgets/data_table/styling.rs b/src/canvas/components/data_table/styling.rs similarity index 100% rename from src/canvas/tui_widgets/data_table/styling.rs rename to src/canvas/components/data_table/styling.rs diff --git a/src/canvas/tui_widgets/time_graph.rs b/src/canvas/components/time_graph.rs similarity index 99% rename from src/canvas/tui_widgets/time_graph.rs rename to src/canvas/components/time_graph.rs index 2bbcd652..bd19be74 100644 --- a/src/canvas/tui_widgets/time_graph.rs +++ b/src/canvas/components/time_graph.rs @@ -183,7 +183,7 @@ mod test { }; use super::TimeGraph; - use crate::canvas::tui_widgets::time_chart::Axis; + use crate::canvas::components::time_chart::Axis; const Y_LABELS: [Cow<'static, str>; 3] = [ Cow::Borrowed("0%"), diff --git a/src/canvas/components/tui.rs b/src/canvas/components/tui.rs new file mode 100644 index 00000000..c9dc772f --- /dev/null +++ b/src/canvas/components/tui.rs @@ -0,0 +1,4 @@ +//! Components derived from ratatui widgets. + +pub mod pipe_gauge; +pub mod time_chart; diff --git a/src/canvas/tui_widgets/pipe_gauge.rs b/src/canvas/components/tui/pipe_gauge.rs similarity index 100% rename from src/canvas/tui_widgets/pipe_gauge.rs rename to src/canvas/components/tui/pipe_gauge.rs diff --git a/src/canvas/tui_widgets/time_chart.rs b/src/canvas/components/tui/time_chart.rs similarity index 100% rename from src/canvas/tui_widgets/time_chart.rs rename to src/canvas/components/tui/time_chart.rs diff --git a/src/canvas/tui_widgets/time_chart/canvas.rs b/src/canvas/components/tui/time_chart/canvas.rs similarity index 100% rename from src/canvas/tui_widgets/time_chart/canvas.rs rename to src/canvas/components/tui/time_chart/canvas.rs diff --git a/src/canvas/widgets/basic_table_arrows.rs b/src/canvas/components/widget_carousel.rs similarity index 100% rename from src/canvas/widgets/basic_table_arrows.rs rename to src/canvas/components/widget_carousel.rs diff --git a/src/canvas/tui_widgets.rs b/src/canvas/tui_widgets.rs deleted file mode 100644 index 8355c7d1..00000000 --- a/src/canvas/tui_widgets.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Cstom ratatui widgets used by the rest of bottom. - -pub mod data_table; -pub mod pipe_gauge; -pub mod time_chart; -pub mod time_graph; diff --git a/src/canvas/widgets.rs b/src/canvas/widgets.rs index 6b2fe78f..17651416 100644 --- a/src/canvas/widgets.rs +++ b/src/canvas/widgets.rs @@ -1,4 +1,3 @@ -pub mod basic_table_arrows; pub mod battery_display; pub mod cpu_basic; pub mod cpu_graph; diff --git a/src/canvas/widgets/cpu_basic.rs b/src/canvas/widgets/cpu_basic.rs index a2a67c4d..d0fd539a 100644 --- a/src/canvas/widgets/cpu_basic.rs +++ b/src/canvas/widgets/cpu_basic.rs @@ -9,7 +9,7 @@ use tui::{ use crate::{ app::App, canvas::{ - tui_widgets::pipe_gauge::{LabelLimit, PipeGauge}, + components::pipe_gauge::{LabelLimit, PipeGauge}, Painter, }, constants::*, diff --git a/src/canvas/widgets/cpu_graph.rs b/src/canvas/widgets/cpu_graph.rs index 7f4e757e..b5027bc6 100644 --- a/src/canvas/widgets/cpu_graph.rs +++ b/src/canvas/widgets/cpu_graph.rs @@ -9,11 +9,11 @@ use tui::{ use crate::{ app::{layout_manager::WidgetDirection, App}, canvas::{ - drawing_utils::should_hide_x_label, - tui_widgets::{ + components::{ data_table::{DrawInfo, SelectionState}, time_graph::{GraphData, TimeGraph}, }, + drawing_utils::should_hide_x_label, Painter, }, data_conversion::CpuWidgetData, diff --git a/src/canvas/widgets/disk_table.rs b/src/canvas/widgets/disk_table.rs index fe241d14..04a626f8 100644 --- a/src/canvas/widgets/disk_table.rs +++ b/src/canvas/widgets/disk_table.rs @@ -3,7 +3,7 @@ use tui::{layout::Rect, terminal::Frame}; use crate::{ app, canvas::{ - tui_widgets::data_table::{DrawInfo, SelectionState}, + components::data_table::{DrawInfo, SelectionState}, Painter, }, }; diff --git a/src/canvas/widgets/mem_basic.rs b/src/canvas/widgets/mem_basic.rs index e8ae71b7..c950329f 100644 --- a/src/canvas/widgets/mem_basic.rs +++ b/src/canvas/widgets/mem_basic.rs @@ -6,7 +6,7 @@ use tui::{ use crate::{ app::App, - canvas::{tui_widgets::pipe_gauge::PipeGauge, Painter}, + canvas::{components::pipe_gauge::PipeGauge, Painter}, constants::*, }; diff --git a/src/canvas/widgets/mem_graph.rs b/src/canvas/widgets/mem_graph.rs index 819c2956..b9782e5a 100644 --- a/src/canvas/widgets/mem_graph.rs +++ b/src/canvas/widgets/mem_graph.rs @@ -9,8 +9,8 @@ use tui::{ use crate::{ app::App, canvas::{ + components::time_graph::{GraphData, TimeGraph}, drawing_utils::should_hide_x_label, - tui_widgets::time_graph::{GraphData, TimeGraph}, Painter, }, }; diff --git a/src/canvas/widgets/network_graph.rs b/src/canvas/widgets/network_graph.rs index af1b6d73..1b0d4d3a 100644 --- a/src/canvas/widgets/network_graph.rs +++ b/src/canvas/widgets/network_graph.rs @@ -9,11 +9,11 @@ use tui::{ use crate::{ app::{App, AxisScaling}, canvas::{ - drawing_utils::should_hide_x_label, - tui_widgets::{ + components::{ time_chart::Point, time_graph::{GraphData, TimeGraph}, }, + drawing_utils::should_hide_x_label, Painter, }, utils::{data_prefixes::*, data_units::DataUnit, general::partial_ordering}, diff --git a/src/canvas/widgets/process_table.rs b/src/canvas/widgets/process_table.rs index e15f3f09..6ccb2dce 100644 --- a/src/canvas/widgets/process_table.rs +++ b/src/canvas/widgets/process_table.rs @@ -10,7 +10,7 @@ use unicode_segmentation::UnicodeSegmentation; use crate::{ app::{App, AppSearchState}, canvas::{ - tui_widgets::data_table::{DrawInfo, SelectionState}, + components::data_table::{DrawInfo, SelectionState}, Painter, }, constants::*, diff --git a/src/canvas/widgets/temperature_table.rs b/src/canvas/widgets/temperature_table.rs index 9be34ef1..4389ff24 100644 --- a/src/canvas/widgets/temperature_table.rs +++ b/src/canvas/widgets/temperature_table.rs @@ -3,7 +3,7 @@ use tui::{layout::Rect, terminal::Frame}; use crate::{ app, canvas::{ - tui_widgets::data_table::{DrawInfo, SelectionState}, + components::data_table::{DrawInfo, SelectionState}, Painter, }, }; diff --git a/src/data_conversion.rs b/src/data_conversion.rs index f4aee9d6..0d1c4604 100644 --- a/src/data_conversion.rs +++ b/src/data_conversion.rs @@ -7,7 +7,7 @@ use kstring::KString; use crate::{ app::{data_farmer::DataCollection, AxisScaling}, - canvas::tui_widgets::time_chart::Point, + canvas::components::time_chart::Point, data_collection::{cpu::CpuDataType, memory::MemHarvest, temperature::TemperatureType}, utils::{data_prefixes::*, data_units::DataUnit, general::*}, widgets::{DiskWidgetData, TempWidgetData}, diff --git a/src/widgets.rs b/src/widgets.rs index 167a954e..9c0a69be 100644 --- a/src/widgets.rs +++ b/src/widgets.rs @@ -1,4 +1,4 @@ -pub mod battery_widget; +pub mod battery_info; pub mod cpu_graph; pub mod disk_table; pub mod mem_graph; @@ -6,10 +6,17 @@ pub mod net_graph; pub mod process_table; pub mod temperature_table; -pub use battery_widget::*; +pub use battery_info::*; pub use cpu_graph::*; pub use disk_table::*; pub use mem_graph::*; pub use net_graph::*; pub use process_table::*; pub use temperature_table::*; +use tui::{layout::Rect, Frame}; + +/// A [`Widget`] converts raw data into something that a user can see and interact with. +pub trait Widget { + /// How to actually draw the widget to the terminal. + fn draw(&self, f: &mut Frame<'_>, draw_location: Rect, widget_id: u64); +} diff --git a/src/widgets/battery_widget.rs b/src/widgets/battery_info.rs similarity index 100% rename from src/widgets/battery_widget.rs rename to src/widgets/battery_info.rs diff --git a/src/widgets/cpu_graph.rs b/src/widgets/cpu_graph.rs index 38453f68..96873b27 100644 --- a/src/widgets/cpu_graph.rs +++ b/src/widgets/cpu_graph.rs @@ -6,11 +6,11 @@ use tui::{style::Style, text::Text, widgets::Row}; use crate::{ app::AppConfigFields, canvas::{ - styling::CanvasStyling, - tui_widgets::data_table::{ + components::data_table::{ Column, ColumnHeader, DataTable, DataTableColumn, DataTableProps, DataTableStyling, DataToCell, }, + styling::CanvasStyling, Painter, }, data_collection::cpu::CpuDataType, diff --git a/src/widgets/disk_table.rs b/src/widgets/disk_table.rs index 7ac2486e..30b3b132 100644 --- a/src/widgets/disk_table.rs +++ b/src/widgets/disk_table.rs @@ -6,11 +6,11 @@ use tui::text::Text; use crate::{ app::AppConfigFields, canvas::{ - styling::CanvasStyling, - tui_widgets::data_table::{ + components::data_table::{ ColumnHeader, DataTableColumn, DataTableProps, DataTableStyling, DataToCell, SortColumn, SortDataTable, SortDataTableProps, SortOrder, SortsRow, }, + styling::CanvasStyling, }, utils::general::{get_decimal_bytes, sort_partial_fn, truncate_to_text}, }; diff --git a/src/widgets/process_table.rs b/src/widgets/process_table.rs index 172597ca..5db722bd 100644 --- a/src/widgets/process_table.rs +++ b/src/widgets/process_table.rs @@ -19,11 +19,11 @@ use crate::{ AppConfigFields, AppSearchState, }, canvas::{ - styling::CanvasStyling, - tui_widgets::data_table::{ + components::data_table::{ Column, ColumnHeader, ColumnWidthBounds, DataTable, DataTableColumn, DataTableProps, DataTableStyling, SortColumn, SortDataTable, SortDataTableProps, SortOrder, SortsRow, }, + styling::CanvasStyling, }, data_collection::processes::ProcessHarvest, Pid, diff --git a/src/widgets/process_table/proc_widget_column.rs b/src/widgets/process_table/proc_widget_column.rs index 9a0a0b94..ea9e8a11 100644 --- a/src/widgets/process_table/proc_widget_column.rs +++ b/src/widgets/process_table/proc_widget_column.rs @@ -4,7 +4,7 @@ use serde::{de::Error, Deserialize, Serialize}; use super::ProcWidgetData; use crate::{ - canvas::tui_widgets::data_table::{ColumnHeader, SortsRow}, + canvas::components::data_table::{ColumnHeader, SortsRow}, utils::general::sort_partial_fn, }; diff --git a/src/widgets/process_table/proc_widget_data.rs b/src/widgets/process_table/proc_widget_data.rs index 8f71434f..1886c6d9 100644 --- a/src/widgets/process_table/proc_widget_data.rs +++ b/src/widgets/process_table/proc_widget_data.rs @@ -10,7 +10,7 @@ use tui::{text::Text, widgets::Row}; use super::proc_widget_column::ProcColumn; use crate::{ canvas::{ - tui_widgets::data_table::{DataTableColumn, DataToCell}, + components::data_table::{DataTableColumn, DataToCell}, Painter, }, data_collection::processes::ProcessHarvest, diff --git a/src/widgets/process_table/sort_table.rs b/src/widgets/process_table/sort_table.rs index da6a08d3..5b7a9dbd 100644 --- a/src/widgets/process_table/sort_table.rs +++ b/src/widgets/process_table/sort_table.rs @@ -3,7 +3,7 @@ use std::borrow::Cow; use tui::text::Text; use crate::{ - canvas::tui_widgets::data_table::{ColumnHeader, DataTableColumn, DataToCell}, + canvas::components::data_table::{ColumnHeader, DataTableColumn, DataToCell}, utils::general::truncate_to_text, }; diff --git a/src/widgets/temperature_table.rs b/src/widgets/temperature_table.rs index 3a8a9db4..c7d19702 100644 --- a/src/widgets/temperature_table.rs +++ b/src/widgets/temperature_table.rs @@ -7,11 +7,11 @@ use tui::text::Text; use crate::{ app::AppConfigFields, canvas::{ - styling::CanvasStyling, - tui_widgets::data_table::{ + components::data_table::{ ColumnHeader, DataTableColumn, DataTableProps, DataTableStyling, DataToCell, SortColumn, SortDataTable, SortDataTableProps, SortOrder, SortsRow, }, + styling::CanvasStyling, }, data_collection::temperature::TemperatureType, utils::general::{sort_partial_fn, truncate_to_text},