Improved frontend
This commit is contained in:
+13
-2
@@ -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
@@ -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
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user