diff --git a/src/app/layout_manager.rs b/src/app/layout_manager.rs index 6c45f936..7656b2e3 100644 --- a/src/app/layout_manager.rs +++ b/src/app/layout_manager.rs @@ -2,7 +2,7 @@ use crate::{ app::SelectableType, data_conversion::ConvertedData, error::{BottomError, Result}, - options::layout_options::{FinalWidget, LayoutRow, LayoutRowChild, LayoutRule}, + options::layout_options::{FinalWidget, LayoutRow, LayoutRowChild, WidgetLayoutRule}, tuine::*, }; use anyhow::anyhow; @@ -101,7 +101,7 @@ Supported widget names: #[derive(Debug, PartialEq, Eq, Clone)] pub struct RowLayout { last_selected: Option, - pub parent_rule: LayoutRule, + pub parent_rule: WidgetLayoutRule, pub bound: Rect, } @@ -109,7 +109,7 @@ pub struct RowLayout { #[derive(Debug, PartialEq, Eq, Clone)] pub struct ColLayout { last_selected: Option, - pub parent_rule: LayoutRule, + pub parent_rule: WidgetLayoutRule, pub bound: Rect, } @@ -180,7 +180,7 @@ pub enum WidgetLayoutNode { Widget { widget_type: BottomWidgetType, selected: bool, - rule: LayoutRule, + rule: WidgetLayoutRule, }, } @@ -254,10 +254,10 @@ impl WidgetLayoutNode { } } - fn wrap_element(element: Element, rule: &LayoutRule) -> FlexElement { + fn wrap_element(element: Element, rule: &WidgetLayoutRule) -> FlexElement { match rule { - LayoutRule::Expand { ratio } => FlexElement::with_flex(element, *ratio), - LayoutRule::Length { width, height } => { + WidgetLayoutRule::Expand { ratio } => FlexElement::with_flex(element, *ratio), + WidgetLayoutRule::Length { width, height } => { if width.is_some() || height.is_some() { FlexElement::with_no_flex( Container::with_child(element).width(*width).height(*height), diff --git a/src/app/widgets.rs b/src/app/widgets.rs index 2607a51a..1173e294 100644 --- a/src/app/widgets.rs +++ b/src/app/widgets.rs @@ -7,7 +7,7 @@ use tui::{backend::Backend, layout::Rect, Frame}; use crate::{ app::event::{ComponentEventResult, SelectionAction}, canvas::Painter, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; mod tui_stuff; @@ -133,10 +133,10 @@ pub trait Widget { fn update_data(&mut self, data_collection: &DataCollection) {} /// Returns the desired width from the [`Widget`]. - fn width(&self) -> LayoutRule; + fn width(&self) -> WidgetLayoutRule; /// Returns the desired height from the [`Widget`]. - fn height(&self) -> LayoutRule; + fn height(&self) -> WidgetLayoutRule; /// Returns whether this [`Widget`] can be selected. The default implementation returns [`SelectableType::Selectable`]. fn selectable_type(&self) -> SelectableType { diff --git a/src/app/widgets/bottom_widgets/basic_cpu.rs b/src/app/widgets/bottom_widgets/basic_cpu.rs index 02219f3c..99d0ff9f 100644 --- a/src/app/widgets/bottom_widgets/basic_cpu.rs +++ b/src/app/widgets/bottom_widgets/basic_cpu.rs @@ -11,7 +11,7 @@ use crate::{ app::{widgets::tui_stuff::PipeGauge, AppConfig, Component, DataCollection, Widget}, canvas::Painter, constants::SIDE_BORDERS, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; const REQUIRED_COLUMNS: usize = 4; @@ -20,7 +20,7 @@ const REQUIRED_COLUMNS: usize = 4; pub struct BasicCpu { bounds: Rect, display_data: Vec<(f64, String, String)>, - width: LayoutRule, + width: WidgetLayoutRule, showing_avg: bool, } @@ -36,7 +36,7 @@ impl BasicCpu { } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } @@ -184,11 +184,11 @@ impl Widget for BasicCpu { .collect::>(); } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { let display_data_len = self.display_data.len(); let length = max( 1, diff --git a/src/app/widgets/bottom_widgets/basic_mem.rs b/src/app/widgets/bottom_widgets/basic_mem.rs index fd8ab513..77ee4639 100644 --- a/src/app/widgets/bottom_widgets/basic_mem.rs +++ b/src/app/widgets/bottom_widgets/basic_mem.rs @@ -14,13 +14,13 @@ use crate::{ canvas::Painter, constants::SIDE_BORDERS, data_conversion::{convert_mem_data_points, convert_mem_labels, convert_swap_data_points}, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; #[derive(Debug)] pub struct BasicMem { bounds: Rect, - width: LayoutRule, + width: WidgetLayoutRule, mem_data: (f64, String, String), swap_data: Option<(f64, String, String)>, use_percent: bool, @@ -40,7 +40,7 @@ impl Default for BasicMem { impl BasicMem { /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } @@ -155,11 +155,11 @@ impl Widget for BasicMem { }; } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { todo!() } } diff --git a/src/app/widgets/bottom_widgets/basic_net.rs b/src/app/widgets/bottom_widgets/basic_net.rs index ea901398..c17ba5e9 100644 --- a/src/app/widgets/bottom_widgets/basic_net.rs +++ b/src/app/widgets/bottom_widgets/basic_net.rs @@ -11,14 +11,14 @@ use crate::{ canvas::Painter, constants::SIDE_BORDERS, data_conversion::convert_network_data_points, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, units::data_units::DataUnit, }; #[derive(Debug)] pub struct BasicNet { bounds: Rect, - width: LayoutRule, + width: WidgetLayoutRule, rx_display: String, tx_display: String, @@ -45,7 +45,7 @@ impl BasicNet { } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } @@ -124,11 +124,11 @@ impl Widget for BasicNet { } } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { todo!() } } diff --git a/src/app/widgets/bottom_widgets/battery.rs b/src/app/widgets/bottom_widgets/battery.rs index 3f76ddfc..321e624b 100644 --- a/src/app/widgets/bottom_widgets/battery.rs +++ b/src/app/widgets/bottom_widgets/battery.rs @@ -17,7 +17,7 @@ use crate::{ canvas::Painter, constants::TABLE_GAP_HEIGHT_LIMIT, data_conversion::{convert_battery_harvest, ConvertedBatteryData}, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; /// A table displaying battery information on a per-battery basis. @@ -25,8 +25,8 @@ pub struct BatteryTable { bounds: Rect, selected_index: usize, battery_data: Vec, - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, block_border: Borders, tab_bounds: Vec, } @@ -37,8 +37,8 @@ impl Default for BatteryTable { bounds: Default::default(), selected_index: 0, battery_data: Default::default(), - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), block_border: Borders::ALL, tab_bounds: Default::default(), } @@ -47,13 +47,13 @@ impl Default for BatteryTable { impl BatteryTable { /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -147,11 +147,11 @@ impl Widget for BatteryTable { } } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } diff --git a/src/app/widgets/bottom_widgets/carousel.rs b/src/app/widgets/bottom_widgets/carousel.rs index 3788cf97..2e1100f2 100644 --- a/src/app/widgets/bottom_widgets/carousel.rs +++ b/src/app/widgets/bottom_widgets/carousel.rs @@ -17,7 +17,7 @@ use crate::{ Component, Widget, }, canvas::Painter, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; /// A container that "holds" multiple [`BottomWidget`]s through their [`NodeId`]s. @@ -26,8 +26,8 @@ pub struct Carousel { index: usize, children: Vec<(NodeId, Cow<'static, str>)>, bounds: Rect, - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, left_button_bounds: Rect, right_button_bounds: Rect, } @@ -47,13 +47,13 @@ impl Carousel { } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -191,11 +191,11 @@ impl Widget for Carousel { "Carousel" } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } diff --git a/src/app/widgets/bottom_widgets/cpu.rs b/src/app/widgets/bottom_widgets/cpu.rs index 9f14a441..d5f93c8d 100644 --- a/src/app/widgets/bottom_widgets/cpu.rs +++ b/src/app/widgets/bottom_widgets/cpu.rs @@ -17,7 +17,7 @@ use crate::{ }, canvas::Painter, data_conversion::{convert_cpu_data_points, ConvertedCpuData}, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; /// Which part of the [`CpuGraph`] is currently selected. @@ -45,8 +45,8 @@ pub struct CpuGraph { display_data: Vec, load_avg_data: [f32; 3], - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, } impl CpuGraph { @@ -75,19 +75,19 @@ impl CpuGraph { selected: CpuGraphSelection::Graph, display_data: Default::default(), load_avg_data: [0.0; 3], - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), } } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -281,11 +281,11 @@ impl Widget for CpuGraph { self.load_avg_data = data_collection.load_avg_harvest; } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } diff --git a/src/app/widgets/bottom_widgets/disk.rs b/src/app/widgets/bottom_widgets/disk.rs index ad77f8fe..c962be00 100644 --- a/src/app/widgets/bottom_widgets/disk.rs +++ b/src/app/widgets/bottom_widgets/disk.rs @@ -9,7 +9,7 @@ use crate::{ }, canvas::Painter, data_conversion::convert_disk_row, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; /// A table displaying disk data. @@ -19,8 +19,8 @@ pub struct DiskTable { display_data: TextTableData, - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, block_border: Borders, show_scroll_index: bool, } @@ -43,21 +43,21 @@ impl DiskTable { table, bounds: Rect::default(), display_data: Default::default(), - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), block_border: Borders::ALL, show_scroll_index: false, } } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -126,11 +126,11 @@ impl Widget for DiskTable { self.display_data = convert_disk_row(data_collection); } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } } diff --git a/src/app/widgets/bottom_widgets/empty.rs b/src/app/widgets/bottom_widgets/empty.rs index e444ac2b..34af022e 100644 --- a/src/app/widgets/bottom_widgets/empty.rs +++ b/src/app/widgets/bottom_widgets/empty.rs @@ -2,32 +2,32 @@ use tui::layout::Rect; use crate::{ app::{Component, SelectableType, Widget}, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; pub struct Empty { - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, } impl Default for Empty { fn default() -> Self { Self { - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), } } } impl Empty { /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -46,11 +46,11 @@ impl Widget for Empty { "" } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } diff --git a/src/app/widgets/bottom_widgets/mem.rs b/src/app/widgets/bottom_widgets/mem.rs index c4ada423..2acfc21a 100644 --- a/src/app/widgets/bottom_widgets/mem.rs +++ b/src/app/widgets/bottom_widgets/mem.rs @@ -7,7 +7,7 @@ use crate::{ app::{event::ComponentEventResult, time_graph::TimeGraphData, DataCollection}, app::{Component, TimeGraph, Widget}, data_conversion::{convert_mem_data_points, convert_mem_labels, convert_swap_data_points}, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; /// A widget that deals with displaying memory usage on a [`TimeGraph`]. Basically just a wrapper @@ -19,8 +19,8 @@ pub struct MemGraph { mem_data: Vec<(f64, f64)>, swap_data: Vec<(f64, f64)>, bounds: Rect, - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, } impl MemGraph { @@ -33,19 +33,19 @@ impl MemGraph { mem_data: Default::default(), swap_data: Default::default(), bounds: Rect::default(), - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), } } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -126,11 +126,11 @@ impl Widget for MemGraph { self.swap_labels = swap_labels; } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } } diff --git a/src/app/widgets/bottom_widgets/net.rs b/src/app/widgets/bottom_widgets/net.rs index 0f72fad9..d8a7a4f8 100644 --- a/src/app/widgets/bottom_widgets/net.rs +++ b/src/app/widgets/bottom_widgets/net.rs @@ -15,7 +15,7 @@ use crate::{ }, canvas::Painter, data_conversion::convert_network_data_points, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, units::data_units::DataUnit, utils::gen_util::*, }; @@ -381,8 +381,8 @@ pub struct NetGraph { hide_legend: bool, bounds: Rect, - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, } impl NetGraph { @@ -404,8 +404,8 @@ impl NetGraph { use_binary_prefix: app_config_fields.network_use_binary_prefix, hide_legend: false, bounds: Rect::default(), - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), } } @@ -416,13 +416,13 @@ impl NetGraph { } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -569,11 +569,11 @@ impl Widget for NetGraph { } } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } } @@ -584,8 +584,8 @@ pub struct OldNetGraph { net_graph: NetGraph, table: TextTable, bounds: Rect, - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, } impl OldNetGraph { @@ -602,19 +602,19 @@ impl OldNetGraph { .try_show_gap(config.table_gap) .unselectable(), bounds: Rect::default(), - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), } } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -709,11 +709,11 @@ impl Widget for OldNetGraph { } } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } } diff --git a/src/app/widgets/bottom_widgets/process.rs b/src/app/widgets/bottom_widgets/process.rs index 1cbeebb7..9b3abc0f 100644 --- a/src/app/widgets/bottom_widgets/process.rs +++ b/src/app/widgets/bottom_widgets/process.rs @@ -26,7 +26,7 @@ use crate::{ }, canvas::Painter, data_conversion::{get_string_with_bytes, get_string_with_bytes_per_second}, - options::{layout_options::LayoutRule, ProcessDefaults}, + options::{layout_options::WidgetLayoutRule, ProcessDefaults}, utils::error::BottomError, Pid, }; @@ -271,8 +271,8 @@ pub struct ProcessManager { display_data: TextTableData, process_filter: Option>, block_border: Borders, - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, show_scroll_index: bool, } @@ -311,8 +311,8 @@ impl ProcessManager { display_data: Default::default(), process_filter: None, block_border: Borders::ALL, - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), show_scroll_index: false, }; @@ -330,13 +330,13 @@ impl ProcessManager { } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -1362,11 +1362,11 @@ impl Widget for ProcessManager { }; } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } diff --git a/src/app/widgets/bottom_widgets/temp.rs b/src/app/widgets/bottom_widgets/temp.rs index 44071ffe..4dbd401f 100644 --- a/src/app/widgets/bottom_widgets/temp.rs +++ b/src/app/widgets/bottom_widgets/temp.rs @@ -9,7 +9,7 @@ use crate::{ }, canvas::Painter, data_conversion::convert_temp_row, - options::layout_options::LayoutRule, + options::layout_options::WidgetLayoutRule, }; /// A table displaying temperature data. @@ -18,8 +18,8 @@ pub struct TempTable { bounds: Rect, display_data: TextTableData, temp_type: TemperatureType, - width: LayoutRule, - height: LayoutRule, + width: WidgetLayoutRule, + height: WidgetLayoutRule, block_border: Borders, show_scroll_index: bool, } @@ -39,8 +39,8 @@ impl TempTable { bounds: Rect::default(), display_data: Default::default(), temp_type: TemperatureType::default(), - width: LayoutRule::default(), - height: LayoutRule::default(), + width: WidgetLayoutRule::default(), + height: WidgetLayoutRule::default(), block_border: Borders::ALL, show_scroll_index: false, } @@ -53,13 +53,13 @@ impl TempTable { } /// Sets the width. - pub fn width(mut self, width: LayoutRule) -> Self { + pub fn width(mut self, width: WidgetLayoutRule) -> Self { self.width = width; self } /// Sets the height. - pub fn height(mut self, height: LayoutRule) -> Self { + pub fn height(mut self, height: WidgetLayoutRule) -> Self { self.height = height; self } @@ -128,11 +128,11 @@ impl Widget for TempTable { self.display_data = convert_temp_row(data_collection, &self.temp_type); } - fn width(&self) -> LayoutRule { + fn width(&self) -> WidgetLayoutRule { self.width } - fn height(&self) -> LayoutRule { + fn height(&self) -> WidgetLayoutRule { self.height } } diff --git a/src/constants.rs b/src/constants.rs index dd27fd6d..56d8b2ab 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -462,19 +462,23 @@ pub const DEFAULT_BATTERY_LAYOUT: &str = r##" pub const DEFAULT_BASIC_LAYOUT: &str = r##" [[row]] + ratio = 0 [[row.child]] type = "bcpu" [[row]] + ratio = 0 [[row.child]] type = "bmem" [[row.child]] type = "bnet" [[row]] + ratio = 0 [[row.child]] [[row.child.child]] length = 1 type = "empty" [[row]] + ratio = 0 [[row.child]] default = true carousel_children = ["proc", "temp", "disk"] diff --git a/src/options/layout_options.rs b/src/options/layout_options.rs index 3eadee49..caff9f61 100644 --- a/src/options/layout_options.rs +++ b/src/options/layout_options.rs @@ -33,18 +33,19 @@ pub enum LayoutRowChild { #[derive(Clone, Deserialize, Debug, Serialize)] pub struct FinalWidget { #[serde(flatten)] - pub rule: Option, + pub rule: Option, #[serde(rename = "type")] pub widget_type: String, pub default: Option, } -/// A "rule" denoting how this component is to be laid out. +/// A "rule" denoting how a widget is to be laid out. #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)] #[serde(untagged)] -pub enum LayoutRule { - /// Expand to whatever space is left; the `ratio` determines how much - /// space to take if there is more than one [`LayoutRule::Expand`] component. +pub enum WidgetLayoutRule { + /// Expand to whatever space is left. The `ratio` field determines + /// how much space to allocate if there are other [`WidgetLayoutRule::Expand`] + /// items. Expand { ratio: u16 }, /// Take up an exact amount of space, if possible. @@ -54,8 +55,8 @@ pub enum LayoutRule { }, } -impl Default for LayoutRule { +impl Default for WidgetLayoutRule { fn default() -> Self { - LayoutRule::Expand { ratio: 1 } + WidgetLayoutRule::Expand { ratio: 1 } } } diff --git a/src/tuine/component/base/block.rs b/src/tuine/component/base/block.rs index 9ea7ea9b..99776ffe 100644 --- a/src/tuine/component/base/block.rs +++ b/src/tuine/component/base/block.rs @@ -73,6 +73,28 @@ where } inner } + + fn outer_size(&self, original: Size) -> Size { + let mut outer = original; + + if self.borders.intersects(Borders::LEFT) { + outer.width = outer.width.saturating_add(1); + } + if self.borders.intersects(Borders::TOP) + || self.left_text.is_some() + || self.right_text.is_some() + { + outer.height = outer.height.saturating_add(1); + } + if self.borders.intersects(Borders::RIGHT) { + outer.width = outer.width.saturating_add(1); + } + if self.borders.intersects(Borders::BOTTOM) { + outer.height = outer.height.saturating_add(1); + } + + outer + } } impl TmpComponent for Block @@ -136,7 +158,7 @@ where ); node.children = vec![child_node]; - child_size + self.outer_size(child_size) } else { Size { width: 0, diff --git a/src/tuine/component/base/flex/flex_element.rs b/src/tuine/component/base/flex/flex_element.rs index 013c8848..9171915d 100644 --- a/src/tuine/component/base/flex/flex_element.rs +++ b/src/tuine/component/base/flex/flex_element.rs @@ -62,28 +62,34 @@ impl FlexElement { } /// Assumes the flex is NOT 0. Will call layout on its children, but will ignore - /// its sizing. + /// its sizing on the given axis. /// /// **Note it does NOT check for div by zero!** Please check this yourself. pub(crate) fn ratio_layout( &self, bounds: Bounds, total_flex: u16, node: &mut LayoutNode, parent_alignment: Axis, ) -> Size { - let (width, height) = match parent_alignment { - Axis::Horizontal => (bounds.max_width * self.flex / total_flex, bounds.max_height), - Axis::Vertical => (bounds.max_width, bounds.max_height * self.flex / total_flex), + let (min_width, min_height, max_width, max_height) = match parent_alignment { + Axis::Horizontal => { + let w = bounds.max_width * self.flex / total_flex; + (w, 0, w, bounds.max_height) + } + Axis::Vertical => { + let h = bounds.max_height * self.flex / total_flex; + (0, h, bounds.max_width, h) + } }; - self.element.layout( + let ratio_res = self.element.layout( Bounds { - min_width: width, - min_height: height, - max_width: width, - max_height: height, + min_width, + min_height, + max_width, + max_height, }, node, ); - Size { width, height } + ratio_res } } diff --git a/src/tuine/component/base/flex/mod.rs b/src/tuine/component/base/flex/mod.rs index 5fd8f374..13a77e36 100644 --- a/src/tuine/component/base/flex/mod.rs +++ b/src/tuine/component/base/flex/mod.rs @@ -1,3 +1,5 @@ +use std::cmp::max; + use tui::{backend::Backend, layout::Rect, Frame}; pub mod flex_element; @@ -119,11 +121,14 @@ impl TmpComponent for Flex { } fn layout(&self, bounds: Bounds, node: &mut LayoutNode) -> Size { - let mut remaining_bounds = bounds; + let mut remaining_bounds = Bounds { + min_width: 0, + min_height: 0, + max_width: bounds.max_width, + max_height: bounds.max_height, + }; let mut children = vec![LayoutNode::default(); self.children.len()]; let mut flexible_children_indexes = vec![]; - let mut current_x_offset = 0; - let mut current_y_offset = 0; let mut sizes = Vec::with_capacity(self.children.len()); let mut current_size = Size::default(); let mut total_flex = 0; @@ -139,7 +144,10 @@ impl TmpComponent for Flex { let size = if remaining_bounds.has_space() { let size = child.child_layout(remaining_bounds, child_node); current_size += size; - remaining_bounds.shrink_size(size); + match &self.alignment { + Axis::Horizontal => remaining_bounds.shrink_width_size(size), + Axis::Vertical => remaining_bounds.shrink_height_size(size), + } size } else { @@ -160,13 +168,23 @@ impl TmpComponent for Flex { // // NB: If you **EVER** make changes in this function, ensure these assumptions // still hold! + // FIXME: [Remove Unsafe] Can potentially just use zips... and maybe partition to combine above and here let child = unsafe { self.children.get_unchecked(index) }; let child_node = unsafe { children.get_unchecked_mut(index) }; let size = unsafe { sizes.get_unchecked_mut(index) }; let new_size = child.ratio_layout(remaining_bounds, total_flex, child_node, self.alignment); - current_size += new_size; + match &self.alignment { + Axis::Horizontal => { + current_size.width += new_size.width; + current_size.height = max(current_size.height, new_size.height); + } + Axis::Vertical => { + current_size.width = max(current_size.width, new_size.width); + current_size.height += new_size.height; + } + } *size = new_size; }); @@ -184,6 +202,9 @@ impl TmpComponent for Flex { // Now that we're done determining sizes, convert all children into the appropriate // layout nodes. Remember - parents determine children, and so, we determine // children here! + let mut current_x_offset = 0; + let mut current_y_offset = 0; + sizes .iter() .zip(children.iter_mut()) @@ -200,7 +221,6 @@ impl TmpComponent for Flex { } }); node.children = children; - current_size } } diff --git a/src/tuine/component/widget/cpu_simple.rs b/src/tuine/component/widget/cpu_simple.rs index e20208f7..79456b34 100644 --- a/src/tuine/component/widget/cpu_simple.rs +++ b/src/tuine/component/widget/cpu_simple.rs @@ -1,6 +1,8 @@ +use std::cmp::{max, min}; + use tui::{text::Text, widgets::Paragraph, Frame}; -use crate::tuine::{DrawContext, StateContext, TmpComponent}; +use crate::tuine::{Bounds, DrawContext, LayoutNode, Size, StateContext, TmpComponent}; /// A [`CpuSimple`] is a widget displaying simple CPU stats. pub struct CpuSimple {} @@ -27,4 +29,11 @@ impl TmpComponent for CpuSimple { rect, ); } + + fn layout(&self, bounds: Bounds, _node: &mut LayoutNode) -> Size { + Size { + width: bounds.max_width, + height: max(bounds.min_height, min(4, bounds.max_height)), // FIXME: Temp value - this is not correct; should be based on data. + } + } } diff --git a/src/tuine/component/widget/mem_simple.rs b/src/tuine/component/widget/mem_simple.rs index 0b3a6fb1..65b2d115 100644 --- a/src/tuine/component/widget/mem_simple.rs +++ b/src/tuine/component/widget/mem_simple.rs @@ -1,6 +1,8 @@ +use std::cmp::{max, min}; + use tui::{text::Text, widgets::Paragraph, Frame}; -use crate::tuine::{DrawContext, StateContext, TmpComponent}; +use crate::tuine::{Bounds, DrawContext, LayoutNode, Size, StateContext, TmpComponent}; /// A [`MemSimple`] is a widget displaying simple CPU stats. pub struct MemSimple {} @@ -27,4 +29,11 @@ impl TmpComponent for MemSimple { rect, ); } + + fn layout(&self, bounds: Bounds, _node: &mut LayoutNode) -> Size { + Size { + width: bounds.max_width, + height: max(bounds.min_height, min(2, bounds.max_height)), + } + } } diff --git a/src/tuine/component/widget/net_simple.rs b/src/tuine/component/widget/net_simple.rs index 60e704ea..ac7f7315 100644 --- a/src/tuine/component/widget/net_simple.rs +++ b/src/tuine/component/widget/net_simple.rs @@ -1,6 +1,8 @@ +use std::cmp::{max, min}; + use tui::{text::Text, widgets::Paragraph, Frame}; -use crate::tuine::{DrawContext, StateContext, TmpComponent}; +use crate::tuine::{Bounds, DrawContext, LayoutNode, Size, StateContext, TmpComponent}; /// A [`NetSimple`] is a widget displaying simple CPU stats. pub struct NetSimple {} @@ -27,4 +29,11 @@ impl TmpComponent for NetSimple { rect, ); } + + fn layout(&self, bounds: Bounds, _node: &mut LayoutNode) -> Size { + Size { + width: bounds.max_width, + height: max(bounds.min_height, min(2, bounds.max_height)), + } + } } diff --git a/src/tuine/layout/bounds.rs b/src/tuine/layout/bounds.rs index 5d282f92..e5eeca46 100644 --- a/src/tuine/layout/bounds.rs +++ b/src/tuine/layout/bounds.rs @@ -26,17 +26,21 @@ impl Bounds { self.max_height = self.max_height.saturating_sub(height); } - /// Shrinks by a given [`Size`]. - pub fn shrink_size(&mut self, size: Size) { + /// Shrinks the width by a given [`Size`]. + pub fn shrink_width_size(&mut self, size: Size) { self.max_width = self.max_width.saturating_sub(size.width); + } + + /// Shrinks the height by a given [`Size`]. + pub fn shrink_height_size(&mut self, size: Size) { self.max_height = self.max_height.saturating_sub(size.height); } /// Returns whether there is any space left in this bound for laying out things. pub fn has_space(&self) -> bool { - self.min_width >= self.max_width - || self.min_height >= self.max_height + !(self.min_width > self.max_width + || self.min_height > self.max_height || self.max_width == 0 - || self.max_height == 0 + || self.max_height == 0) } } diff --git a/src/tuine/runtime.rs b/src/tuine/runtime.rs index ed08f387..d3c3579a 100644 --- a/src/tuine/runtime.rs +++ b/src/tuine/runtime.rs @@ -105,7 +105,7 @@ where }; for msg in messages { - debug!("Message: {:?}", msg); // FIXME: Remove this debug line! + // debug!("Message: {:?}", msg); let msg_result = application.update(msg); should_redraw = should_redraw || msg_result; }