Large structure update

This commit is contained in:
2024-10-30 14:14:00 +01:00
parent 943bcf874a
commit 87ae71072e
6 changed files with 161 additions and 629 deletions
+94 -24
View File
@@ -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 )*
}
}
}
};
}