Large structure update
This commit is contained in:
+94
-24
@@ -8,7 +8,7 @@ macro_rules! __oml {
|
||||
}};
|
||||
|
||||
($tag:ident ($($k:ident = $v:expr),*) {$($inner:tt)*} $($rest:tt)+) => {{
|
||||
let mut comps: Vec<osui::Component> = osui::__oml!($($rest)+);
|
||||
let mut comps: Vec<Box<dyn osui::Element>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($($k = $v),*) {$($inner)*}));
|
||||
comps
|
||||
}};
|
||||
@@ -19,30 +19,30 @@ macro_rules! __oml {
|
||||
}};
|
||||
|
||||
($tag:ident {$($inner:tt)*} $($rest:tt)+) => {{
|
||||
let mut comps: Vec<osui::Component> = osui::__oml!($($rest)+);
|
||||
let mut comps: Vec<Box<dyn osui::Element>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag {$($inner)*}));
|
||||
comps
|
||||
}};
|
||||
|
||||
// Expression, With components (EC)
|
||||
($tag:ident ($expr:expr; $($k:ident = $v:expr),*) {$($inner:tt)*}) => {{
|
||||
vec![oml!($tag ($expr; $($k = $v),*) {$($inner)*})]
|
||||
($tag:ident ($text:expr; $($k:ident = $v:expr),*) {$($inner:tt)*}) => {{
|
||||
vec![oml!($tag ($text; $($k = $v),*) {$($inner)*})]
|
||||
}};
|
||||
|
||||
($tag:ident ($expr:expr; $($k:ident = $v:expr),*) {$($inner:tt)*} $($rest:tt)+) => {{
|
||||
let mut comps: Vec<osui::Component> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($expr; $($k = $v),*) {$($inner)*}));
|
||||
($tag:ident ($text:expr; $($k:ident = $v:expr),*) {$($inner:tt)*} $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Element>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($text; $($k = $v),*) {$($inner)*}));
|
||||
comps
|
||||
}};
|
||||
|
||||
// Expression (E)
|
||||
($tag:ident ($expr:expr; $($k:ident = $v:expr),*)) => {{
|
||||
vec![oml!($tag ($expr; $($k = $v),*))]
|
||||
($tag:ident ($text:expr; $($k:ident = $v:expr),*)) => {{
|
||||
vec![oml!($tag ($text; $($k = $v),*))]
|
||||
}};
|
||||
|
||||
($tag:ident ($expr:expr; $($k:ident = $v:expr),*) $($rest:tt)+) => {{
|
||||
let mut comps: Vec<osui::Component> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($expr; $($k = $v),*)));
|
||||
($tag:ident ($text:expr; $($k:ident = $v:expr),*) $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Element>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($text; $($k = $v),*)));
|
||||
comps
|
||||
}};
|
||||
|
||||
@@ -52,19 +52,19 @@ macro_rules! __oml {
|
||||
}};
|
||||
|
||||
($tag:ident ($($k:ident = $v:expr),*) $($rest:tt)+) => {{
|
||||
let mut comps: Vec<osui::Component> = osui::__oml!($($rest)+);
|
||||
let mut comps: Vec<Box<dyn osui::Element>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($($k = $v),*)));
|
||||
comps
|
||||
}};
|
||||
|
||||
// Pre-Defined (D)
|
||||
($expr:expr;) => {{
|
||||
vec![oml!($expr;)]
|
||||
($text:expr;) => {{
|
||||
vec![oml!($text;)]
|
||||
}};
|
||||
|
||||
($expr:expr; $($rest:tt)+) => {{
|
||||
let mut comps: Vec<osui::Component> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($expr));
|
||||
($text:expr; $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Element>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($text));
|
||||
comps
|
||||
}};
|
||||
}
|
||||
@@ -82,10 +82,10 @@ macro_rules! oml {
|
||||
}};
|
||||
|
||||
// Expression, With components (EC)
|
||||
( $tag:ident ($expr:expr; $($k:ident = $v:expr),* ) {$($inner:tt)*} ) => {{
|
||||
( $tag:ident ($text:expr; $($k:ident = $v:expr),* ) {$($inner:tt)*} ) => {{
|
||||
let mut c = $tag();
|
||||
c.children = osui::__oml!($($inner)*);
|
||||
c.params = String::from($expr);
|
||||
c.text = String::from($text);
|
||||
$(
|
||||
c.$k = $v;
|
||||
)*
|
||||
@@ -93,9 +93,9 @@ macro_rules! oml {
|
||||
}};
|
||||
|
||||
// Expression (E)
|
||||
( $tag:ident ($expr:expr; $($k:ident = $v:expr),*) ) => {{
|
||||
( $tag:ident ($text:expr; $($k:ident = $v:expr),*) ) => {{
|
||||
let mut c = $tag();
|
||||
c.expr = String::from($expr);
|
||||
c.text = String::from($text);
|
||||
$(
|
||||
c.$k = $v;
|
||||
)*
|
||||
@@ -120,8 +120,8 @@ macro_rules! oml {
|
||||
}};
|
||||
|
||||
// Pre-Defined (D)
|
||||
($expr:expr;) => {{
|
||||
$expr
|
||||
($text:expr;) => {{
|
||||
$text
|
||||
}};
|
||||
}
|
||||
|
||||
@@ -134,3 +134,73 @@ macro_rules! create_frame {
|
||||
vec![" ".repeat($width); $height]
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
///```component!{
|
||||
/// MyElem {}
|
||||
/// defaults {}
|
||||
/// }```
|
||||
///
|
||||
/// Create a frame for rendering multiple components
|
||||
macro_rules! element {
|
||||
(
|
||||
$name:ident {
|
||||
$( $inner:tt )*
|
||||
}
|
||||
defaults {$( $defaults:tt )*}
|
||||
$( $functions:tt )*
|
||||
) => {
|
||||
#[derive(Debug)]
|
||||
pub struct $name {
|
||||
pub x: usize,
|
||||
pub y: usize,
|
||||
pub width: usize,
|
||||
pub height: usize,
|
||||
pub children: Vec<Box<dyn Element>>,
|
||||
pub child: usize,
|
||||
pub text: String,
|
||||
pub style: Style,
|
||||
$( $inner )*
|
||||
}
|
||||
|
||||
impl Element for $name {
|
||||
fn get_child(&mut self) -> Option<&mut Box<dyn Element>> {
|
||||
self.children.get_mut(self.child)
|
||||
}
|
||||
fn get_data(&self) -> ElementData {
|
||||
ElementData {
|
||||
x: self.x,
|
||||
y: self.y,
|
||||
width: self.width,
|
||||
height: self.height,
|
||||
style: self.style.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
fn set_data(&mut self, data: ElementData) {
|
||||
self.x = data.x;
|
||||
self.y = data.y;
|
||||
self.width = data.width;
|
||||
self.height = data.height;
|
||||
self.style = data.style;
|
||||
}
|
||||
$( $functions )*
|
||||
}
|
||||
|
||||
impl $name {
|
||||
pub fn new() -> $name {
|
||||
$name {
|
||||
children: Vec::new(),
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: 0,
|
||||
height: 0,
|
||||
child: 0,
|
||||
text: String::new(),
|
||||
style: Style::default(),
|
||||
$( $defaults )*
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user