From 2d8755b13cab43a7139114914273904ba0a17534 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 2 Aug 2025 12:58:45 -0500 Subject: [PATCH] added heading #19 --- Cargo.toml | 1 + src/demos/mod.rs | 3 ++- src/elements/heading.rs | 55 +++++++++++++++++++++++++++++++++++++++++ src/elements/mod.rs | 2 ++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/elements/heading.rs diff --git a/Cargo.toml b/Cargo.toml index 9a61700..bbf4fc5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ cc = "1.0" [dependencies] crossterm = "0.28.1" +figlet-rs = "0.1.5" [profile.dev] opt-level = 1 diff --git a/src/demos/mod.rs b/src/demos/mod.rs index 06766a8..410cde4 100644 --- a/src/demos/mod.rs +++ b/src/demos/mod.rs @@ -20,7 +20,8 @@ pub fn app(screen: Arc) -> Rsx { screen.close(); }}); FlexRow, gap: 1, { - FlexCol { + FlexCol, gap: 3, { + Heading, smooth: false, { "OSUI" } @Transform::new().padding(2, 2); @Style { foreground: None, background: Background::RoundedOutline(0x00ff00) }; Div { diff --git a/src/elements/heading.rs b/src/elements/heading.rs new file mode 100644 index 0000000..cafffa8 --- /dev/null +++ b/src/elements/heading.rs @@ -0,0 +1,55 @@ +use std::sync::{Arc, Mutex}; + +use figlet_rs::FIGfont; + +use crate::{ + widget::{Element, Widget}, + NoRender, +}; + +pub struct Heading { + pub font: FIGfont, + pub smooth: bool, + children: Mutex>>, +} + +impl Heading { + pub fn new() -> Heading { + Heading { + font: FIGfont::standard().unwrap(), + smooth: false, + children: Mutex::new(Vec::new()), + } + } +} + +impl Element for Heading { + fn render(&mut self, scope: &mut crate::prelude::RenderScope) { + let mut s = String::new(); + for element in self.children.lock().unwrap().iter() { + if let Some(e) = element.get_elem().as_any().downcast_ref::() { + s += e; + } + } + if let Some(t) = self.font.convert(&s) { + scope.draw_text(&if self.smooth { + format!("{t}").replace("-", "─").replace("|", "│") + } else { + format!("{t}") + }); + } + } + + fn draw_child(&self, element: &Arc) { + element.inject(|w| w.component(NoRender)); + self.children.lock().unwrap().push(element.clone()); + } + + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } +} diff --git a/src/elements/mod.rs b/src/elements/mod.rs index 8ea79e0..38732e3 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -1,8 +1,10 @@ pub mod div; pub mod flex; +pub mod heading; pub use div::*; pub use flex::*; +pub use heading::*; use crate::Element;