From 73e2c214ee9fab1575d2e88025b2326540dbcd19 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Fri, 1 Aug 2025 16:32:15 -0500 Subject: [PATCH] Refactored the frontend to work with static widgets #11 --- src/frontend.rs | 24 ++++++++++++------------ src/lib.rs | 4 ++++ src/macros.rs | 18 ++++++++++++++++++ src/main.rs | 7 +++++-- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/frontend.rs b/src/frontend.rs index 4d8be49..58d4eff 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -2,12 +2,12 @@ use std::sync::Arc; use crate::{ state::DependencyHandler, - widget::{BoxedElement, Widget, WidgetLoad}, + widget::{StaticWidget, Widget, WidgetLoad}, Screen, }; pub enum RsxElement { - Element(BoxedElement, Vec>, Rsx), + Element(Arc, Rsx), DynElement( Box WidgetLoad + Send + Sync>, @@ -41,18 +41,14 @@ impl Rsx { child.draw_parent(screen, Some(w.clone())); } - RsxElement::Element(f, dep, child) => { - let w = if let Some(parent) = &parent { - let w = screen.draw_box(f); - parent.get_elem().draw_child(&w); - w - } else { - screen.draw_box(f) - }; + RsxElement::Element(ws, child) => { + let w = Arc::new(Widget::Static(ws)); + screen.draw_widget(w.clone()); - for d in dep { - w.dependency_box(d); + if let Some(parent) = &parent { + parent.get_elem().draw_child(&w); } + child.draw_parent(screen, Some(w.clone())); } } @@ -72,6 +68,10 @@ impl Rsx { )); } + pub fn create_element_static(&mut self, element: Arc, children: Rsx) { + self.0.push(RsxElement::Element(element, children)); + } + pub fn expand(&mut self, other: &mut Rsx) { self.0.append(&mut other.0); } diff --git a/src/lib.rs b/src/lib.rs index 69817f9..4786975 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -67,6 +67,10 @@ impl Screen { w } + pub fn draw_widget(self: &Arc, widget: Arc) { + self.widgets.lock().unwrap().push(widget); + } + pub fn draw_dyn WidgetLoad + 'static + Send + Sync>( self: &Arc, element: F, diff --git a/src/macros.rs b/src/macros.rs index 12f045d..dbdc403 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -145,6 +145,12 @@ macro_rules! rsx { #[macro_export] macro_rules! rsx_inner { + // static + ($r:expr, $(@$comp:expr;)* static $s:literal $($rest:tt)*) => { + $r.create_element_static(std::sync::Arc::new($crate::widget::StaticWidget::new(Box::new(format!($s)))) $(.component($comp))* .clone(), $crate::frontend::Rsx(Vec::new())); + $crate::rsx_inner! { $r, $($rest)* }; + }; + ($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $s:literal $($rest:tt)*) => { $r.create_element({ $(let $dep = $dep.clone();)* move || { $crate::widget::WidgetLoad::new(format!($s)) $(.component($comp))* @@ -152,6 +158,18 @@ macro_rules! rsx_inner { $crate::rsx_inner! { $r, $($rest)* }; }; + // static + ($r:expr, $(%$dep:ident)* $(@$comp:expr;)* static $name:path { $($inner:tt)* } ($($e:expr),*) $($rest:tt)*) => { + $r.create_element_static(std::sync::Arc::new($crate::widget::StaticWidget::new(Box::new(<$name>::new($($e),*)))) $(.component($comp))* .clone(), $crate::frontend::Rsx(Vec::new())); + $crate::rsx_inner! { $r, $($rest)* }; + }; + + // static + ($r:expr, $(@$comp:expr;)* static $name:path { $($inner:tt)* } $($rest:tt)*) => { + $r.create_element_static(std::sync::Arc::new($crate::widget::StaticWidget::new(Box::new(<$name>::new()))) $(.component($comp))* .clone(), $crate::frontend::Rsx(Vec::new())); + $crate::rsx_inner! { $r, $($rest)* }; + }; + ($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $name:path { $($inner:tt)* } ($($e:expr),*) $($rest:tt)*) => { $r.create_element({ $(let $dep = $dep.clone();)* move || { $crate::widget::WidgetLoad::new(<$name>::new($($e),*)) $(.component($comp))* diff --git a/src/main.rs b/src/main.rs index 8c77013..36a576b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,11 +2,14 @@ use osui::prelude::*; fn main() -> std::io::Result<()> { let screen = Screen::new(); + screen.extension(VelocityExtension); + let count = use_state(0); rsx! { - %count // Dependency of count - "Count: {count}" + @Velocity(20, 0); + @Transform::new(); + static "Count: {count}" } .draw(&screen);