cushy

Macro define_components

source
macro_rules! define_components {
    ($($widget:ident { $($(#$doc:tt)* $component:ident($type:ty, $name:expr $(, $($default:tt)*)?))* })*) => { ... };
    ($type:ty, . $($path:tt)*) => { ... };
    ($type:ty, |$context:ident| $($expr:tt)*) => { ... };
    ($type:ty, @$path:path) => { ... };
    ($type:ty, contrasting!($bg:ident, $($fg:ident),+ $(,)?)) => { ... };
    ($type:ty, ) => { ... };
    ($type:ty, $($expr:tt)+) => { ... };
    (default $component:ident $type:ty, . $($path:tt)*) => { ... };
    (default $component:ident $type:ty, |$context:ident| $($expr:tt)*) => { ... };
    (default $component:ident $type:ty, @$path:path) => { ... };
    (default $component:ident $type:ty, contrasting!($bg:ident, $($fg:ident),+ $(,)?)) => { ... };
    (default $component:ident $type:ty, ) => { ... };
    (default $component:ident $type:ty, $($expr:tt)+) => { ... };
}
Expand description

Defines a set of style components for Cushy.

These macros implement NamedComponent and ComponentDefinition for each entry defined. The syntax is:

use cushy::define_components;
use cushy::styles::Dimension;
use cushy::styles::components::{SurfaceColor, TextColor};
use cushy::kludgine::Color;
use cushy::figures::Zero;

define_components! {
    GroupName {
        /// This is the documentation for example component. It has a default value of `Dimension::ZERO`.
        ExampleComponent(Dimension, "example_component", Dimension::ZERO)
        /// This component whose default value is a color from the current theme.
        ThemedComponent(Color, "themed_component", .primary.color)
        /// This component is a color whose default value is the currently defined `TextColor`.
        DependentComponent(Color, "dependent_component", @TextColor)
        /// This component defaults to picking a contrasting color between `TextColor` and `SurfaceColor`
        ContrastingColor(Color, "contrasting_color", contrasting!(ThemedComponent, TextColor, SurfaceColor))
        /// This component shows how to use a closure for nearly infinite flexibility in computing the default value.
        ClosureDefaultComponent(Color, "closure_component", |context| context.get(&TextColor))
    }
}