Refactored the frontend to work with static widgets #11

This commit is contained in:
2025-08-01 16:32:56 -05:00
parent 45db1fb774
commit 73e2c214ee
4 changed files with 39 additions and 14 deletions
+12 -12
View File
@@ -2,12 +2,12 @@ use std::sync::Arc;
use crate::{ use crate::{
state::DependencyHandler, state::DependencyHandler,
widget::{BoxedElement, Widget, WidgetLoad}, widget::{StaticWidget, Widget, WidgetLoad},
Screen, Screen,
}; };
pub enum RsxElement { pub enum RsxElement {
Element(BoxedElement, Vec<Box<dyn DependencyHandler>>, Rsx), Element(Arc<StaticWidget>, Rsx),
DynElement( DynElement(
Box<dyn FnMut() -> WidgetLoad + Send + Sync>, Box<dyn FnMut() -> WidgetLoad + Send + Sync>,
@@ -41,18 +41,14 @@ impl Rsx {
child.draw_parent(screen, Some(w.clone())); child.draw_parent(screen, Some(w.clone()));
} }
RsxElement::Element(f, dep, child) => { RsxElement::Element(ws, child) => {
let w = if let Some(parent) = &parent { let w = Arc::new(Widget::Static(ws));
let w = screen.draw_box(f); screen.draw_widget(w.clone());
parent.get_elem().draw_child(&w);
w
} else {
screen.draw_box(f)
};
for d in dep { if let Some(parent) = &parent {
w.dependency_box(d); parent.get_elem().draw_child(&w);
} }
child.draw_parent(screen, Some(w.clone())); child.draw_parent(screen, Some(w.clone()));
} }
} }
@@ -72,6 +68,10 @@ impl Rsx {
)); ));
} }
pub fn create_element_static(&mut self, element: Arc<StaticWidget>, children: Rsx) {
self.0.push(RsxElement::Element(element, children));
}
pub fn expand(&mut self, other: &mut Rsx) { pub fn expand(&mut self, other: &mut Rsx) {
self.0.append(&mut other.0); self.0.append(&mut other.0);
} }
+4
View File
@@ -67,6 +67,10 @@ impl Screen {
w w
} }
pub fn draw_widget(self: &Arc<Self>, widget: Arc<Widget>) {
self.widgets.lock().unwrap().push(widget);
}
pub fn draw_dyn<F: FnMut() -> WidgetLoad + 'static + Send + Sync>( pub fn draw_dyn<F: FnMut() -> WidgetLoad + 'static + Send + Sync>(
self: &Arc<Self>, self: &Arc<Self>,
element: F, element: F,
+18
View File
@@ -145,6 +145,12 @@ macro_rules! rsx {
#[macro_export] #[macro_export]
macro_rules! rsx_inner { 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:expr, $(%$dep:ident)* $(@$comp:expr;)* $s:literal $($rest:tt)*) => {
$r.create_element({ $(let $dep = $dep.clone();)* move || { $r.create_element({ $(let $dep = $dep.clone();)* move || {
$crate::widget::WidgetLoad::new(format!($s)) $(.component($comp))* $crate::widget::WidgetLoad::new(format!($s)) $(.component($comp))*
@@ -152,6 +158,18 @@ macro_rules! rsx_inner {
$crate::rsx_inner! { $r, $($rest)* }; $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:expr, $(%$dep:ident)* $(@$comp:expr;)* $name:path { $($inner:tt)* } ($($e:expr),*) $($rest:tt)*) => {
$r.create_element({ $(let $dep = $dep.clone();)* move || { $r.create_element({ $(let $dep = $dep.clone();)* move || {
$crate::widget::WidgetLoad::new(<$name>::new($($e),*)) $(.component($comp))* $crate::widget::WidgetLoad::new(<$name>::new($($e),*)) $(.component($comp))*
+5 -2
View File
@@ -2,11 +2,14 @@ use osui::prelude::*;
fn main() -> std::io::Result<()> { fn main() -> std::io::Result<()> {
let screen = Screen::new(); let screen = Screen::new();
screen.extension(VelocityExtension);
let count = use_state(0); let count = use_state(0);
rsx! { rsx! {
%count // Dependency of count @Velocity(20, 0);
"Count: {count}" @Transform::new();
static "Count: {count}"
} }
.draw(&screen); .draw(&screen);