From 9953e4a0bc674f23d12e611b7ebaf5d86a95ab14 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 24 Jan 2026 17:46:33 +0100 Subject: [PATCH] Render position --- examples/hello_world.rs | 16 +++++++++++++++- src/component.rs | 2 +- src/engine.rs | 18 ++++++++++++++++-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/examples/hello_world.rs b/examples/hello_world.rs index 387c314..72dc920 100644 --- a/examples/hello_world.rs +++ b/examples/hello_world.rs @@ -23,7 +23,21 @@ fn main() { } fn app(cx: &Arc) -> View { - cx.child(my_component, None); + cx.child( + my_component, + Some(Arc::new(|ctx, view| { + let area = ctx.allocate(0, 0, 0, 0); + ctx.draw_view(area, view) + })), + ); + + cx.child( + my_component, + Some(Arc::new(|ctx, view| { + let area = ctx.allocate(0, 1, 0, 0); + ctx.draw_view(area, view) + })), + ); Arc::new({ let cx = cx.clone(); diff --git a/src/component.rs b/src/component.rs index 60758b5..1081e73 100644 --- a/src/component.rs +++ b/src/component.rs @@ -138,7 +138,7 @@ impl Context { if let Some(view_wrapper) = view_wrapper { view_wrapper(ctx, view) } else { - ctx.draw_view(ctx.allocated.clone(), view); + ctx.draw_view(ctx.area.clone(), view); } } } diff --git a/src/engine.rs b/src/engine.rs index 092148f..ac02d84 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -1,4 +1,9 @@ -use std::sync::{Arc, Mutex}; +use std::{ + io::{stdout, Write}, + sync::{Arc, Mutex}, +}; + +use crossterm::{cursor::MoveTo, execute, terminal::Clear}; use crate::{prelude::Context, render::Area, DrawContext, View}; @@ -37,6 +42,10 @@ impl Console { loop { let (width, height) = crossterm::terminal::size().unwrap(); + + execute!(stdout(), Clear(crossterm::terminal::ClearType::Purge)).unwrap(); + execute!(stdout(), Clear(crossterm::terminal::ClearType::All)).unwrap(); + self.draw_context(&self.render_view( &Area { x: 0, @@ -62,7 +71,12 @@ impl Engine for Console { fn draw_context(&self, ctx: &DrawContext) { for inst in &ctx.drawing { match inst { - crate::render::DrawInstruction::Text(_point, text) => println!("{text}"), + crate::render::DrawInstruction::Text(point, text) => { + let (x, y) = (ctx.area.x + point.x, ctx.area.y + point.y); + execute!(stdout(), MoveTo(x, y),).unwrap(); + print!("{text}"); + stdout().flush().unwrap(); + } crate::render::DrawInstruction::Child(_point, child) => self.draw_context(child), crate::render::DrawInstruction::View(area, view) => { self.draw_context(&self.render_view(area, view))