From e3d8c2115570e47d29b67c4aa810b0a68a998a50 Mon Sep 17 00:00:00 2001 From: TerraMaster85 Date: Sun, 12 Jul 2026 23:59:07 -0400 Subject: [PATCH] feat: misguided attempt #2 --- Cargo.lock | 7 +++ Cargo.toml | 2 +- src/.lib.rs.swp | Bin 0 -> 12288 bytes src/elements/element.rs | 8 ++++ src/elements/frame.rs | 85 ++++++++++++++++++++++++++++++++++ src/elements/mod.rs | 4 ++ src/elements/root.rs | 2 + src/error.rs | 9 ++-- src/lib.rs | 4 +- src/widgets/frame.rs | 43 ------------------ src/widgets/mod.rs | 4 -- src/widgets/widget.rs | 98 ---------------------------------------- 12 files changed, 112 insertions(+), 154 deletions(-) create mode 100644 src/.lib.rs.swp create mode 100644 src/elements/element.rs create mode 100644 src/elements/frame.rs create mode 100644 src/elements/mod.rs create mode 100644 src/elements/root.rs delete mode 100644 src/widgets/frame.rs delete mode 100644 src/widgets/mod.rs delete mode 100644 src/widgets/widget.rs diff --git a/Cargo.lock b/Cargo.lock index 5725e93a170aa276c146f5ed89e90e21de260e0b..f9098a63210f702ba6cb8e1a2aad3b5d606b739c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,6 +43,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "either" version = "1.16.0" @@ -149,6 +155,7 @@ checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" dependencies = [ "bitflags", "compact_str", + "critical-section", "hashbrown 0.17.1", "itertools", "kasuari", diff --git a/Cargo.toml b/Cargo.toml index f28c15488964390bae2ed13766b5adb9511692ba..958723a2387860e7d4df87398e8eb742e18ad1ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,4 @@ version = "0.1.0" edition = "2024" [dependencies] -ratatui-core = "0.1.2" +ratatui-core = { version = "0.1.2", features = ["layout-cache"] } diff --git a/src/.lib.rs.swp b/src/.lib.rs.swp new file mode 100644 index 0000000000000000000000000000000000000000..6be78b01a3f92b48af7a8abaac6474e06d7630bd GIT binary patch literal 12288 zcmeI&O-jQ+6u|MO;3+N5> z48DN~#Z49kq40n3n0c9*$MD;QBpgo8F1*vhNHlgu?#?e4&)ul~5Q^AzeBvHAg^i7w z_U*lC*!bug`h{8e%OtZ^k|lm=W?F;;Q#PDs836>=5UA|DKi-z((b3R#>Fw`%-Okk- z4LOPc0tg_000IagfB*uUCSZ$}Jn5y|^~Ja9vGr%HO9liGKmY**5I_I{1Q0*~0R#}( zK!Ir_^0FiHrs=-_|Gxi!YyGA9srjM#uIcu?Y7z(_fB*srAb &layout::Constraint; + fn render(&self); +} diff --git a/src/elements/frame.rs b/src/elements/frame.rs new file mode 100644 index 0000000000000000000000000000000000000000..65b3c251222f0ce96a30fa62d328c084fc811614 --- /dev/null +++ b/src/elements/frame.rs @@ -0,0 +1,85 @@ +use ratatui_core::layout; +use ratatui_core::style; +use ratatui_core::symbols; +use ratatui_core::widgets::Widget; + +use super::element::Element; +use crate::error; + +pub struct VFrame<'a> { + children: Vec>, + constraint: layout::Constraint, + fill: style::Style, +} + +impl Element for Frame { + fn add_child(&mut self, child: Box) -> Result<(), error::LintuiniError>{ + + self.children.push(child); + Ok(()) + } + #[inline(always)] + fn children(&self) -> &[Box] { + self.children.as_slice() + } + #[inline(always)] + fn children_mut(&mut self) -> &mut [Box] { + self.children.as_mut_slice() + } + + #[inline(always)] + fn constraint(&self) -> &layout::Constraint { + &self.constraint + } +} + +#[derive(Default)] +pub struct FrameBuilder<'a> { + fill: style::Style, + constraint: layout::Constraint, + border: Option>, +} + +impl FrameBuilder<'_> { + #[inline(always)] + fn new() -> Self { + FrameBuilder::default() + } + #[inline(always)] + fn fill(mut self, style: style::Style) -> Self { + self.fill = style; + self + } + #[inline(always)] + fn border_style(mut self, style: style::Style) -> Self { + match self.border { + Some(mut bs) => { bs.style = style; }, + None => { self.border = Some(BorderStyle { style: style, ..Default::default() }) }, + } + self + } + #[inline(always)] + fn border_charset(mut self, charset: symbols::border::Set<'_>) -> Self { + match self.border { + Some(mut bs) => { bs.charset = charset; }, + None => { self.border = Some(BorderStyle { charset: charset, ..Default::default() }) }, + } + self + } + + #[inline(always)] + fn build<'a>(self) -> Frame<'a> { + Frame { + border: self.border.clone(), + constraint: self.constraint, + children: Vec::new(), + fill: self.fill, + } + } +} + +#[derive(Clone, Copy, Default)] +pub struct BorderStyle<'a> { + style: style::Style, + charset: symbols::border::Set<'a>, +} diff --git a/src/elements/mod.rs b/src/elements/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..cba537a1ff79a055c05be7de01eca5e51cf8c585 --- /dev/null +++ b/src/elements/mod.rs @@ -0,0 +1,4 @@ +pub mod frame; + +pub mod element; +pub use element::*; diff --git a/src/elements/root.rs b/src/elements/root.rs new file mode 100644 index 0000000000000000000000000000000000000000..df23cb29eeabdc66d7eff93b8aea189b58313084 --- /dev/null +++ b/src/elements/root.rs @@ -0,0 +1,2 @@ +pub struct Root { + diff --git a/src/error.rs b/src/error.rs index bd0719dbebb605de1dcd20aeeeb7756416458339..a85fce07e372315d5d435f9e9b0ba1a406dc369d 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,15 +1,12 @@ #[derive(Debug)] -pub enum WitError { - WidgetError(WidgetError), - CompositorError(CompositorError), +pub enum LintuiniError { + ElementError(ElementError), } #[derive(Debug)] -pub enum WidgetError { +pub enum ElementError { SetSize, AddChild, - SetPos, - SetDisplayMode, } #[derive(Debug)] diff --git a/src/lib.rs b/src/lib.rs index a223441fa9f565bf154f13519264f0b9e13b0f70..f3392653bec26dc734f4867f532c75989d259493 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,6 @@ -pub mod widgets; +pub mod elements; pub mod error; #[cfg(test)] -mod tests; +mod test; diff --git a/src/widgets/frame.rs b/src/widgets/frame.rs deleted file mode 100644 index 2e7345f428fa260ce5d81430c389ef8e6e1356ca..0000000000000000000000000000000000000000 --- a/src/widgets/frame.rs +++ /dev/null @@ -1,43 +0,0 @@ -use super::widget::{Widget, DisplayMode, WidgetSize, WidgetPos}; -use crate::error; - -pub struct Frame { - size: WidgetSize, - pos: WidgetPos, - display_mode: DisplayMode, - children: Vec>, -} - -impl Widget for Frame { - fn set_size(&mut self, new_size: WidgetSize) -> Result<(), error::WitError>{ - self.size = new_size; - Ok(()) - } - fn size(&self) -> WidgetSize { - self.size - } - - fn add_child(&mut self, child: Box) -> Result<(), error::WitError>{ - self.children.push(child); - Ok(()) - } - fn children(&self) -> &[Box] { - self.children.as_slice() - } - - fn set_pos(&mut self, new_pos: WidgetPos) -> Result<(), error::WitError>{ - self.pos = new_pos; - Ok(()) - } - fn pos(&self) -> WidgetPos { - self.pos - } - - fn set_display_mode(&mut self, new_display_mode: DisplayMode) -> Result<(), error::WitError>{ - self.display_mode = new_display_mode; - Ok(()) - } - fn display_mode(&self) -> DisplayMode { - self.display_mode - } -} diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs deleted file mode 100644 index 81fc6268e4d1ea61663766b70ae9da3b81199bcb..0000000000000000000000000000000000000000 --- a/src/widgets/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod frame; - -pub mod widget; -pub use widget::*; diff --git a/src/widgets/widget.rs b/src/widgets/widget.rs deleted file mode 100644 index b1754f6c7fa5d93fcbc0ea504e5babcd1949534f..0000000000000000000000000000000000000000 --- a/src/widgets/widget.rs +++ /dev/null @@ -1,98 +0,0 @@ -use crate::error; - -pub trait Widget { - fn set_size(&mut self, size: WidgetSize) -> Result<(), error::WitError>; - fn size(&self) -> WidgetSize; - fn add_child(&mut self, child: Box) -> Result<(), error::WitError>; - fn children(&self) -> &[Box]; - fn set_pos(&mut self, pos: WidgetPos) -> Result<(), error::WitError>; - fn pos(&self) -> WidgetPos; - fn set_display_mode(&mut self, display: DisplayMode) -> Result<(), error::WitError>; - fn display_mode(&self) -> DisplayMode; - - fn set_static(&mut self) -> Result<(), error::WitError> { self.set_display_mode(DisplayMode::Static) } - fn is_static(&self) -> bool { matches!(self.display_mode(), DisplayMode::Static) } - fn set_floating(&mut self) -> Result<(), error::WitError> { self.set_display_mode(DisplayMode::Floating) } - fn is_floating(&self) -> bool { matches!(self.display_mode(), DisplayMode::Floating) } - fn hide(&mut self) -> Result<(), error::WitError> { self.set_display_mode(DisplayMode::Hidden) } - fn is_hidden(&self) -> bool { matches!(self.display_mode(), DisplayMode::Hidden) } -} - -// should write some macros to make this nicer - -#[derive(Clone, Copy)] -pub struct WidgetSize(WidgetSizeDimn, WidgetSizeDimn); - -impl WidgetSize { - #[inline(always)] - pub fn x(&self) -> WidgetSizeDimn { - self.0 - } - #[inline(always)] - pub fn y(&self) -> WidgetSizeDimn { - self.1 - } -} - -impl From for (u16, u16) { - #[inline(always)] - fn from(size: WidgetSize) -> Self { - (size.0.into(), size.1.into()) - } -} - -#[derive(Clone, Copy)] -pub enum WidgetSizeDimn { - Static(u16), - Fill, - Fit, -} - -impl From for u16 { - #[inline(always)] - fn from(dim: WidgetSizeDimn) -> Self { - match dim { - WidgetSizeDimn::Static(x) => x, - WidgetSizeDimn::Fill => todo!(), - WidgetSizeDimn::Fit => todo!(), - } - } -} - -#[derive(Clone, Copy)] -pub struct WidgetPos(WidgetPosDimn, WidgetPosDimn); - -impl WidgetPos { - #[inline(always)] - pub fn x(&self) -> WidgetPosDimn { - self.0 - } - #[inline(always)] - pub fn y(&self) -> WidgetPosDimn { - self.1 - } -} - -impl Default for WidgetPos { - fn default() -> WidgetPos { - WidgetPos(WidgetPosDimn::FloatStart, WidgetPosDimn::FloatStart) - } -} - -#[derive(Clone, Copy)] -pub enum WidgetPosDimn { - Static(u16), - FloatStart, - FloatEnd, -} - -impl Default for WidgetPosDimn { - fn default() -> Self { Self::FloatStart } -} - -#[derive(Clone, Copy)] -pub enum DisplayMode { - Static, - Floating, - Hidden, -}