Improved frontend

This commit is contained in:
2025-07-28 15:22:17 +02:00
parent 211b5aa95c
commit 5c2c5ba46b
4 changed files with 38 additions and 11 deletions
+13 -2
View File
@@ -5,14 +5,25 @@ use crate::{state::DependencyHandler, widget::WidgetLoad, Screen};
pub struct Rsx( pub struct Rsx(
pub Vec<( pub Vec<(
Box<dyn FnMut() -> WidgetLoad + Send + Sync>, Box<dyn FnMut() -> WidgetLoad + Send + Sync>,
Vec<std::sync::Arc<dyn DependencyHandler>>, Vec<Box<dyn DependencyHandler>>,
)>, )>,
); );
impl Rsx { impl Rsx {
pub fn draw(self, screen: &Arc<Screen>) { pub fn draw(self, screen: &Arc<Screen>) {
for i in self.0 { for i in self.0 {
screen.draw_box(i.0); let w = screen.draw_box(i.0);
for d in i.1 {
w.dependency_box(d);
} }
} }
}
pub fn create_element<F: FnMut() -> WidgetLoad + Send + Sync + 'static>(
&mut self,
load: F,
dependencies: Vec<Box<dyn DependencyHandler>>,
) {
self.0.push((Box::new(load), dependencies));
}
} }
+2 -2
View File
@@ -126,7 +126,7 @@ macro_rules! event_handler {
#[macro_export] #[macro_export]
macro_rules! rsx { macro_rules! rsx {
($($inner:tt)*) => {{ ($($inner:tt)*) => {{
let mut r = Rsx(Vec::new()); let mut r = $crate::frontend::Rsx(Vec::new());
$crate::rsx_inner! { r, $($inner)* }; $crate::rsx_inner! { r, $($inner)* };
@@ -137,7 +137,7 @@ macro_rules! rsx {
#[macro_export] #[macro_export]
macro_rules! rsx_inner { macro_rules! rsx_inner {
($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $s:literal $($rest:tt)*) => { ($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $s:literal $($rest:tt)*) => {
$r.0.push((Box::new({ $(let $dep = $dep.clone();)* move || Box::new(format!($s)) }), vec![$(Arc::new($dep.clone()),)*])); $r.create_element({ $(let $dep = $dep.clone();)* move || $crate::widget::WidgetLoad::new(format!($s)) }, vec![$(Box::new($dep.clone()))*]);
$crate::rsx_inner!{ $r, $($rest)* }; $crate::rsx_inner!{ $r, $($rest)* };
}; };
($r:expr,) => {}; ($r:expr,) => {};
+17 -7
View File
@@ -1,4 +1,4 @@
use osui::{state::use_state, widget::WidgetLoad, Screen}; use osui::{rsx, state::use_state, Screen};
fn main() -> std::io::Result<()> { fn main() -> std::io::Result<()> {
let screen = Screen::new(); let screen = Screen::new();
@@ -13,12 +13,22 @@ fn main() -> std::io::Result<()> {
} }
}); });
screen // let mut r = Rsx(Vec::new());
.draw({ // r.create_element(
let count = count.clone(); // {
move || WidgetLoad::new(format!("Hello, World {count}")) // let count = count.clone();
}) // move || WidgetLoad::new(format!("{count}"))
.dependency(count); // },
// vec![Box::new(count)],
// );
// r.draw(&screen);
rsx! {
%count
"{count}"
}
.draw(&screen);
screen.run() screen.run()
} }
+6
View File
@@ -61,6 +61,12 @@ impl Widget {
self self
} }
pub fn dependency_box(self: &Arc<Self>, d: Box<dyn DependencyHandler>) -> &Arc<Self> {
d.add();
self.3.lock().unwrap().push(d);
self
}
pub fn component<C: Component + 'static>(self: &Arc<Self>, c: C) -> &Arc<Self> { pub fn component<C: Component + 'static>(self: &Arc<Self>, c: C) -> &Arc<Self> {
self.1 self.1
.lock() .lock()