From 89dcffdda7cd4c343ecfc658fc08301f2b8acc44 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Fri, 10 Nov 2023 13:26:44 -0800 Subject: [PATCH] Added theme visualizer example A very good test of the stack widget. --- examples/theme.rs | 163 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 examples/theme.rs diff --git a/examples/theme.rs b/examples/theme.rs new file mode 100644 index 0000000..29bcbb1 --- /dev/null +++ b/examples/theme.rs @@ -0,0 +1,163 @@ +use gooey::styles::components::TextColor; +use gooey::styles::{ColorTheme, FixedTheme, InverseTheme, SurfaceTheme, Theme, ThemePair}; +use gooey::widget::MakeWidget; +use gooey::widgets::label::LabelBackground; +use gooey::widgets::{Label, Stack}; +use gooey::Run; +use kludgine::Color; + +fn main() -> gooey::Result { + let default_theme = ThemePair::default(); + Stack::columns( + theme(default_theme.dark, "Dark") + .and(theme(default_theme.light, "Light")) + .and(fixed_themes( + default_theme.primary_fixed, + default_theme.secondary_fixed, + default_theme.tertiary_fixed, + )), + ) + .expand() + .run() +} + +fn fixed_themes( + primary: FixedTheme, + secondary: FixedTheme, + tertiary: FixedTheme, +) -> impl MakeWidget { + Stack::rows( + Label::new("Fixed") + .and(fixed_theme(primary, "Primary")) + .and(fixed_theme(secondary, "Secondary")) + .and(fixed_theme(tertiary, "Tertiary")), + ) + .expand() +} + +fn fixed_theme(theme: FixedTheme, label: &str) -> impl MakeWidget { + Stack::columns( + swatch(theme.color, &format!("{label} Fixed"), theme.on_color) + .and(swatch( + theme.dim_color, + &format!("Dim {label}"), + theme.on_color, + )) + .and(swatch( + theme.on_color, + &format!("On {label} Fixed"), + theme.color, + )) + .and(swatch( + theme.on_color_variant, + &format!("Variant On {label} Fixed"), + theme.color, + )), + ) + .expand() +} + +fn theme(theme: Theme, label: &str) -> impl MakeWidget { + Stack::rows( + Label::new(label) + .and( + Stack::columns( + color_theme(theme.primary, "Primary") + .and(color_theme(theme.secondary, "Secondary")) + .and(color_theme(theme.tertiary, "Tertiary")) + .and(color_theme(theme.error, "Error")), + ) + .expand(), + ) + .and(surface_and_inverse_themes(theme.surface, theme.inverse)), + ) + .expand() +} + +fn surface_and_inverse_themes(theme: SurfaceTheme, inverse: InverseTheme) -> impl MakeWidget { + Stack::rows( + Stack::columns( + swatch(theme.color, "Surface", theme.on_color) + .and(swatch(theme.dim_color, "Dim Surface", theme.on_color)) + .and(swatch(theme.bright_color, "Bright Surface", theme.on_color)), + ) + .expand() + .and(inverse_theme(inverse)) + .and( + Stack::columns( + swatch(theme.lowest_container, "Lowest Container", theme.on_color) + .and(swatch(theme.low_container, "Low Container", theme.on_color)) + .and(swatch(theme.container, "Container", theme.on_color)) + .and(swatch( + theme.high_container, + "High Container", + theme.on_color, + )) + .and(swatch( + theme.highest_container, + "Highest Container", + theme.on_color, + )), + ) + .expand(), + ) + .and( + Stack::columns( + swatch(theme.on_color, "On Surface", theme.color) + .and(swatch( + theme.on_color_variant, + "On Color Variant", + theme.color, + )) + .and(swatch(theme.outline, "Outline", theme.color)) + .and(swatch( + theme.outline_variant, + "Outline Variant", + theme.color, + )), + ) + .expand(), + ), + ) + .expand() +} + +fn inverse_theme(theme: InverseTheme) -> impl MakeWidget { + Stack::columns( + swatch(theme.surface, "Inverse Surface", theme.on_surface) + .and(swatch( + theme.on_surface, + "On Inverse Surface", + theme.surface, + )) + .and(swatch(theme.primary, "Inverse Primary", theme.surface)), + ) + .expand() +} + +fn color_theme(theme: ColorTheme, label: &str) -> impl MakeWidget { + Stack::rows( + swatch(theme.color, label, theme.on_color) + .and(swatch(theme.on_color, &format!("On {label}"), theme.color)) + .and(swatch( + theme.container, + &format!("{label} Container"), + theme.on_container, + )) + .and(swatch( + theme.on_container, + &format!("On {label} Container"), + theme.container, + )), + ) + .expand() +} + +fn swatch(background: Color, label: &str, text: Color) -> impl MakeWidget { + Label::new(label) + .fit_horizontally() + .fit_vertically() + .with(&TextColor, text) + .with(&LabelBackground, background) + .expand() +}