diff --git a/src/examples.rs b/src/examples.rs new file mode 100644 index 0000000..c8225e4 --- /dev/null +++ b/src/examples.rs @@ -0,0 +1,9 @@ +use crate::prelude::*; + +pub fn event_logger() -> Element { + rsx_elem! { + text { on_event: Handler::new(|txt: &mut Text, e, _| { + txt.children.set_text(&format!("current event: {e:?}")); + }), "current event: None" } + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 8f0f97e..abc6784 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,6 +30,7 @@ use crossterm::event::Event; pub mod app; pub mod css; +pub mod examples; pub mod macros; pub mod rsx; pub mod ui; @@ -45,7 +46,7 @@ pub mod prelude { pub use crate::{self as osui, css, rsx, rsx_elem, ui::*, Handler}; pub use crate::{style, Command, Document, Element, Value}; // useful for Element making - pub use crate::{run_handler, Children, ElementCore, ElementWidget}; + pub use crate::{call, Children, ElementCore, ElementWidget}; pub use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind}; pub fn sleep(ms: u64) { std::thread::sleep(std::time::Duration::from_millis(ms)); diff --git a/src/macros.rs b/src/macros.rs index 02ecc4c..71694dd 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -6,7 +6,7 @@ macro_rules! val { } #[macro_export] -macro_rules! run_handler { +macro_rules! call { ($self:ident.$handler:ident ($($inner:tt)*)) => {{ let a = std::sync::Arc::clone(&$self.$handler.0); let mut o = a.lock().unwrap(); @@ -15,4 +15,4 @@ macro_rules! run_handler { ($self:ident.$handler:ident) => {{ &$self.$handler; }}; -} \ No newline at end of file +} diff --git a/src/main.rs b/src/main.rs index eddde5d..c1682a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,29 +1,6 @@ use osui::prelude::*; - -pub struct App {} +use osui::examples; fn main() { - while osui::run(&mut app()) {} -} - -fn app() -> Element { - rsx! { styling: Some(styles()), - button { class: "btn", on_click: Handler::new(|_, _, document| { - if let Some(txt) = document.get_element_by_id::("txt") { - txt.children.set_text("edited"); - } - }), "Hello, World!" } - text { id: "txt", y: 2, "Some text!" } - } -} - -fn styles() -> Css { - css! { - .btn: clicked { - color: Blue - } - .btn: hover { - color: Red - } - } + while osui::run(&mut examples::event_logger()) {} } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index de5b9a2..7006d83 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -26,7 +26,9 @@ use osui_element::{elem_fn, element}; #[element] #[elem_fn] #[derive(Default, Debug)] -pub struct Text {} +pub struct Text { + pub on_event: Handler>, +} impl ElementWidget for Text<'_> { fn render(&self, _: bool) -> String { @@ -36,6 +38,9 @@ impl ElementWidget for Text<'_> { String::new() } } + fn event(&mut self, event: Event, document: &Document) { + call!(self.on_event(event, document)); + } } /// The `Div` element represents a container for other UI elements. It can hold child components @@ -161,7 +166,7 @@ impl ElementWidget for Button<'_> { if key.code == KeyCode::Enter { document.render(); self.state = "clicked"; - run_handler!(self.on_click(event, document)); + call!(self.on_click(event, document)); document.render(); sleep(100); self.state = "";