#[macro_export]
macro_rules! tui {
($($tt:tt)*) => {{
$crate::tui_parse_element!($($tt)*)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_parse_element {
(div($($props:tt)*) [$($children:tt)*]) => {{
$crate::tui_build_div!(
props: [$($props)*],
children: [$($children)*]
)
}};
(div [$($children:tt)*]) => {{
$crate::tui_build_div!(
props: [],
children: [$($children)*]
)
}};
(text($content:expr, $($props:tt)*)) => {{
$crate::tui_build_text!($content, $($props)*)
}};
(text($content:expr)) => {{
$crate::Text::new($content).into()
}};
(richtext($($props:tt)*) [$($spans:tt)*]) => {{
$crate::tui_build_richtext!(
props: [$($props)*],
spans: [$($spans)*]
)
}};
(richtext [$($spans:tt)*]) => {{
$crate::tui_build_richtext!(
props: [],
spans: [$($spans)*]
)
}};
(spacer($size:expr)) => {{
$crate::Div::<$crate::Node>::new().height($size).into()
}};
(node($comp:expr)) => {{
$crate::Node::Component(Box::new($comp))
}};
(input($($props:tt)*)) => {{
$crate::tui_build_input!($($props)*)
}};
(input) => {{
$crate::Node::Component(Box::new($crate::TextInput::new()))
}};
(vstack($($props:tt)*) [$($children:tt)*]) => {{
$crate::tui_build_div!(
props: [dir: vertical, $($props)*],
children: [$($children)*]
)
}};
(vstack [$($children:tt)*]) => {{
$crate::tui_build_div!(
props: [dir: vertical],
children: [$($children)*]
)
}};
(hstack($($props:tt)*) [$($children:tt)*]) => {{
$crate::tui_build_div!(
props: [dir: horizontal, $($props)*],
children: [$($children)*]
)
}};
(hstack [$($children:tt)*]) => {{
$crate::tui_build_div!(
props: [dir: horizontal],
children: [$($children)*]
)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_build_div {
(props: [$($props:tt)+], children: [$($children:tt)*]) => {{
#[allow(unused_mut)]
let mut __div = $crate::Div::<$crate::Node>::new();
__div = $crate::tui_apply_props!(__div, $($props)+);
let mut __children_vec = Vec::new();
$crate::tui_parse_children!(__children_vec, __div, $($children)*)
}};
(props: [], children: [$($children:tt)*]) => {{
#[allow(unused_mut)]
let mut __div = $crate::Div::<$crate::Node>::new();
let mut __children_vec = Vec::new();
$crate::tui_parse_children!(__children_vec, __div, $($children)*)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_parse_children {
($children:ident, $container:expr) => {{
if !$children.is_empty() {
$container.children($children).into()
} else {
$container.into()
}
}};
($children:ident, $container:expr,) => {{
if !$children.is_empty() {
$container.children($children).into()
} else {
$container.into()
}
}};
($children:ident, $container:expr, @click: $handler:expr, $($rest:tt)*) => {{
let container = $container.on_click($handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @click: $handler:expr) => {{
let container = $container.on_click($handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, @char($ch:literal): $handler:expr, $($rest:tt)*) => {{
let container = $container.on_char($ch, $handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @char($ch:literal): $handler:expr) => {{
let container = $container.on_char($ch, $handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, @char_global($ch:literal): $handler:expr, $($rest:tt)*) => {{
let container = $container.on_char_global($ch, $handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @char_global($ch:literal): $handler:expr) => {{
let container = $container.on_char_global($ch, $handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, @key(Char($ch:literal)): $handler:expr, $($rest:tt)*) => {{
let container = $container.on_key($crate::Key::Char($ch), $handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @key(Char($ch:literal)): $handler:expr) => {{
let container = $container.on_key($crate::Key::Char($ch), $handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, @key($key:ident): $handler:expr, $($rest:tt)*) => {{
let container = $container.on_key($crate::Key::$key, $handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @key($key:ident): $handler:expr) => {{
let container = $container.on_key($crate::Key::$key, $handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, @key_global($key:ident): $handler:expr, $($rest:tt)*) => {{
let container = $container.on_key_global($crate::Key::$key, $handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @key_global($key:ident): $handler:expr) => {{
let container = $container.on_key_global($crate::Key::$key, $handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, @focus: $handler:expr, $($rest:tt)*) => {{
let container = $container.on_focus($handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @focus: $handler:expr) => {{
let container = $container.on_focus($handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, @blur: $handler:expr, $($rest:tt)*) => {{
let container = $container.on_blur($handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @blur: $handler:expr) => {{
let container = $container.on_blur($handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, @any_char: $handler:expr, $($rest:tt)*) => {{
let container = $container.on_any_char($handler);
$crate::tui_parse_children!($children, container, $($rest)*)
}};
($children:ident, $container:expr, @any_char: $handler:expr) => {{
let container = $container.on_any_char($handler);
$crate::tui_parse_children!($children, container)
}};
($children:ident, $container:expr, div($($props:tt)*) [$($inner:tt)*], $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(div($($props)*) [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, div($($props:tt)*) [$($inner:tt)*]) => {{
let child = $crate::tui_parse_element!(div($($props)*) [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, div [$($inner:tt)*], $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(div [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, div [$($inner:tt)*]) => {{
let child = $crate::tui_parse_element!(div [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, text($content:expr, $($props:tt)*), $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(text($content, $($props)*));
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, text($content:expr, $($props:tt)*)) => {{
let child = $crate::tui_parse_element!(text($content, $($props)*));
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, text($content:expr), $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(text($content));
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, text($content:expr)) => {{
let child = $crate::tui_parse_element!(text($content));
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, spacer($size:expr), $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(spacer($size));
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, spacer($size:expr)) => {{
let child = $crate::tui_parse_element!(spacer($size));
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, node($comp:expr), $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(node($comp));
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, node($comp:expr)) => {{
let child = $crate::tui_parse_element!(node($comp));
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, input($($props:tt)*), $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(input($($props)*));
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, input($($props:tt)*)) => {{
let child = $crate::tui_parse_element!(input($($props)*));
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, input, $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(input);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, input) => {{
let child = $crate::tui_parse_element!(input);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, vstack($($props:tt)*) [$($inner:tt)*], $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(vstack($($props)*) [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, vstack($($props:tt)*) [$($inner:tt)*]) => {{
let child = $crate::tui_parse_element!(vstack($($props)*) [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, vstack [$($inner:tt)*], $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(vstack [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, vstack [$($inner:tt)*]) => {{
let child = $crate::tui_parse_element!(vstack [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, hstack($($props:tt)*) [$($inner:tt)*], $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(hstack($($props)*) [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, hstack($($props:tt)*) [$($inner:tt)*]) => {{
let child = $crate::tui_parse_element!(hstack($($props)*) [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, hstack [$($inner:tt)*], $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(hstack [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, hstack [$($inner:tt)*]) => {{
let child = $crate::tui_parse_element!(hstack [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, richtext($($props:tt)*) [$($inner:tt)*], $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(richtext($($props)*) [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, richtext($($props:tt)*) [$($inner:tt)*]) => {{
let child = $crate::tui_parse_element!(richtext($($props)*) [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
($children:ident, $container:expr, richtext [$($inner:tt)*], $($rest:tt)*) => {{
let child = $crate::tui_parse_element!(richtext [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container, $($rest)*)
}};
($children:ident, $container:expr, richtext [$($inner:tt)*]) => {{
let child = $crate::tui_parse_element!(richtext [$($inner)*]);
$children.push(child);
$crate::tui_parse_children!($children, $container)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_apply_props {
($container:expr,) => { $container };
($container:expr) => { $container };
($container:expr, bg: $color:tt, $($rest:tt)*) => {{
let c = $container.background($crate::color_value!($color));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, bg: $color:tt) => {{
$container.background($crate::color_value!($color))
}};
($container:expr, bg: ($color:expr), $($rest:tt)*) => {{
let c = $container.background($color);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, bg: ($color:expr)!, $($rest:tt)*) => {{
let c = if let Some(color_val) = $color {
$container.background(color_val)
} else {
$container
};
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, bg: ($color:expr)!) => {{
if let Some(color_val) = $color {
$container.background(color_val)
} else {
$container
}
}};
($container:expr, dir: $dir:tt, $($rest:tt)*) => {{
let c = $container.direction($crate::direction_value!($dir));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, dir: $dir:tt) => {{
$container.direction($crate::direction_value!($dir))
}};
($container:expr, pad: $pad:expr, $($rest:tt)*) => {{
let c = $container.padding($crate::Spacing::all($pad));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, pad: $pad:expr) => {{
$container.padding($crate::Spacing::all($pad))
}};
($container:expr, pad: ($pad:expr)!, $($rest:tt)*) => {{
let c = if let Some(pad_val) = $pad {
$container.padding($crate::Spacing::all(pad_val))
} else {
$container
};
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, pad: ($pad:expr)!) => {{
if let Some(pad_val) = $pad {
$container.padding($crate::Spacing::all(pad_val))
} else {
$container
}
}};
($container:expr, pad_h: $pad:expr, $($rest:tt)*) => {{
let c = $container.padding($crate::Spacing::horizontal($pad));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, pad_h: $pad:expr) => {{
$container.padding($crate::Spacing::horizontal($pad))
}};
($container:expr, pad_v: $pad:expr, $($rest:tt)*) => {{
let c = $container.padding($crate::Spacing::vertical($pad));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, pad_v: $pad:expr) => {{
$container.padding($crate::Spacing::vertical($pad))
}};
($container:expr, padding: ($padding:expr), $($rest:tt)*) => {{
let c = $container.padding($padding);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, padding: ($padding:expr)) => {{
$container.padding($padding)
}};
($container:expr, w: $width:expr, $($rest:tt)*) => {{
let c = $container.width($width);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, w: $width:expr) => {{
$container.width($width)
}};
($container:expr, w: ($width:expr)!, $($rest:tt)*) => {{
let c = if let Some(width_val) = $width {
$container.width(width_val)
} else {
$container
};
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, w: ($width:expr)!) => {{
if let Some(width_val) = $width {
$container.width(width_val)
} else {
$container
}
}};
($container:expr, w_pct: $pct:expr, $($rest:tt)*) => {{
let c = $container.width_percent($pct);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, w_pct: $pct:expr) => {{
$container.width_percent($pct)
}};
($container:expr, w_auto, $($rest:tt)*) => {{
let c = $container.width_auto();
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, w_auto) => {{
$container.width_auto()
}};
($container:expr, w_content, $($rest:tt)*) => {{
let c = $container.width_content();
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, w_content) => {{
$container.width_content()
}};
($container:expr, h: $height:expr, $($rest:tt)*) => {{
let c = $container.height($height);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, h: $height:expr) => {{
$container.height($height)
}};
($container:expr, h: ($height:expr)!, $($rest:tt)*) => {{
let c = if let Some(height_val) = $height {
$container.height(height_val)
} else {
$container
};
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, h: ($height:expr)!) => {{
if let Some(height_val) = $height {
$container.height(height_val)
} else {
$container
}
}};
($container:expr, h_pct: $pct:expr, $($rest:tt)*) => {{
let c = $container.height_percent($pct);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, h_pct: $pct:expr) => {{
$container.height_percent($pct)
}};
($container:expr, h_auto, $($rest:tt)*) => {{
let c = $container.height_auto();
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, h_auto) => {{
$container.height_auto()
}};
($container:expr, h_content, $($rest:tt)*) => {{
let c = $container.height_content();
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, h_content) => {{
$container.height_content()
}};
($container:expr, gap: $gap:expr, $($rest:tt)*) => {{
let c = $container.gap($gap);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, gap: $gap:expr) => {{
$container.gap($gap)
}};
($container:expr, border: $color:tt, $($rest:tt)*) => {{
let c = $container.border_color($crate::color_value!($color));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, border: $color:tt) => {{
$container.border_color($crate::color_value!($color))
}};
($container:expr, border: ($color:expr), $($rest:tt)*) => {{
let c = $container.border_color($color);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, border: ($color:expr)!, $($rest:tt)*) => {{
let c = if let Some(color_val) = $color {
$container.border_color(color_val)
} else {
$container
};
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, border: ($color:expr)!) => {{
if let Some(color_val) = $color {
$container.border_color(color_val)
} else {
$container
}
}};
($container:expr, border_style: ($style:expr, $color:expr), $($rest:tt)*) => {{
let c = $container.border_style_with_color($style, $color);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, border_style: ($style:expr, $color:expr)) => {{
$container.border_style_with_color($style, $color)
}};
($container:expr, border_edges: $edges:expr, $($rest:tt)*) => {{
let c = $container.border_edges($edges);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, border_edges: $edges:expr) => {{
$container.border_edges($edges)
}};
($container:expr, border_full: ($style:expr, $color:expr, $edges:expr), $($rest:tt)*) => {{
let c = $container.border_full($style, $color, $edges);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, border_full: ($style:expr, $color:expr, $edges:expr)) => {{
$container.border_full($style, $color, $edges)
}};
($container:expr, focusable: $val:expr, $($rest:tt)*) => {{
let c = $container.focusable($val);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, focusable: $val:expr) => {{
$container.focusable($val)
}};
($container:expr, focusable, $($rest:tt)*) => {{
let c = $container.focusable(true);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, focusable) => {{
$container.focusable(true)
}};
($container:expr, show_scrollbar: $val:expr, $($rest:tt)*) => {{
let c = $container.show_scrollbar($val);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, show_scrollbar: $val:expr) => {{
$container.show_scrollbar($val)
}};
($container:expr, focus_style: ($style:expr), $($rest:tt)*) => {{
let c = $container.focus_style($style);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, focus_style: ($style:expr)) => {{
$container.focus_style($style)
}};
($container:expr, focus_style: ($style:expr)!, $($rest:tt)*) => {{
let c = if let Some(style_val) = $style {
$container.focus_style(style_val)
} else {
$container
};
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, focus_style: ($style:expr)!) => {{
if let Some(style_val) = $style {
$container.focus_style(style_val)
} else {
$container
}
}};
($container:expr, z: $index:expr, $($rest:tt)*) => {{
let c = $container.z_index($index);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, z: $index:expr) => {{
$container.z_index($index)
}};
($container:expr, pos: $pos:tt, $($rest:tt)*) => {{
let c = $container.position($crate::position_value!($pos));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, pos: $pos:tt) => {{
$container.position($crate::position_value!($pos))
}};
($container:expr, absolute, $($rest:tt)*) => {{
let c = $container.position($crate::Position::Absolute);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, absolute) => {{
$container.position($crate::Position::Absolute)
}};
($container:expr, top: $val:expr, $($rest:tt)*) => {{
let c = $container.top($val);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, top: $val:expr) => {{
$container.top($val)
}};
($container:expr, right: $val:expr, $($rest:tt)*) => {{
let c = $container.right($val);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, right: $val:expr) => {{
$container.right($val)
}};
($container:expr, bottom: $val:expr, $($rest:tt)*) => {{
let c = $container.bottom($val);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, bottom: $val:expr) => {{
$container.bottom($val)
}};
($container:expr, left: $val:expr, $($rest:tt)*) => {{
let c = $container.left($val);
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, left: $val:expr) => {{
$container.left($val)
}};
($container:expr, wrap: $mode:tt, $($rest:tt)*) => {{
let c = $container.wrap($crate::wrap_value!($mode));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, wrap: $mode:tt) => {{
$container.wrap($crate::wrap_value!($mode))
}};
($container:expr, overflow: $mode:tt, $($rest:tt)*) => {{
let c = $container.overflow($crate::overflow_value!($mode));
$crate::tui_apply_props!(c, $($rest)*)
}};
($container:expr, overflow: $mode:tt) => {{
$container.overflow($crate::overflow_value!($mode))
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_build_text {
($content:expr,) => {{
$crate::Text::new($content).into()
}};
($content:expr, $($props:tt)*) => {{
#[allow(unused_mut)]
let __text = $crate::Text::new($content);
let __text = $crate::tui_apply_text_props!(__text, $($props)* ,);
__text.into()
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_apply_text_props {
($text:expr,) => { $text };
($text:expr) => { $text };
($text:expr, color: $color:tt, $($rest:tt)*) => {{
let t = $text.color($crate::color_value!($color));
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, color: $color:tt) => {{
$text.color($crate::color_value!($color))
}};
($text:expr, color: ($color:expr), $($rest:tt)*) => {{
let t = $text.color($color);
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, color: ($color:expr)!, $($rest:tt)*) => {{
let t = if let Some(color_val) = $color {
$text.color(color_val)
} else {
$text
};
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, color: ($color:expr)!) => {{
if let Some(color_val) = $color {
$text.color(color_val)
} else {
$text
}
}};
($text:expr, bg: $color:tt, $($rest:tt)*) => {{
let t = $text.background($crate::color_value!($color));
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, bg: $color:tt) => {{
$text.background($crate::color_value!($color))
}};
($text:expr, bg: ($color:expr)!, $($rest:tt)*) => {{
let t = if let Some(bg_val) = $color {
$text.background(bg_val)
} else {
$text
};
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, bg: ($color:expr)!) => {{
if let Some(bg_val) = $color {
$text.background(bg_val)
} else {
$text
}
}};
($text:expr, bold, $($rest:tt)*) => {{
let t = $text.bold();
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, bold) => {{
$text.bold()
}};
($text:expr, italic, $($rest:tt)*) => {{
let t = $text.italic();
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, italic) => {{
$text.italic()
}};
($text:expr, underline, $($rest:tt)*) => {{
let t = $text.underline();
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, underline) => {{
$text.underline()
}};
($text:expr, strikethrough, $($rest:tt)*) => {{
let t = $text.strikethrough();
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, strikethrough) => {{
$text.strikethrough()
}};
($text:expr, wrap: $mode:tt, $($rest:tt)*) => {{
let t = $text.wrap($crate::text_wrap_value!($mode));
$crate::tui_apply_text_props!(t, $($rest)*)
}};
($text:expr, wrap: $mode:tt) => {{
$text.wrap($crate::text_wrap_value!($mode))
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_build_richtext {
(props: [$($props:tt)*], spans: [$($spans:tt)*]) => {{
#[allow(unused_mut)]
let mut __richtext = $crate::RichText::new();
__richtext = $crate::tui_add_richtext_spans!(__richtext, $($spans)*);
let __richtext = $crate::tui_apply_richtext_props!(__richtext, $($props)*);
__richtext.into()
}};
(props: [], spans: [$($spans:tt)*]) => {{
#[allow(unused_mut)]
let mut __richtext = $crate::RichText::new();
__richtext = $crate::tui_add_richtext_spans!(__richtext, $($spans)*);
__richtext.into()
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_add_richtext_spans {
($rt:expr,) => { $rt };
($rt:expr) => { $rt };
($rt:expr, text($content:expr, $($props:tt)*), $($rest:tt)*) => {{
let mut style = $crate::TextStyle::default();
style = $crate::tui_apply_span_style!(style, $($props)*,);
let rt = $rt.styled($content, style);
$crate::tui_add_richtext_spans!(rt, $($rest)*)
}};
($rt:expr, text($content:expr), $($rest:tt)*) => {{
let rt = $rt.text($content);
$crate::tui_add_richtext_spans!(rt, $($rest)*)
}};
($rt:expr, text($content:expr, $($props:tt)*)) => {{
let mut style = $crate::TextStyle::default();
style = $crate::tui_apply_span_style!(style, $($props)*,);
$rt.styled($content, style)
}};
($rt:expr, text($content:expr)) => {{
$rt.text($content)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_apply_span_style {
($style:expr,) => { $style };
($style:expr) => { $style };
($style:expr, color: $color:tt, $($rest:tt)*) => {{
let mut s = $style;
s.color = Some($crate::color_value!($color));
$crate::tui_apply_span_style!(s, $($rest)*)
}};
($style:expr, color: $color:tt) => {{
let mut s = $style;
s.color = Some($crate::color_value!($color));
s
}};
($style:expr, bg: $color:tt, $($rest:tt)*) => {{
let mut s = $style;
s.background = Some($crate::color_value!($color));
$crate::tui_apply_span_style!(s, $($rest)*)
}};
($style:expr, bg: $color:tt) => {{
let mut s = $style;
s.background = Some($crate::color_value!($color));
s
}};
($style:expr, bold, $($rest:tt)*) => {{
let mut s = $style;
s.bold = Some(true);
$crate::tui_apply_span_style!(s, $($rest)*)
}};
($style:expr, bold) => {{
let mut s = $style;
s.bold = Some(true);
s
}};
($style:expr, italic, $($rest:tt)*) => {{
let mut s = $style;
s.italic = Some(true);
$crate::tui_apply_span_style!(s, $($rest)*)
}};
($style:expr, italic) => {{
let mut s = $style;
s.italic = Some(true);
s
}};
($style:expr, underline, $($rest:tt)*) => {{
let mut s = $style;
s.underline = Some(true);
$crate::tui_apply_span_style!(s, $($rest)*)
}};
($style:expr, underline) => {{
let mut s = $style;
s.underline = Some(true);
s
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_apply_richtext_props {
($rt:expr,) => { $rt };
($rt:expr) => { $rt };
($rt:expr, wrap: $wrap:tt, $($rest:tt)*) => {{
let rt = $rt.wrap($crate::text_wrap_value!($wrap));
$crate::tui_apply_richtext_props!(rt, $($rest)*)
}};
($rt:expr, color: $color:tt, $($rest:tt)*) => {{
let rt = $rt.color($crate::color_value!($color));
$crate::tui_apply_richtext_props!(rt, $($rest)*)
}};
($rt:expr, bg: $color:tt, $($rest:tt)*) => {{
let rt = $rt.background($crate::color_value!($color));
$crate::tui_apply_richtext_props!(rt, $($rest)*)
}};
($rt:expr, bold_all, $($rest:tt)*) => {{
let rt = $rt.bold_all();
$crate::tui_apply_richtext_props!(rt, $($rest)*)
}};
($rt:expr, italic_all, $($rest:tt)*) => {{
let rt = $rt.italic_all();
$crate::tui_apply_richtext_props!(rt, $($rest)*)
}};
($rt:expr, wrap: $wrap:tt) => {{
$rt.wrap($crate::text_wrap_value!($wrap))
}};
($rt:expr, color: $color:tt) => {{
$rt.color($crate::color_value!($color))
}};
($rt:expr, bg: $color:tt) => {{
$rt.background($crate::color_value!($color))
}};
($rt:expr, bold_all) => {{
$rt.bold_all()
}};
($rt:expr, italic_all) => {{
$rt.italic_all()
}};
}
#[macro_export]
#[doc(hidden)]
macro_rules! tui_text {
($content:expr, $($props:tt)*) => {{
$crate::tui_build_text!($content, $($props)*)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_build_input {
() => {{
$crate::Node::Component(Box::new($crate::TextInput::new()))
}};
($($props:tt)*) => {{
#[allow(unused_mut)]
let __input = $crate::TextInput::new();
let __input = $crate::tui_apply_input_props!(__input, $($props)* ,);
$crate::Node::Component(Box::new(__input))
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! tui_apply_input_props {
($input:expr,) => { $input };
($input:expr) => { $input };
($input:expr, placeholder: $text:expr, $($rest:tt)*) => {{
let i = $input.placeholder($text);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, placeholder: $text:expr) => {{
$input.placeholder($text)
}};
($input:expr, focusable: $value:expr, $($rest:tt)*) => {{
let i = $input.focusable($value);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, focusable: $value:expr) => {{
$input.focusable($value)
}};
($input:expr, focusable, $($rest:tt)*) => {{
let i = $input.focusable(true);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, focusable) => {{
$input.focusable(true)
}};
($input:expr, w: $value:expr, $($rest:tt)*) => {{
let i = $input.width($value);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, w: $value:expr) => {{
$input.width($value)
}};
($input:expr, width: $value:expr, $($rest:tt)*) => {{
let i = $input.width($value);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, width: $value:expr) => {{
$input.width($value)
}};
($input:expr, h: $value:expr, $($rest:tt)*) => {{
let i = $input.height($value);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, h: $value:expr) => {{
$input.height($value)
}};
($input:expr, height: $value:expr, $($rest:tt)*) => {{
let i = $input.height($value);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, height: $value:expr) => {{
$input.height($value)
}};
($input:expr, border: $color:tt, $($rest:tt)*) => {{
let i = $input.border($crate::color_value!($color));
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, border: $color:tt) => {{
$input.border($crate::color_value!($color))
}};
($input:expr, border: ($color:expr), $($rest:tt)*) => {{
let i = $input.border($color);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, border: ($color:expr)) => {{
$input.border($color)
}};
($input:expr, bg: $color:tt, $($rest:tt)*) => {{
let i = $input.background($crate::color_value!($color));
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, bg: $color:tt) => {{
$input.background($crate::color_value!($color))
}};
($input:expr, bg: ($color:expr), $($rest:tt)*) => {{
let i = $input.background($color);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, bg: ($color:expr)) => {{
$input.background($color)
}};
($input:expr, cursor_color: $color:tt, $($rest:tt)*) => {{
let i = $input.cursor_color($crate::color_value!($color));
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, cursor_color: $color:tt) => {{
$input.cursor_color($crate::color_value!($color))
}};
($input:expr, cursor_color: ($color:expr), $($rest:tt)*) => {{
let i = $input.cursor_color($color);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, cursor_color: ($color:expr)) => {{
$input.cursor_color($color)
}};
($input:expr, content_color: $color:tt, $($rest:tt)*) => {{
let i = $input.content_color($crate::color_value!($color));
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, content_color: $color:tt) => {{
$input.content_color($crate::color_value!($color))
}};
($input:expr, color: $color:tt, $($rest:tt)*) => {{
let i = $input.content_color($crate::color_value!($color));
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, color: $color:tt) => {{
$input.content_color($crate::color_value!($color))
}};
($input:expr, content_bold: $value:expr, $($rest:tt)*) => {{
let i = $input.content_bold($value);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, content_bold: $value:expr) => {{
$input.content_bold($value)
}};
($input:expr, bold, $($rest:tt)*) => {{
let i = $input.content_bold(true);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, bold) => {{
$input.content_bold(true)
}};
($input:expr, wrap: $mode:ident, $($rest:tt)*) => {{
let i = $input.wrap($crate::text_wrap_value!($mode));
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, wrap: $mode:ident) => {{
$input.wrap($crate::text_wrap_value!($mode))
}};
($input:expr, wrap: ($mode:expr), $($rest:tt)*) => {{
let i = $input.wrap($mode);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, wrap: ($mode:expr)) => {{
$input.wrap($mode)
}};
($input:expr, pad: $value:expr, $($rest:tt)*) => {{
let i = $input.padding($crate::Spacing::all($value));
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, pad: $value:expr) => {{
$input.padding($crate::Spacing::all($value))
}};
($input:expr, password: $value:expr, $($rest:tt)*) => {{
let i = $input.password($value);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, password: $value:expr) => {{
$input.password($value)
}};
($input:expr, password, $($rest:tt)*) => {{
let i = $input.password(true);
$crate::tui_apply_input_props!(i, $($rest)*)
}};
($input:expr, password) => {{
$input.password(true)
}};
}