small change

This commit is contained in:
2024-11-21 19:44:52 +01:00
parent 24eb831c57
commit 1f4ac1b14f
3 changed files with 132 additions and 47 deletions
+99 -43
View File
@@ -1,41 +1,37 @@
#[macro_export] #[macro_export]
macro_rules! __css { 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)); $_style.other.insert(stringify!($name).to_string(), Box::new($value));
$crate::__css!($($other)*); $crate::__css!($_style, $($($other)*)?);
}};
(
$style:expr, $name:ident: $value:expr
) => {{
$style.$name = $value;
}}; }};
} }
#[macro_export] #[macro_export]
macro_rules! _css { macro_rules! _css {
($style:expr,) => {}; ($_style:expr,) => {};
( (
$hm:expr, .$name:ident { $($inner:tt)* } $($rest:tt)* $hm:expr, .$name:ident { $($inner:tt)* } $($rest:tt)*
) => {{ ) => {{
let name = $crate::ui::StyleName::Class(stringify!($name).to_string()); 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) {
$crate::__css!(style.0, $($inner)*); $crate::__css!(_style.0, $($inner)*);
} else { } 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( $hm.insert(
name, name,
style, _style,
); );
} }
$crate::_css!($hm, $($rest)*); $crate::_css!($hm, $($rest)*);
@@ -44,20 +40,20 @@ macro_rules! _css {
$hm:expr, .$name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)* $hm:expr, .$name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)*
) => {{ ) => {{
let name = $crate::ui::StyleName::Class(stringify!($name).to_string()); 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(); let mut style_elem = $crate::ui::StyleElement::default();
$crate::__css!(style_elem, $($inner)*); $crate::__css!(style_elem, $($inner)*);
style.1.insert(stringify!($kind).to_string(), style_elem); _style.1.insert(stringify!($kind).to_string(), style_elem);
} else { } else {
let mut style = $crate::ui::Style::default(); let mut _style = $crate::ui::Style::default();
let mut style_elem = $crate::ui::StyleElement::default(); let mut style_elem = $crate::ui::StyleElement::default();
$crate::__css!(style_elem, $($inner)*); $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( $hm.insert(
name, name,
style, _style,
); );
} }
$crate::_css!($hm, $($rest)*); $crate::_css!($hm, $($rest)*);
@@ -68,16 +64,16 @@ macro_rules! _css {
$hm:expr, #$name:ident { $($inner:tt)* } $($rest:tt)* $hm:expr, #$name:ident { $($inner:tt)* } $($rest:tt)*
) => {{ ) => {{
let name = $crate::ui::StyleName::Id(stringify!($name).to_string()); 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) {
$crate::__css!(style.0, $($inner)*); $crate::__css!(_style.0, $($inner)*);
} else { } 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( $hm.insert(
name, name,
style, _style,
); );
} }
$crate::_css!($hm, $($rest)*); $crate::_css!($hm, $($rest)*);
@@ -86,20 +82,20 @@ macro_rules! _css {
$hm:expr, #$name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)* $hm:expr, #$name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)*
) => {{ ) => {{
let name = $crate::ui::StyleName::Id(stringify!($name).to_string()); 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(); let mut style_elem = $crate::ui::StyleElement::default();
$crate::__css!(style_elem, $($inner)*); $crate::__css!(style_elem, $($inner)*);
style.1.insert(stringify!($kind).to_string(), style_elem); _style.1.insert(stringify!($kind).to_string(), style_elem);
} else { } else {
let mut style = $crate::ui::Style::default(); let mut _style = $crate::ui::Style::default();
let mut style_elem = $crate::ui::StyleElement::default(); let mut style_elem = $crate::ui::StyleElement::default();
$crate::__css!(style_elem, $($inner)*); $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( $hm.insert(
name, name,
style, _style,
); );
} }
$crate::_css!($hm, $($rest)*); $crate::_css!($hm, $($rest)*);
@@ -110,16 +106,16 @@ macro_rules! _css {
$hm:expr, $name:ident { $($inner:tt)* } $($rest:tt)* $hm:expr, $name:ident { $($inner:tt)* } $($rest:tt)*
) => {{ ) => {{
let name = $crate::ui::StyleName::Component(stringify!($name).to_string()); 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) {
$crate::__css!(style.0, $($inner)*); $crate::__css!(_style.0, $($inner)*);
} else { } 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( $hm.insert(
name, name,
style, _style,
); );
} }
$crate::_css!($hm, $($rest)*); $crate::_css!($hm, $($rest)*);
@@ -128,20 +124,20 @@ macro_rules! _css {
$hm:expr, $name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)* $hm:expr, $name:ident:$kind:ident { $($inner:tt)* } $($rest:tt)*
) => {{ ) => {{
let name = $crate::ui::StyleName::Component(stringify!($name).to_string()); 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(); let mut style_elem = $crate::ui::StyleElement::default();
$crate::__css!(style_elem, $($inner)*); $crate::__css!(style_elem, $($inner)*);
style.1.insert(stringify!($kind).to_string(), style_elem); _style.1.insert(stringify!($kind).to_string(), style_elem);
} else { } else {
let mut style = $crate::ui::Style::default(); let mut _style = $crate::ui::Style::default();
let mut style_elem = $crate::ui::StyleElement::default(); let mut style_elem = $crate::ui::StyleElement::default();
$crate::__css!(style_elem, $($inner)*); $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( $hm.insert(
name, name,
style, _style,
); );
} }
$crate::_css!($hm, $($rest)*); $crate::_css!($hm, $($rest)*);
@@ -156,7 +152,7 @@ macro_rules! _css {
/// color: Blue /// color: Blue
/// } /// }
/// ``` /// ```
/// ///
/// # Returns /// # Returns
/// `Css` /// `Css`
#[macro_export] #[macro_export]
@@ -169,3 +165,63 @@ macro_rules! css {
hm 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()
}};
}
+27 -3
View File
@@ -29,11 +29,11 @@ use std::{
use crossterm::event::Event; use crossterm::event::Event;
pub mod app; pub mod app;
pub mod css;
pub mod macros; pub mod macros;
pub mod rsx;
pub mod ui; pub mod ui;
pub mod utils; pub mod utils;
pub mod rsx;
pub mod css;
pub use app::run; pub use app::run;
@@ -43,7 +43,7 @@ pub use app::run;
pub mod prelude { pub mod prelude {
pub use crate::ui::Color::*; pub use crate::ui::Color::*;
pub use crate::{self as osui, css, rsx, rsx_elem, ui::*, Handler}; 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 // useful for Element making
pub use crate::{run_handler, Children, ElementCore, ElementWidget}; pub use crate::{run_handler, Children, ElementCore, ElementWidget};
pub use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind}; pub use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind};
@@ -139,6 +139,24 @@ impl<T> std::fmt::Debug for Handler<T> {
/// Children Enum /// 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)] #[derive(Debug)]
pub enum Children { pub enum Children {
None, None,
@@ -165,4 +183,10 @@ impl Children {
_ => String::new(), _ => String::new(),
} }
} }
pub fn get_text_mut(&mut self) -> Option<&mut String> {
match self {
Children::Text(text) => Some(text),
_ => None,
}
}
} }
+6 -1
View File
@@ -1,12 +1,17 @@
// use std::sync::Arc;
use osui::prelude::*; use osui::prelude::*;
pub struct App {}
fn main() { fn main() {
// let something = Arc::new(App {});
while osui::run(&mut app()) {} while osui::run(&mut app()) {}
} }
fn app() -> Element { fn app() -> Element {
rsx! { styling: Some(styles()), rsx! { styling: Some(styles()),
button { class: "btn", id: "test", "This is a button!" } button { class: "btn", "Hello, World!" }
} }
} }