From 91dfed107791cb631f016664613d4cf4c42d4d68 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 24 Apr 2025 21:03:52 +0300 Subject: [PATCH] feat(tui): add Tryptich (3-col layout) --- tui/src/lib.rs | 2 ++ tui/src/tui_content.rs | 19 +++++----- tui/src/tui_content/tui_tryptich.rs | 56 +++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 tui/src/tui_content/tui_tryptich.rs diff --git a/tui/src/lib.rs b/tui/src/lib.rs index f9b1b98..4a5f751 100644 --- a/tui/src/lib.rs +++ b/tui/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(type_changing_struct_update)] + mod tui_engine; pub use self::tui_engine::*; mod tui_content; pub use self::tui_content::*; diff --git a/tui/src/tui_content.rs b/tui/src/tui_content.rs index 0b15a95..0ea658c 100644 --- a/tui/src/tui_content.rs +++ b/tui/src/tui_content.rs @@ -21,12 +21,13 @@ impl> Content for std::sync::Arc { } } -mod tui_border; pub use self::tui_border::*; -mod tui_color; pub use self::tui_color::*; -mod tui_field; pub use self::tui_field::*; -mod tui_file; pub use self::tui_file::*; -mod tui_phat; pub use self::tui_phat::*; -mod tui_repeat; pub use self::tui_repeat::*; -mod tui_scroll; pub use self::tui_scroll::*; -mod tui_string; pub use self::tui_string::*; -mod tui_style; pub use self::tui_style::*; +mod tui_border; pub use self::tui_border::*; +mod tui_color; pub use self::tui_color::*; +mod tui_field; pub use self::tui_field::*; +mod tui_file; pub use self::tui_file::*; +mod tui_phat; pub use self::tui_phat::*; +mod tui_repeat; pub use self::tui_repeat::*; +mod tui_scroll; pub use self::tui_scroll::*; +mod tui_string; pub use self::tui_string::*; +mod tui_style; pub use self::tui_style::*; +mod tui_tryptich; pub use self::tui_tryptich::*; diff --git a/tui/src/tui_content/tui_tryptich.rs b/tui/src/tui_content/tui_tryptich.rs new file mode 100644 index 0000000..ef8bf6b --- /dev/null +++ b/tui/src/tui_content/tui_tryptich.rs @@ -0,0 +1,56 @@ +use crate::*; + +/// A three-column layout. +pub struct Tryptich { + pub top: bool, + pub h: u16, + pub left: (u16, A), + pub middle: (u16, B), + pub right: (u16, C), +} + +impl Tryptich<(), (), ()> { + pub fn center (h: u16) -> Self { + Self { h, top: false, left: (0, ()), middle: (0, ()), right: (0, ()) } + } + pub fn top (h: u16) -> Self { + Self { h, top: true, left: (0, ()), middle: (0, ()), right: (0, ()) } + } +} + +impl Tryptich { + pub fn left (self, w: u16, content: D) -> Tryptich { + Tryptich { left: (w, content), ..self } + } + pub fn middle (self, w: u16, content: D) -> Tryptich { + Tryptich { middle: (w, content), ..self } + } + pub fn right (self, w: u16, content: D) -> Tryptich { + Tryptich { right: (w, content), ..self } + } +} + +impl Content for Tryptich +where A: Content, B: Content, C: Content { + fn content (&self) -> impl Render { + let Self { top, h, left: (w_a, ref a), middle: (w_b, ref b), right: (w_c, ref c) } = *self; + Fixed::y(h, if top { + Bsp::a( + Fill::x(Align::n(Fixed::x(w_b, Align::x(Tui::bg(Color::Reset, b))))), + Bsp::a( + Fill::x(Align::nw(Fixed::x(w_a, Tui::bg(Color::Reset, a)))), + Fill::x(Align::ne(Fixed::x(w_c, Tui::bg(Color::Reset, c)))), + ), + ) + } else { + Bsp::a( + Fill::xy(Align::c(Fixed::x(w_b, Align::x(Tui::bg(Color::Reset, b))))), + Bsp::a( + Fill::xy(Align::w(Fixed::x(w_a, Tui::bg(Color::Reset, a)))), + Fill::xy(Align::e(Fixed::x(w_c, Tui::bg(Color::Reset, c)))), + ), + ) + }) + } +} +