From 69d2943bb36c02d9b92daed0bd5565f2ccaa995e Mon Sep 17 00:00:00 2001 From: Leo dev Date: Thu, 28 Nov 2024 22:06:01 +0100 Subject: [PATCH] as type --- src/main.rs | 19 +++++++++++++++++-- src/rsx.rs | 20 ++++++++++++++++++-- src/ui/mod.rs | 3 +-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6a2f33b..ac3ae3f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,21 @@ -use osui::examples; use osui::prelude::*; fn main() { - launch!(examples::examples()); + launch!(app()); +} + +// A simple counter +fn app() -> Element { + rsx! { + // Create a button with a on_click handler + button { on_click: Handler::new(move |btn: &mut Button, _, document| { + if let Some(count) = document.get_element_by_id::>("count") { + count.data += 1; + btn.children.set_text(&count.data.to_string()); + } + }), "0" } + + // Store the data (in this case count) + data_holder as u32 { id: "count" } + } } diff --git a/src/rsx.rs b/src/rsx.rs index 8015222..3820349 100644 --- a/src/rsx.rs +++ b/src/rsx.rs @@ -55,14 +55,23 @@ macro_rules! parse_rsx_param { osui::parse_rsx_param!($elem, $($rest)*) }; - ($elem:expr, $text:expr) => { + ($elem:expr, $elem_path:path as $t:ty { $($inner:tt)* } $($rest:tt)*) => { + if $elem.children.is_none() {$elem.children = $crate::Children::Children(Vec::new(), 0)} + if let $crate::Children::Children(children, _) = &mut $elem.children { + children.push(osui::ersx!($elem_path as $t { $($inner)* })); + } + osui::parse_rsx_param!($elem, $($rest)*) + }; + + ($elem:expr, $text:expr) => { if $elem.children.is_none() {$elem.children = $crate::Children::Text(format!($text))} }; + ($elem:expr, $text:expr, $($inner:tt)*) => { if $elem.children.is_none() {$elem.children = $crate::Children::Text(format!($text, $($inner)*))} }; - ($elem:expr, ) => {}; + ($elem:expr, ) => {}; } #[macro_export] @@ -73,6 +82,13 @@ macro_rules! ersx { $crate::parse_rsx_param!(elem, $($inner)*); elem as $crate::Element }}; + + ($elem:path as $t:ty { $($inner:tt)* }) => {{ + #[allow(unused_mut)] + let mut elem = paste::paste!{$elem::<$t>}(); + $crate::parse_rsx_param!(elem, $($inner)*); + elem as $crate::Element + }}; } /// Makes a div and puts elements into it diff --git a/src/ui/mod.rs b/src/ui/mod.rs index f4813d2..760e64d 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -93,7 +93,6 @@ impl ElementWidget for Button<'_> { document.render(); sleep(100); self.style.set_state(""); - document.rebuild(); } } _ => {} @@ -107,7 +106,7 @@ pub struct DataHolder<'a, T> { pub data: T, } -pub fn dataholder<'a, T: std::default::Default>() -> Box> { +pub fn data_holder<'a, T: std::default::Default>() -> Box> { Box::new(DataHolder { style: Style::default(), data: T::default(),