use crate::{node::Node, utils::LazyMeasure};
use std::sync::Arc;
pub trait HorizontalMeasure {}
pub trait VerticalMeasure {}
pub struct Fixed(pub i32);
impl HorizontalMeasure for Fixed {}
impl VerticalMeasure for Fixed {}
impl From<i32> for Fixed {
fn from(value: i32) -> Self {
Fixed(value)
}
}
impl From<Fixed> for LazyMeasure {
fn from(fixed: Fixed) -> Self {
LazyMeasure::lazy(fixed.0)
}
}
macro_rules! def_relative_measure {
($implement: ident, $name:ident, $measure:ident) => {
pub struct $name {
measure: LazyMeasure,
}
impl $name {
pub fn of(node: &Arc<impl Node + Sync + 'static>) -> Self {
let node = node.clone();
let measure = LazyMeasure::new(move || Node::$measure(node.as_ref()).into());
$name { measure }
}
pub fn away_from(node: &Arc<impl Node + Sync + 'static>, offset: i32) -> Self {
let node = node.clone();
let measure =
LazyMeasure::new(move || (Node::$measure(node.as_ref()) - offset).into());
$name { measure }
}
}
impl From<$name> for LazyMeasure {
fn from(value: $name) -> Self {
value.measure
}
}
impl $implement for $name {}
};
}
def_relative_measure!(HorizontalMeasure, Left, get_left);
def_relative_measure!(HorizontalMeasure, Right, get_right);
def_relative_measure!(VerticalMeasure, Top, get_top);
def_relative_measure!(VerticalMeasure, Bottom, get_bottom);