diff --git a/hui-examples/examples/align_test.rs b/hui-examples/examples/align_test.rs index 257423e..72612f8 100644 --- a/hui-examples/examples/align_test.rs +++ b/hui-examples/examples/align_test.rs @@ -8,7 +8,7 @@ use winit::{ use hui::{ element::{ container::Container, progress_bar::ProgressBar, rect::Rect, ElementList, UiElement - }, layout::{Alignment, UiDirection, UiSize}, rectangle::{Corners, Sides}, UiInstance + }, layout::{Alignment, UiDirection, Size}, rectangle::{Corners, Sides}, UiInstance }; use hui_glium::GliumUiRenderer; @@ -42,7 +42,7 @@ fn main() { gap: 5., padding: Sides::all(5.), align: (Alignment::Begin, Alignment::Center).into(), - size: (UiSize::Fraction(1.), UiSize::Fraction(1.)).into(), + size: (Size::Fraction(1.), Size::Fraction(1.)).into(), children: ElementList(vec![ Box::new(ProgressBar { value: 0.5, @@ -56,7 +56,7 @@ fn main() { gap: 5., padding: Sides::all(5.), align: (Alignment::End, Alignment::Center).into(), - size: (UiSize::Fraction(1.), UiSize::Fraction(1.)).into(), + size: (Size::Fraction(1.), Size::Fraction(1.)).into(), children: ElementList(vec![ Box::new(ProgressBar { value: z, @@ -64,17 +64,17 @@ fn main() { ..Default::default() }), Box::new(Container { - size: (UiSize::Fraction(1.), UiSize::Auto).into(), + size: (Size::Fraction(1.), Size::Auto).into(), align: (Alignment::Center, Alignment::End).into(), padding: Sides::all(5.), gap: 10., children: ElementList(vec![ Box::new(Rect { - size: (UiSize::Fraction(0.5), UiSize::Static(30.)), + size: (Size::Fraction(0.5), Size::Static(30.)), color: vec4(0.75, 0., 0., 1.).into() }), Box::new(Rect { - size: (UiSize::Fraction(z / 2. + 0.5), UiSize::Static(30.)), + size: (Size::Fraction(z / 2. + 0.5), Size::Static(30.)), color: Corners::left_right( vec4(1., 0., 0., 1.), vec4(0., 1., 0., 1.) @@ -84,7 +84,7 @@ fn main() { ..Default::default() }), Box::new(Rect { - size: (UiSize::Fraction(z / 2. + 0.5), UiSize::Static(30.)), + size: (Size::Fraction(z / 2. + 0.5), Size::Static(30.)), color: vec4(0., 0.75, 0., 1.).into() }), Box::new(Container { @@ -96,7 +96,7 @@ fn main() { let mut x: Vec> = vec![]; for i in 0..10 { x.push(Box::new(Rect { - size: (UiSize::Static(50.), UiSize::Static(50.)), + size: (Size::Static(50.), Size::Static(50.)), color: if i == 1 { vec4(0.75, 0.75, 0.75, 0.75).into() } else { @@ -124,7 +124,7 @@ fn main() { }, children: ElementList(vec![ Box::new(Rect { - size: (UiSize::Static(50.), UiSize::Static(50.)), + size: (Size::Static(50.), Size::Static(50.)), color: vec4(1., 1., 1., 0.75).into() }), ]), diff --git a/hui-examples/examples/mom_downloader.rs b/hui-examples/examples/mom_downloader.rs index 643e962..fdbea3a 100644 --- a/hui-examples/examples/mom_downloader.rs +++ b/hui-examples/examples/mom_downloader.rs @@ -11,7 +11,7 @@ use hui::{ progress_bar::ProgressBar, text::Text, ElementList, }, - layout::{Alignment, UiDirection, UiSize}, + layout::{Alignment, UiDirection, Size}, rectangle::{Corners, Sides}, UiInstance, }; @@ -55,12 +55,12 @@ fn main() { hui.add(Container { align: Alignment::Center.into(), - size: (UiSize::Fraction(1.), UiSize::Fraction(1.)).into(), + size: (Size::Fraction(1.), Size::Fraction(1.)).into(), background: vec4(0.1, 0.1, 0.1, 1.).into(), children: ElementList(vec![Box::new(Container { gap: 5., padding: Sides::all(10.), - size: (UiSize::Static(450.), UiSize::Auto).into(), + size: (Size::Static(450.), Size::Auto).into(), background: vec4(0.2, 0.2, 0.5, 1.).into(), corner_radius: Corners::all(8.), children: elements(|el| { @@ -79,7 +79,7 @@ fn main() { el.push(Box::new(Container { direction: UiDirection::Horizontal, align: (Alignment::End, Alignment::Center).into(), - size: (UiSize::Fraction(1.), UiSize::Auto).into(), + size: (Size::Fraction(1.), Size::Auto).into(), children: ElementList(vec![Box::new(Text { text: format!("{:.2}% ({:.1} GB)", mom_ratio * 100., mom_ratio * 10000.).into(), font: font_handle, diff --git a/hui-examples/examples/rounded_rect.rs b/hui-examples/examples/rounded_rect.rs index b46e20a..97cc236 100644 --- a/hui-examples/examples/rounded_rect.rs +++ b/hui-examples/examples/rounded_rect.rs @@ -9,7 +9,7 @@ use hui::{ container::Container, text::Text, ElementList }, - layout::{Alignment, UiDirection, UiSize}, + layout::{Alignment, UiDirection, Size}, rectangle::{Corners, Sides}, UiInstance }; @@ -40,11 +40,11 @@ fn main() { hui.add(Container { gap: 10., align: Alignment::Center.into(), - size: (UiSize::Fraction(1.), UiSize::Fraction(1.)).into(), + size: (Size::Fraction(1.), Size::Fraction(1.)).into(), children: ElementList(vec![ Box::new(Container { align: Alignment::Center.into(), - size: (UiSize::Fraction(0.5), UiSize::Fraction(0.5)).into(), + size: (Size::Fraction(0.5), Size::Fraction(0.5)).into(), background: vec4(1., 0., 0., 1.).into(), corner_radius: Corners { top_left: 10., @@ -57,7 +57,7 @@ fn main() { padding: Sides::all(20.), direction: UiDirection::Horizontal, align: Alignment::Center.into(), - size: (UiSize::Auto, UiSize::Auto).into(), + size: (Size::Auto, Size::Auto).into(), background: vec4(0.1, 0.1, 0.1, 0.5).into(), corner_radius: Corners::all(8.), children: ElementList(vec![ @@ -84,7 +84,7 @@ fn main() { direction: UiDirection::Horizontal, children: ElementList(vec![ Box::new(Container { - size: (UiSize::Static(100.), UiSize::Static(100.)).into(), + size: (Size::Static(100.), Size::Static(100.)).into(), background: Corners::left_right( vec4(1., 0., 0., 1.), vec4(0., 1., 0., 1.) @@ -93,7 +93,7 @@ fn main() { ..Default::default() }), Box::new(Container { - size: (UiSize::Static(100.), UiSize::Static(100.)).into(), + size: (Size::Static(100.), Size::Static(100.)).into(), background: Corners::left_right( vec4(1., 0., 0., 1.), vec4(0., 1., 0., 1.) @@ -102,7 +102,7 @@ fn main() { ..Default::default() }), Box::new(Container { - size: (UiSize::Static(100.), UiSize::Static(100.)).into(), + size: (Size::Static(100.), Size::Static(100.)).into(), background: Corners::left_right( vec4(1., 0., 0., 1.), vec4(0., 1., 0., 1.) @@ -111,7 +111,7 @@ fn main() { ..Default::default() }), Box::new(Container { - size: (UiSize::Static(100.), UiSize::Static(100.)).into(), + size: (Size::Static(100.), Size::Static(100.)).into(), background: Corners::left_right( vec4(1., 0., 0., 1.), vec4(0., 1., 0., 1.) diff --git a/hui-examples/examples/text_weird.rs b/hui-examples/examples/text_weird.rs index a799520..4dee33d 100644 --- a/hui-examples/examples/text_weird.rs +++ b/hui-examples/examples/text_weird.rs @@ -8,7 +8,7 @@ use winit::{ use hui::{ element::{ container::Container, rect::Rect, spacer::Spacer, text::Text, ElementList - }, layout::UiSize, UiInstance + }, layout::Size, UiInstance }; use hui_glium::GliumUiRenderer; @@ -46,7 +46,7 @@ fn main() { hui.begin(); hui.add(Container { - size: (UiSize::Fraction(1.), UiSize::Fraction(1.)).into(), + size: (Size::Fraction(1.), Size::Fraction(1.)).into(), background: vec4(0.1, 0.1, 0.1, 1.).into(), children: elements(|elem| { elem.push(Box::new(Text { @@ -70,11 +70,11 @@ fn main() { })); } elem.push(Box::new(Rect { - size: (UiSize::Fraction(1.), UiSize::Static(10.)), + size: (Size::Fraction(1.), Size::Static(10.)), color: vec4(0., 0., 1., 1.).into(), })); elem.push(Box::new(Rect { - size: (UiSize::Fraction(1.), UiSize::Static(10.)), + size: (Size::Fraction(1.), Size::Static(10.)), color: vec4(1., 1., 0., 1.).into(), })); elem.push(Box::new(Text { @@ -85,11 +85,11 @@ fn main() { })); if instant.elapsed().as_secs() & 1 != 0 { elem.push(Box::new(Rect { - size: (UiSize::Fraction(1.), UiSize::Static(10.)), + size: (Size::Fraction(1.), Size::Static(10.)), color: vec4(1., 0., 0., 1.).into(), })); elem.push(Box::new(Rect { - size: (UiSize::Fraction(1.), UiSize::Static(10.)), + size: (Size::Fraction(1.), Size::Static(10.)), color: vec4(0., 0., 0., 1.).into(), })); elem.push(Box::new(Spacer(100.))); diff --git a/hui/src/background.rs b/hui/src/background.rs index f6614ca..ed40133 100644 --- a/hui/src/background.rs +++ b/hui/src/background.rs @@ -1,3 +1,5 @@ +//! background color, gradient and texturing + use glam::{vec4, Vec3, Vec4}; use crate::rectangle::Corners; diff --git a/hui/src/draw.rs b/hui/src/draw.rs index 2153ffb..a0fd7c7 100644 --- a/hui/src/draw.rs +++ b/hui/src/draw.rs @@ -1,4 +1,4 @@ -//! Stuff related to tesselation and UI rendering. +//! draw commands, tesselation and UI rendering. use crate::{ rectangle::Corners, diff --git a/hui/src/element.rs b/hui/src/element.rs index 3dfd737..8cb2504 100644 --- a/hui/src/element.rs +++ b/hui/src/element.rs @@ -1,3 +1,4 @@ +//! element API, built-in elements like `Container`, `Button`, `Text`, etc. use std::any::Any; use crate::{ draw::UiDrawCommandList, layout::LayoutInfo, measure::Response, state::StateRepo, text::TextMeasure, UiInstance diff --git a/hui/src/element/builtin/container.rs b/hui/src/element/builtin/container.rs index f943f1b..4e164e1 100644 --- a/hui/src/element/builtin/container.rs +++ b/hui/src/element/builtin/container.rs @@ -4,7 +4,7 @@ use crate::{ background::BackgroundColor, draw::{RoundedCorners, UiDrawCommand}, element::{ElementList, MeasureContext, ProcessContext, UiElement}, - layout::{Alignment, Alignment2d, LayoutInfo, UiDirection, UiSize, UiSize2d}, + layout::{Alignment, Alignment2d, LayoutInfo, UiDirection, Size, Size2d}, measure::{Hints, Response}, rectangle::{Corners, Sides} }; @@ -23,7 +23,7 @@ use crate::{ #[setters(prefix = "with_")] pub struct Container { #[setters(into)] - pub size: UiSize2d, + pub size: Size2d, pub direction: UiDirection, pub gap: f32, #[setters(into)] @@ -48,7 +48,7 @@ impl Container { impl Default for Container { fn default() -> Self { Self { - size: (UiSize::Auto, UiSize::Auto).into(), + size: (Size::Auto, Size::Auto).into(), direction: UiDirection::Vertical, gap: 0., padding: Sides::all(0.), @@ -63,14 +63,14 @@ impl Default for Container { impl Container { pub fn measure_max_inner_size(&self, layout: &LayoutInfo) -> Vec2 { let outer_size_x = match self.size.width { - UiSize::Auto => layout.max_size.x, - UiSize::Fraction(p) => layout.max_size.x * p, - UiSize::Static(p) => p, + Size::Auto => layout.max_size.x, + Size::Fraction(p) => layout.max_size.x * p, + Size::Static(p) => p, }; let outer_size_y = match self.size.height { - UiSize::Auto => layout.max_size.y, - UiSize::Fraction(p) => layout.max_size.y * p, - UiSize::Static(p) => p, + Size::Auto => layout.max_size.y, + Size::Fraction(p) => layout.max_size.y * p, + Size::Static(p) => p, }; vec2( outer_size_x - (self.padding.left + self.padding.right), @@ -116,14 +116,14 @@ impl UiElement for Container { ); match self.size.width { - UiSize::Auto => (), - UiSize::Fraction(percentage) => size.x = ctx.layout.max_size.x * percentage, - UiSize::Static(pixels) => size.x = pixels, + Size::Auto => (), + Size::Fraction(percentage) => size.x = ctx.layout.max_size.x * percentage, + Size::Static(pixels) => size.x = pixels, } match self.size.height { - UiSize::Auto => (), - UiSize::Fraction(percentage) => size.y = ctx.layout.max_size.y * percentage, - UiSize::Static(pixels) => size.y = pixels, + Size::Auto => (), + Size::Fraction(percentage) => size.y = ctx.layout.max_size.y * percentage, + Size::Static(pixels) => size.y = pixels, } Response { diff --git a/hui/src/element/builtin/progress_bar.rs b/hui/src/element/builtin/progress_bar.rs index 5bf4135..9578ea1 100644 --- a/hui/src/element/builtin/progress_bar.rs +++ b/hui/src/element/builtin/progress_bar.rs @@ -1,11 +1,11 @@ use glam::{vec2, Vec4, vec4}; use crate::{ - draw::{RoundedCorners, UiDrawCommand}, element::{MeasureContext, ProcessContext, UiElement}, layout::UiSize, measure::Response, rectangle::Corners + draw::{RoundedCorners, UiDrawCommand}, element::{MeasureContext, ProcessContext, UiElement}, layout::Size, measure::Response, rectangle::Corners }; #[derive(Debug, Clone, Copy)] pub struct ProgressBar { - pub size: (UiSize, UiSize), + pub size: (Size, Size), pub value: f32, pub color_foreground: Vec4, pub color_background: Vec4, @@ -19,7 +19,7 @@ impl ProgressBar { impl Default for ProgressBar { fn default() -> Self { Self { - size: (UiSize::Auto, UiSize::Auto), + size: (Size::Auto, Size::Auto), value: 0., color_foreground: vec4(0.0, 0.0, 1.0, 1.0), color_background: vec4(0.0, 0.0, 0.0, 1.0), @@ -35,14 +35,14 @@ impl UiElement for ProgressBar { Response { size: vec2( match self.size.0 { - UiSize::Auto => ctx.layout.max_size.x.max(300.), - UiSize::Fraction(p) => ctx.layout.max_size.x * p, - UiSize::Static(p) => p, + Size::Auto => ctx.layout.max_size.x.max(300.), + Size::Fraction(p) => ctx.layout.max_size.x * p, + Size::Static(p) => p, }, match self.size.1 { - UiSize::Auto => Self::DEFAULT_HEIGHT, - UiSize::Fraction(p) => ctx.layout.max_size.y * p, - UiSize::Static(p) => p, + Size::Auto => Self::DEFAULT_HEIGHT, + Size::Fraction(p) => ctx.layout.max_size.y * p, + Size::Static(p) => p, } ), hints: Default::default(), diff --git a/hui/src/element/builtin/rect.rs b/hui/src/element/builtin/rect.rs index a974634..85698d0 100644 --- a/hui/src/element/builtin/rect.rs +++ b/hui/src/element/builtin/rect.rs @@ -3,19 +3,19 @@ use crate::{ background::BackgroundColor, draw::UiDrawCommand, element::{MeasureContext, ProcessContext, UiElement}, - layout::UiSize, + layout::Size, measure::Response }; pub struct Rect { - pub size: (UiSize, UiSize), + pub size: (Size, Size), pub color: BackgroundColor, } impl Default for Rect { fn default() -> Self { Self { - size: (UiSize::Static(10.), UiSize::Static(10.)), + size: (Size::Static(10.), Size::Static(10.)), color: Vec4::new(0., 0., 0., 0.5).into(), } } @@ -26,14 +26,14 @@ impl UiElement for Rect { Response { size: vec2( match self.size.0 { - UiSize::Auto => ctx.layout.max_size.x, - UiSize::Fraction(percentage) => ctx.layout.max_size.x * percentage, - UiSize::Static(pixels) => pixels, + Size::Auto => ctx.layout.max_size.x, + Size::Fraction(percentage) => ctx.layout.max_size.x * percentage, + Size::Static(pixels) => pixels, }, match self.size.1 { - UiSize::Auto => ctx.layout.max_size.y, - UiSize::Fraction(percentage) => ctx.layout.max_size.y * percentage, - UiSize::Static(pixels) => pixels, + Size::Auto => ctx.layout.max_size.y, + Size::Fraction(percentage) => ctx.layout.max_size.y * percentage, + Size::Static(pixels) => pixels, }, ), hints: Default::default(), diff --git a/hui/src/element/builtin/text.rs b/hui/src/element/builtin/text.rs index f088816..0610d9a 100644 --- a/hui/src/element/builtin/text.rs +++ b/hui/src/element/builtin/text.rs @@ -4,7 +4,7 @@ use glam::{vec2, Vec4}; use crate::{ draw::UiDrawCommand, element::{MeasureContext, ProcessContext, UiElement}, - layout::UiSize, + layout::Size, measure::Response, text::FontHandle, }; @@ -22,7 +22,7 @@ use crate::{ pub struct Text { #[setters(into)] pub text: Cow<'static, str>, - pub size: (UiSize, UiSize), + pub size: (Size, Size), pub color: Vec4, pub font: FontHandle, pub text_size: u16, @@ -32,7 +32,7 @@ impl Default for Text { fn default() -> Self { Self { text: "".into(), - size: (UiSize::Auto, UiSize::Auto), + size: (Size::Auto, Size::Auto), color: Vec4::new(1., 1., 1., 1.), font: FontHandle::default(), text_size: 16, @@ -43,7 +43,7 @@ impl Default for Text { impl UiElement for Text { fn measure(&self, ctx: MeasureContext) -> Response { let mut size = (0., 0.); - if matches!(self.size.0, UiSize::Auto) || matches!(self.size.1, UiSize::Auto) { + if matches!(self.size.0, Size::Auto) || matches!(self.size.1, Size::Auto) { let res = ctx.text_measure.measure(self.font, self.text_size, &self.text); size.0 = res.max_width; size.1 = res.height; @@ -51,14 +51,14 @@ impl UiElement for Text { Response { size: vec2( match self.size.0 { - UiSize::Auto => size.0, - UiSize::Fraction(percentage) => ctx.layout.max_size.x * percentage, - UiSize::Static(pixels) => pixels, + Size::Auto => size.0, + Size::Fraction(percentage) => ctx.layout.max_size.x * percentage, + Size::Static(pixels) => pixels, }, match self.size.1 { - UiSize::Auto => size.1, - UiSize::Fraction(percentage) => ctx.layout.max_size.y * percentage, - UiSize::Static(pixels) => pixels, + Size::Auto => size.1, + Size::Fraction(percentage) => ctx.layout.max_size.y * percentage, + Size::Static(pixels) => pixels, }, ), hints: Default::default(), diff --git a/hui/src/event.rs b/hui/src/event.rs index f2b61b5..0b010c5 100644 --- a/hui/src/event.rs +++ b/hui/src/event.rs @@ -1,3 +1,5 @@ +//! input, window events and event handling + use glam::Vec2; /// Represents a mouse button. diff --git a/hui/src/input.rs b/hui/src/input.rs index 3246304..0551d5b 100644 --- a/hui/src/input.rs +++ b/hui/src/input.rs @@ -1,3 +1,5 @@ +//! keyboard, mouse, and touch input handling + pub(crate) struct UiInputState { } diff --git a/hui/src/layout.rs b/hui/src/layout.rs index 1aaadb6..b878c82 100644 --- a/hui/src/layout.rs +++ b/hui/src/layout.rs @@ -1,4 +1,4 @@ -//! Layout related types and functions +//! element layout, alignment and sizing use glam::Vec2; @@ -81,7 +81,7 @@ impl From for Alignment2d { /// Can be either a static size in pixels, a fraction the parent size or auto-calculated\ /// (Meaning of `auto` is entirely dependent on the element). #[derive(Default, Debug, Clone, Copy, PartialEq)] -pub enum UiSize { +pub enum Size { #[default] /// Automatically calculate size based on content Auto, @@ -95,7 +95,7 @@ pub enum UiSize { Static(f32), } -impl From for UiSize { +impl From for Size { #[inline] fn from(value: f32) -> Self { Self::Static(value) @@ -103,22 +103,22 @@ impl From for UiSize { } #[derive(Default, Debug, Clone, Copy, PartialEq)] -pub struct UiSize2d { - pub width: UiSize, - pub height: UiSize, +pub struct Size2d { + pub width: Size, + pub height: Size, } -impl From<(UiSize, UiSize)> for UiSize2d { +impl From<(Size, Size)> for Size2d { #[inline] - fn from((width, height): (UiSize, UiSize)) -> Self { + fn from((width, height): (Size, Size)) -> Self { Self { width, height } } } //XXX: should this exist? -impl From for UiSize2d { +impl From for Size2d { #[inline] - fn from(size: UiSize) -> Self { + fn from(size: Size) -> Self { Self { width: size, height: size, @@ -126,71 +126,6 @@ impl From for UiSize2d { } } -//TODO?: add `UiSize2d` from `(Into, Into)` or Into conversion - -/// Constructs a `UiSize` or `UiSize2d` from a literal or expression -/// -/// # Syntax: -/// - `auto` - `UiSize::Auto` -/// - `x` - `UiSize::Static(x)` -/// - `x%` - `UiSize::Fraction(x / 100.)` *(literal only)* -/// - `x/` - `UiSize::Fraction(x)` -/// -/// ...where `x` is a literal, identifier or an expression wrapped in parentheses -/// -/// # Note: -/// - If a single argument is provided, it creates a `UiSize` using the rules specified above\ -/// - If two arguments are provided, it creates a `UiSize2d` with the first value as width and the second as height\ -/// Example: `size!(100, 50%)` creates a `UiSize2d` with width `100` (`UiSize::Static(100.)`) and height `50%` (`UiSize::Fraction(0.5)`) -/// - `%` syntax is only valid for literals (`50%`), not expressions or identidiers.\ -/// Use `/` instead (`(0.5 * x)/`, `x/`), but be aware of the different range (0.0-1.0) \ -/// - Expressions must be wrapped in parentheses (for example: `(x + 5)`).\ -/// This does not apply to single identifiers (`x`) or literals (`5`) -#[macro_export] -macro_rules! size { - (auto) => { - $crate::layout::UiSize::Auto - }; - - ($x:literal) => { - $crate::layout::UiSize::Static($x as f32) - }; - ($x:literal %) => { - $crate::layout::UiSize::Fraction($x as f32 / 100.) - }; - ($x:literal /) => { - $crate::layout::UiSize::Fraction($x as f32) - }; - - ($x:ident) => { - $crate::layout::UiSize::Static($x as f32) - }; - ($x:ident /) => { - $crate::layout::UiSize::Fraction($x as f32) - }; - - (($x:expr)) => { - $crate::layout::UiSize::Static(($x) as f32) - }; - (($x:expr) /) => { - $crate::layout::UiSize::Fraction(($x) as f32) - }; - - ($x:tt , $y:tt $($ys:tt)?) => { - $crate::layout::UiSize2d { - width: $crate::layout::size!($x), - height: $crate::layout::size!($y $($ys)?), - } - }; - ($x:tt $($xs:tt)? , $y:tt $($ys:tt)?) => { - $crate::layout::UiSize2d { - width: $crate::layout::size!($x $($xs)?), - height: $crate::layout::size!($y $($ys)?), - } - }; -} -pub use size; - /// Represents the direction of the layout\ /// (for example, the direction of a container's children)\ /// diff --git a/hui/src/lib.rs b/hui/src/lib.rs index 0a9d0ba..c112928 100644 --- a/hui/src/lib.rs +++ b/hui/src/lib.rs @@ -10,6 +10,7 @@ #![forbid(unsafe_op_in_unsafe_fn)] mod instance; +mod macros; pub mod layout; pub mod rectangle; pub mod background; diff --git a/hui/src/macros.rs b/hui/src/macros.rs new file mode 100644 index 0000000..53b0366 --- /dev/null +++ b/hui/src/macros.rs @@ -0,0 +1,62 @@ + +/// Constructs a `Size` or `Size2d` from a literal or expression +/// +/// # Syntax: +/// - `auto` - `Size::Auto` +/// - `x` - `Size::Static(x)` +/// - `x%` - `Size::Fraction(x / 100.)` *(literal only)* +/// - `x/` - `Size::Fraction(x)` +/// +/// ...where `x` is a literal, identifier or an expression wrapped in parentheses +/// +/// # Note: +/// - If a single argument is provided, it creates a `Size` using the rules specified above\ +/// - If two arguments are provided, it creates a `Size2d` with the first value as width and the second as height\ +/// Example: `size!(100, 50%)` creates a `Size2d` with width `100` (`Size::Static(100.)`) and height `50%` (`Size::Fraction(0.5)`) +/// - `%` syntax is only valid for literals (`50%`), not expressions or identidiers.\ +/// Use `/` instead (`(0.5 * x)/`, `x/`), but be aware of the different range (0.0-1.0) \ +/// - Expressions must be wrapped in parentheses (for example: `(x + 5)`).\ +/// This does not apply to single identifiers (`x`) or literals (`5`) +#[macro_export] +macro_rules! size { + (auto) => { + $crate::layout::Size::Auto + }; + + ($x:literal) => { + $crate::layout::Size::Static($x as f32) + }; + ($x:literal %) => { + $crate::layout::Size::Fraction($x as f32 / 100.) + }; + ($x:literal /) => { + $crate::layout::Size::Fraction($x as f32) + }; + + ($x:ident) => { + $crate::layout::Size::Static($x as f32) + }; + ($x:ident /) => { + $crate::layout::Size::Fraction($x as f32) + }; + + (($x:expr)) => { + $crate::layout::Size::Static(($x) as f32) + }; + (($x:expr) /) => { + $crate::layout::Size::Fraction(($x) as f32) + }; + + ($x:tt , $y:tt $($ys:tt)?) => { + $crate::layout::Size2d { + width: $crate::size!($x), + height: $crate::size!($y $($ys)?), + } + }; + ($x:tt $($xs:tt)? , $y:tt $($ys:tt)?) => { + $crate::layout::Size2d { + width: $crate::size!($x $($xs)?), + height: $crate::size!($y $($ys)?), + } + }; +} diff --git a/hui/src/measure.rs b/hui/src/measure.rs index 237bb59..ebff258 100644 --- a/hui/src/measure.rs +++ b/hui/src/measure.rs @@ -1,3 +1,5 @@ +//! element measurement, hints and responses + use glam::Vec2; #[derive(Default)] diff --git a/hui/src/state.rs b/hui/src/state.rs index 1f7b9c5..446b083 100644 --- a/hui/src/state.rs +++ b/hui/src/state.rs @@ -1,3 +1,5 @@ +//! state managment for stateful elements + use hashbrown::{HashMap, HashSet}; use nohash_hasher::BuildNoHashHasher; use std::any::Any; diff --git a/hui/src/text.rs b/hui/src/text.rs index d5ac06e..3855013 100644 --- a/hui/src/text.rs +++ b/hui/src/text.rs @@ -1,3 +1,5 @@ +//! text rendering, styling, measuring + use std::sync::Arc; mod font;