From 21cd343eaa194c27bdd083003e4986182ad5ce5c Mon Sep 17 00:00:00 2001 From: Leo dev Date: Mon, 2 Dec 2024 22:59:25 +0100 Subject: [PATCH] added variables --- src/examples.rs | 11 +++++++++-- src/lib.rs | 9 +++++++++ src/rsx.rs | 11 +++++++++++ src/ui/mod.rs | 2 +- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/examples.rs b/src/examples.rs index 2aeb6d6..83881c0 100644 --- a/src/examples.rs +++ b/src/examples.rs @@ -4,11 +4,18 @@ pub fn examples() -> Element { rsx! { styling: Some(styling()), - button { class: "btn", on_click: fn(_, _, document) { - document.exit(); + button { class: "btn", on_click: fn(btn: &mut Button, _, document) { + let count = document.use_state::("count"); + *count += 1; + btn.children.set_text(&count.to_string()); + if *count == 10 { + document.exit(); + } }, "Click me!" } text { "Welcome!" } + + @count: i32; } } diff --git a/src/lib.rs b/src/lib.rs index 8be9d2d..412c161 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -154,6 +154,10 @@ impl Document { pub fn draw(&mut self, element: &mut Element) { self.element = element; } + + pub fn use_state(&self, name: &str) -> &mut T { + &mut self.get_element_by_id::>(name).unwrap().data + } } impl Default for Children { @@ -238,6 +242,11 @@ impl RenderWriter { pub fn result(&self) -> RenderResult { RenderResult(self.w.clone(), self.style.get(self.focused).clone()) } + + pub fn hidden(&mut self) -> RenderResult { + self.style.0.visible = false; + RenderResult(self.w.clone(), self.style.get(self.focused).clone()) + } } impl Default for Handler { diff --git a/src/rsx.rs b/src/rsx.rs index 5513962..3e2d64f 100644 --- a/src/rsx.rs +++ b/src/rsx.rs @@ -12,6 +12,17 @@ macro_rules! check_expr { } #[macro_export] macro_rules! parse_rsx_param { + // Data fields + ($elem:expr, @$name:ident: $type:ty; $($rest:tt)*) => { + if $elem.children.is_none() {$elem.children = $crate::Children::Children(Vec::new(), 0)} + if let $crate::Children::Children(children, _) = &mut $elem.children { + let mut $name = $crate::ui::data_holder::<$type>(); + $name.id = stringify!($name); + children.push($name); + } + osui::parse_rsx_param!($elem, $($rest)*) + }; + ($elem:expr, for ($($for:tt)*) $code:block $($rest:tt)*) => { if $elem.children.is_none() {$elem.children = $crate::Children::Children(Vec::new(), 0)} if let $crate::Children::Children(children, _) = &mut $elem.children { diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 3691590..4ad32c6 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -114,6 +114,6 @@ pub fn data_holder<'a, T: std::default::Default>() -> Box> { impl<'a, T: std::fmt::Debug + Send + Sync> ElementWidget for DataHolder<'a, T> { fn render(&self, focused: bool, _: usize, _: usize) -> RenderResult { - RenderWriter::new(focused, self.style.clone()).result() + RenderWriter::new(focused, self.style.clone()).hidden() } }