#[macro_export]
macro_rules! unit {
(@with_value px $value:literal) => ( bevy::ui::Val::Px($value as f32));
(@with_value pct $value:literal) => ( bevy::ui::Val::Percent($value as f32));
(auto) => ( bevy::ui::Val::Auto );
(undefined) => ( bevy::ui::Val::Undefined );
($value:literal $val_unit:ident) => ( unit!(@with_value $val_unit $value));
}
#[macro_export]
macro_rules! style {
(@default ($default:expr) $($field:ident : $content:expr),*) => (
bevy::ui::Style { $($field : $content,)* .. $default }
);
($($field:ident : $content:expr,)*) => (
style!(@default (Default::default()) $($field : $content),*)
);
}
#[macro_export]
macro_rules! size {
($x:tt $($x_unit:ident)?, $y:tt $($y_unit:ident)?) => (
bevy::ui::Size::new(unit!($x $($x_unit)?), unit!($y $($y_unit)?))
);
}
#[macro_export]
macro_rules! rect {
($x:tt $($x_unit:ident)?) => (
bevy::ui::UiRect::all(unit!($x $($x_unit)?))
);
(
$left:tt $($left_unit:ident)?, $top:tt $($top_unit:ident)?,
$right:tt $($right_unit:ident)?, $bottom:tt $($bottom_unit:ident)? $(,)?
) => (
bevy::ui::UiRect {
left: unit!($left $($left_unit)?),
top: unit!($top $($top_unit)?),
right: unit!($right $($right_unit)?),
bottom: unit!($bottom $($bottom_unit)?),
}
);
($x:tt $($x_unit:ident)?, $y:tt $($y_unit:ident)?) => (
bevy::ui::UiRect {
left: unit!($x $($x_unit)?),
top: unit!($y $($y_unit)?),
right: unit!($x $($x_unit)?),
bottom: unit!($y $($y_unit)?),
}
);
}
#[macro_export]
macro_rules! build_ui {
(@preset entity) => (());
(@preset $anything_else:ident) => ($anything_else);
(@preset $node:ident {$($styles:tt)*}) => (
bevy::ui::node_bundles::NodeBundle {
style: style!(@default ($node.style.clone()) $($styles)*),
.. $node.clone()
}
);
(@child_list list: (if ($predicate:expr) { $( $if_true:tt )* } else { $( $if_false:tt )* } $(,)?),
cmds: $cmds:expr, prefix: ($( $prefix:tt )*),
) => (
$( $prefix )*
if $predicate {
build_ui!(@child_list list: ($( $if_true )*), cmds: $cmds, prefix: (),);
} else {
build_ui!(@child_list list: ($( $if_false )*), cmds: $cmds, prefix: (),);
}
);
(@child_list list: (if ($predicate:expr) { $( $if_true:tt )* } $(,)?),
cmds: $cmds:expr, prefix: ($( $prefix:tt )*),
) => (
$( $prefix )*
if $predicate {
build_ui!(@child_list list: ($( $if_true )*), cmds: $cmds, prefix: (),);
}
);
(@child_list list: (
if ($predicate:expr) { $( $if_true:tt )* } else { $( $if_false:tt )* }
, $( $tail:tt )+
),
cmds: $cmds:expr, prefix: ($( $prefix:tt )*),
) => (
build_ui! ( @child_list
list: ( $( $tail )+ ),
cmds: $cmds,
prefix: ($( $prefix )*
if $predicate {
build_ui!(@child_list list: ($( $if_true )*), cmds: $cmds, prefix: (),);
} else {
build_ui!(@child_list list: ($( $if_false )*), cmds: $cmds, prefix: (),);
}
),
)
);
(@child_list list: (if ($predicate:expr) { $( $if_true:tt )* } , $( $tail:tt )+),
cmds: $cmds:expr, prefix: ($( $prefix:tt )*),
) => (
build_ui! ( @child_list
list: ( $( $tail )+ ),
cmds: $cmds,
prefix: ($( $prefix )*
if $predicate {
build_ui!(@child_list list: ($( $if_true )*), cmds: $cmds, prefix: (),);
}
),
)
);
(@child_list list: ($preset:ident $( { $($syl:tt)* } )? $( [ $($bc:tt)* ] )? $( ( $( $c:tt )* ) )? $(,)?),
cmds: $cmds:expr, prefix: ($( $prefix:tt )*),
) => (
$( $prefix )*
build_ui!{ #[cmd($cmds)] $preset $( { $($syl)* } )? $( [ $($bc)* ] )? $( ( $($c)* ) )? }
);
(@child_list list: (
$preset:ident $( { $($syl:tt)* } )? $( [ $($bc:tt)* ] )? $( ( $( $c:tt )* ) )?
, $( $tail:tt )+
),
cmds: $cmds:expr, prefix: ($( $prefix:tt )*),
) => (
build_ui! ( @child_list
list: ( $( $tail )+ ),
cmds: $cmds,
prefix: ($( $prefix )*
build_ui!{ #[cmd($cmds)] $preset $( { $($syl)* } )? $( [ $($bc)* ] )? $( ( $($c)* ) )? };
),
)
);
(#[cmd($cmds:expr)] id ( $id:expr )) => ({
use bevy::ecs::system::Insert;
let parent = $cmds.parent_entity();
let insert = bevy::hierarchy::AddChild {
child: $id,
parent,
};
$cmds.add_command(insert);
});
(#[cmd($cmds:expr)] $preset:ident
$( {$($styles:tt)*} )? $( [$($bundles:expr),* ; $($components:expr),*] )? $( ( $( $children_list:tt )* ) )?
) => (
$cmds.spawn(build_ui!(@preset $preset $({$($styles)*})?).clone())
$($(.insert($bundles.clone()))*
$(.insert($components.clone()))*)?
$(.with_children(|cmds| {
build_ui!(@child_list
list: ( $( $children_list )* ),
cmds: cmds,
prefix: (),
);
}))?
);
}