Improved frontend
This commit is contained in:
+13
-2
@@ -5,14 +5,25 @@ use crate::{state::DependencyHandler, widget::WidgetLoad, Screen};
|
||||
pub struct Rsx(
|
||||
pub Vec<(
|
||||
Box<dyn FnMut() -> WidgetLoad + Send + Sync>,
|
||||
Vec<std::sync::Arc<dyn DependencyHandler>>,
|
||||
Vec<Box<dyn DependencyHandler>>,
|
||||
)>,
|
||||
);
|
||||
|
||||
impl Rsx {
|
||||
pub fn draw(self, screen: &Arc<Screen>) {
|
||||
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
@@ -126,7 +126,7 @@ macro_rules! event_handler {
|
||||
#[macro_export]
|
||||
macro_rules! rsx {
|
||||
($($inner:tt)*) => {{
|
||||
let mut r = Rsx(Vec::new());
|
||||
let mut r = $crate::frontend::Rsx(Vec::new());
|
||||
|
||||
$crate::rsx_inner! { r, $($inner)* };
|
||||
|
||||
@@ -137,7 +137,7 @@ macro_rules! rsx {
|
||||
#[macro_export]
|
||||
macro_rules! rsx_inner {
|
||||
($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)* };
|
||||
};
|
||||
($r:expr,) => {};
|
||||
|
||||
+17
-7
@@ -1,4 +1,4 @@
|
||||
use osui::{state::use_state, widget::WidgetLoad, Screen};
|
||||
use osui::{rsx, state::use_state, Screen};
|
||||
|
||||
fn main() -> std::io::Result<()> {
|
||||
let screen = Screen::new();
|
||||
@@ -13,12 +13,22 @@ fn main() -> std::io::Result<()> {
|
||||
}
|
||||
});
|
||||
|
||||
screen
|
||||
.draw({
|
||||
let count = count.clone();
|
||||
move || WidgetLoad::new(format!("Hello, World {count}"))
|
||||
})
|
||||
.dependency(count);
|
||||
// let mut r = Rsx(Vec::new());
|
||||
// r.create_element(
|
||||
// {
|
||||
// let count = count.clone();
|
||||
// move || WidgetLoad::new(format!("{count}"))
|
||||
// },
|
||||
// vec![Box::new(count)],
|
||||
// );
|
||||
|
||||
// r.draw(&screen);
|
||||
|
||||
rsx! {
|
||||
%count
|
||||
"{count}"
|
||||
}
|
||||
.draw(&screen);
|
||||
|
||||
screen.run()
|
||||
}
|
||||
|
||||
@@ -61,6 +61,12 @@ impl Widget {
|
||||
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> {
|
||||
self.1
|
||||
.lock()
|
||||
|
||||
Reference in New Issue
Block a user