From c758f55fc6cc861e38838a4696a62bebdde8779c Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 14 Jul 2026 22:08:26 +0200 Subject: [PATCH] Outline --- pulse-ui/src/lib.rs | 2 ++ pulse-ui/src/render.rs | 8 +++++++- pulse-ui/src/widget/mod.rs | 2 ++ pulse-ui/src/widget/outline.rs | 20 ++++++++++++++++++++ src/main.rs | 6 ++---- 5 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 pulse-ui/src/widget/outline.rs diff --git a/pulse-ui/src/lib.rs b/pulse-ui/src/lib.rs index f60bd7b..eafb645 100644 --- a/pulse-ui/src/lib.rs +++ b/pulse-ui/src/lib.rs @@ -25,6 +25,8 @@ pub trait App { self.render(get_screen().allocate(&self.layout().await)) .await; + + crossterm::execute!(std::io::stdout()).unwrap(); } } diff --git a/pulse-ui/src/render.rs b/pulse-ui/src/render.rs index 8e458be..bde8aaf 100644 --- a/pulse-ui/src/render.rs +++ b/pulse-ui/src/render.rs @@ -66,6 +66,12 @@ impl Allocation { widget.render(&mut scope); scope.draw(); } + + pub fn draw_frame(&self, index: usize, widget: W) { + let mut scope = RenderScope::new(self.frame_alloc[index]); + widget.render(&mut scope); + scope.draw(); + } } impl RenderScope { @@ -89,5 +95,5 @@ impl RenderScope { pub fn print_at(x: u16, y: u16, text: &str) { crossterm::execute!(stdout(), crossterm::cursor::MoveTo(x, y)).unwrap(); - println!("{text}"); + print!("{text}"); } diff --git a/pulse-ui/src/widget/mod.rs b/pulse-ui/src/widget/mod.rs index 8d37a34..f11b45f 100644 --- a/pulse-ui/src/widget/mod.rs +++ b/pulse-ui/src/widget/mod.rs @@ -1,3 +1,5 @@ +pub mod outline; + use crate::render::RenderScope; pub trait Widget { diff --git a/pulse-ui/src/widget/outline.rs b/pulse-ui/src/widget/outline.rs new file mode 100644 index 0000000..b2ab554 --- /dev/null +++ b/pulse-ui/src/widget/outline.rs @@ -0,0 +1,20 @@ +use crate::widget::Widget; + +pub struct Outline; + +impl Widget for Outline { + fn render(&self, scope: &mut crate::render::RenderScope) { + scope.draw_text(0, "-".repeat(scope.rect.width as usize)); + + scope.draw_text((0, 1), "|\n".repeat(scope.rect.height as usize - 2)); + scope.draw_text( + (scope.rect.width, 1), + "|\n".repeat(scope.rect.height as usize - 2), + ); + + scope.draw_text( + (0, scope.rect.height), + "-".repeat(scope.rect.width as usize), + ); + } +} diff --git a/src/main.rs b/src/main.rs index 5187e18..1048831 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,7 @@ use std::any::Any; use pulse_ui::{ - App, - layout::{LayoutItem, layout}, - state::State, - unit::Size, + App, layout::{LayoutItem, layout}, state::State, unit::Size, widget::outline::Outline, }; pub struct PulseTradeApp { @@ -27,6 +24,7 @@ impl App for PulseTradeApp { async fn render(&mut self, layout: pulse_ui::layout::Allocation) { layout.draw(1, "Yo"); + layout.draw_frame(0, Outline); } }