diff --git a/src/css.rs b/src/css.rs index 1ed1c97..71da4bf 100644 --- a/src/css.rs +++ b/src/css.rs @@ -1,41 +1,37 @@ #[macro_export] macro_rules! __css { - ($style:expr,)=>{}; + ($_style:expr,)=>{}; ( - $style:expr, ($name:ident): $value:expr + $_style:expr, $name:ident: $value:expr $(, $($other:tt)*)? ) => {{ - $style.other.insert(stringify!($name).to_string(), Box::new($value)); + $_style.$name = $value; + $crate::__css!($_style, $($($other)*)?); }}; ( - $style:expr, ($name:ident): $value:expr, $($other:tt)* + $_style:expr, ($name:ident): $value:expr $(, $($other:tt)*)? ) => {{ - $style.other.insert(stringify!($name).to_string(), Box::new($value)); - $crate::__css!($($other)*); - }}; - ( - $style:expr, $name:ident: $value:expr - ) => {{ - $style.$name = $value; + $_style.other.insert(stringify!($name).to_string(), Box::new($value)); + $crate::__css!($_style, $($($other)*)?); }}; } #[macro_export] macro_rules! _css { - ($style:expr,) => {}; + ($_style:expr,) => {}; ( $hm:expr, .$name:ident { $($inner:tt)* } $($rest:tt)* ) => {{ let name = $crate::ui::StyleName::Class(stringify!($name).to_string()); - if let Some(style) = $hm.get_mut(&name) { - $crate::__css!(style.0, $($inner)*); + if let Some(_style) = $hm.get_mut(&name) { + $crate::__css!(_style.0, $($inner)*); } else { - let mut style = $crate::ui::Style::default(); + let mut _style = $crate::ui::Style::default(); - $crate::__css!(style.0, $($inner)*); + $crate::__css!(_style.0, $($inner)*); $hm.insert( name, - style, + _style, ); } $crate::_css!($hm, $($rest)*); @@ -44,20 +40,20 @@ macro_rules! _css { $hm:expr, .$name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)* ) => {{ let name = $crate::ui::StyleName::Class(stringify!($name).to_string()); - if let Some(style) = $hm.get_mut(&name) { + if let Some(_style) = $hm.get_mut(&name) { let mut style_elem = $crate::ui::StyleElement::default(); $crate::__css!(style_elem, $($inner)*); - style.1.insert(stringify!($kind).to_string(), style_elem); + _style.1.insert(stringify!($kind).to_string(), style_elem); } else { - let mut style = $crate::ui::Style::default(); + let mut _style = $crate::ui::Style::default(); let mut style_elem = $crate::ui::StyleElement::default(); $crate::__css!(style_elem, $($inner)*); - style.1.insert(stringify!($kind).to_string(), style_elem); + _style.1.insert(stringify!($kind).to_string(), style_elem); $hm.insert( name, - style, + _style, ); } $crate::_css!($hm, $($rest)*); @@ -68,16 +64,16 @@ macro_rules! _css { $hm:expr, #$name:ident { $($inner:tt)* } $($rest:tt)* ) => {{ let name = $crate::ui::StyleName::Id(stringify!($name).to_string()); - if let Some(style) = $hm.get_mut(&name) { - $crate::__css!(style.0, $($inner)*); + if let Some(_style) = $hm.get_mut(&name) { + $crate::__css!(_style.0, $($inner)*); } else { - let mut style = $crate::ui::Style::default(); + let mut _style = $crate::ui::Style::default(); - $crate::__css!(style.0, $($inner)*); + $crate::__css!(_style.0, $($inner)*); $hm.insert( name, - style, + _style, ); } $crate::_css!($hm, $($rest)*); @@ -86,20 +82,20 @@ macro_rules! _css { $hm:expr, #$name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)* ) => {{ let name = $crate::ui::StyleName::Id(stringify!($name).to_string()); - if let Some(style) = $hm.get_mut(&name) { + if let Some(_style) = $hm.get_mut(&name) { let mut style_elem = $crate::ui::StyleElement::default(); $crate::__css!(style_elem, $($inner)*); - style.1.insert(stringify!($kind).to_string(), style_elem); + _style.1.insert(stringify!($kind).to_string(), style_elem); } else { - let mut style = $crate::ui::Style::default(); + let mut _style = $crate::ui::Style::default(); let mut style_elem = $crate::ui::StyleElement::default(); $crate::__css!(style_elem, $($inner)*); - style.1.insert(stringify!($kind).to_string(), style_elem); + _style.1.insert(stringify!($kind).to_string(), style_elem); $hm.insert( name, - style, + _style, ); } $crate::_css!($hm, $($rest)*); @@ -110,16 +106,16 @@ macro_rules! _css { $hm:expr, $name:ident { $($inner:tt)* } $($rest:tt)* ) => {{ let name = $crate::ui::StyleName::Component(stringify!($name).to_string()); - if let Some(style) = $hm.get_mut(&name) { - $crate::__css!(style.0, $($inner)*); + if let Some(_style) = $hm.get_mut(&name) { + $crate::__css!(_style.0, $($inner)*); } else { - let mut style = $crate::ui::Style::default(); + let mut _style = $crate::ui::Style::default(); - $crate::__css!(style.0, $($inner)*); + $crate::__css!(_style.0, $($inner)*); $hm.insert( name, - style, + _style, ); } $crate::_css!($hm, $($rest)*); @@ -128,20 +124,20 @@ macro_rules! _css { $hm:expr, $name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)* ) => {{ let name = $crate::ui::StyleName::Component(stringify!($name).to_string()); - if let Some(style) = $hm.get_mut(&name) { + if let Some(_style) = $hm.get_mut(&name) { let mut style_elem = $crate::ui::StyleElement::default(); $crate::__css!(style_elem, $($inner)*); - style.1.insert(stringify!($kind).to_string(), style_elem); + _style.1.insert(stringify!($kind).to_string(), style_elem); } else { - let mut style = $crate::ui::Style::default(); + let mut _style = $crate::ui::Style::default(); let mut style_elem = $crate::ui::StyleElement::default(); $crate::__css!(style_elem, $($inner)*); - style.1.insert(stringify!($kind).to_string(), style_elem); + _style.1.insert(stringify!($kind).to_string(), style_elem); $hm.insert( name, - style, + _style, ); } $crate::_css!($hm, $($rest)*); @@ -156,7 +152,7 @@ macro_rules! _css { /// color: Blue /// } /// ``` -/// +/// /// # Returns /// `Css` #[macro_export] @@ -169,3 +165,63 @@ macro_rules! css { hm }}; } + +#[macro_export] +macro_rules! style { + ( + $key:ident: $value:expr $(, $($rest:tt)*)? + ) => {{ + let mut _style = $crate::ui::Style::default(); + $crate::__css!(_style.0, $key: $value); + $crate::style!{ _style; $($($rest)*)? } + }}; + ( + $style:expr; $key:ident: $value:expr $(, $($rest:tt)*)? + ) => {{ + let mut style_elem = $crate::ui::StyleElement::default(); + $crate::__css!($style.0, $key: $value); + $crate::style!{ $style; $($($rest)*)? } + }}; + ( + ($key:ident): $value:expr $(, $($rest:tt)*)? + ) => {{ + let mut _style = $crate::ui::Style::default(); + $crate::__css!(_style.0, ($key): $value); + $crate::style!{ _style; $($($rest)*)? } + }}; + ( + $style:expr; ($key:ident): $value:expr $(, $($rest:tt)*)? + ) => {{ + let mut style_elem = $crate::ui::StyleElement::default(); + $crate::__css!($style.0, ($key): $value); + $crate::style!{ $style; $($($rest)*)? } + }}; + + ( + $kind:ident {$($inner:tt)*} $(, $($rest:tt)*)? + ) => {{ + let mut _style = $crate::ui::Style::default(); + let mut style_elem = $crate::ui::StyleElement::default(); + $crate::__css!(style_elem, $($inner)*); + _style.1.insert(stringify!($kind).to_string(), style_elem); + $crate::style!{ _style; $($($rest)*)? } + }}; + ( + $style:expr; $kind:ident {$($inner:tt)*} $(, $($rest:tt)*)? + ) => {{ + let mut style_elem = $crate::ui::StyleElement::default(); + $crate::__css!(style_elem, $($inner)*); + $style.1.insert(stringify!($kind).to_string(), style_elem); + $crate::style!{ $style; $($($rest)*)? } + }}; + + ( + $style:expr; + ) => {{ + $style + }}; + + () => {{ + $crate::ui::Style::default() + }}; +} diff --git a/src/lib.rs b/src/lib.rs index 040d1da..189db7f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,11 +29,11 @@ use std::{ use crossterm::event::Event; pub mod app; +pub mod css; pub mod macros; +pub mod rsx; pub mod ui; pub mod utils; -pub mod rsx; -pub mod css; pub use app::run; @@ -43,7 +43,7 @@ pub use app::run; pub mod prelude { pub use crate::ui::Color::*; pub use crate::{self as osui, css, rsx, rsx_elem, ui::*, Handler}; - pub use crate::{Element, Value}; + pub use crate::{Element, Value, style}; // useful for Element making pub use crate::{run_handler, Children, ElementCore, ElementWidget}; pub use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind}; @@ -139,6 +139,24 @@ impl std::fmt::Debug for Handler { /// Children Enum ////////////////////////////////////////////////////////////////////////////////////////////////// +/// Child enum of an `Element` +/// +/// # Example +/// ``` +/// // Check if it's text +/// if let Children::Text(text) { +/// // do something +/// } +/// // Check if it's inner elements +/// if let Children::Children(text) { +/// // do something +/// } +/// ``` +/// +/// # Useful for +/// - `Element::event` +/// - `Element::render` +/// - `Handler` #[derive(Debug)] pub enum Children { None, @@ -165,4 +183,10 @@ impl Children { _ => String::new(), } } + pub fn get_text_mut(&mut self) -> Option<&mut String> { + match self { + Children::Text(text) => Some(text), + _ => None, + } + } } diff --git a/src/main.rs b/src/main.rs index 6b078c6..2962035 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,17 @@ +// use std::sync::Arc; + use osui::prelude::*; +pub struct App {} + fn main() { + // let something = Arc::new(App {}); while osui::run(&mut app()) {} } fn app() -> Element { rsx! { styling: Some(styles()), - button { class: "btn", id: "test", "This is a button!" } + button { class: "btn", "Hello, World!" } } }