Skip to main content

zest_theme/
convert.rs

1//! Convert themes defined in [`Rgb888`] to any target [`PixelColor`].
2//!
3//! All preset themes are defined as `Theme<'static, Rgb888>` constants in
4//! [`crate::theme`]. Users on a different color depth (typically `Rgb565`
5//! for embedded touchscreens) call [`convert_theme`] to get a theme in
6//! their target color.
7
8use crate::{Component, Container, Palette, Theme};
9use embedded_graphics::pixelcolor::{PixelColor, Rgb888};
10
11/// Convert a [`Theme<'a, Rgb888>`] to `Theme<'a, C>` for any `C: From<Rgb888>`.
12#[must_use]
13pub fn convert_theme<'a, C>(src: &Theme<'a, Rgb888>) -> Theme<'a, C>
14where
15    C: PixelColor + From<Rgb888>,
16{
17    Theme {
18        background: convert_container(src.background),
19        primary: convert_container(src.primary),
20        secondary: convert_container(src.secondary),
21        accent: convert_component(src.accent),
22        button: convert_component(src.button),
23        destructive: convert_component(src.destructive),
24        success: convert_component(src.success),
25        warning: convert_component(src.warning),
26        text_button: convert_component(src.text_button),
27        icon_button: convert_component(src.icon_button),
28        palette: convert_palette(src.palette),
29        spacing: src.spacing,
30        corner_radii: src.corner_radii,
31        typography: src.typography,
32        is_dark: src.is_dark,
33        is_high_contrast: src.is_high_contrast,
34    }
35}
36
37fn convert_container<C: From<Rgb888>>(c: Container<Rgb888>) -> Container<C>
38where
39    C: PixelColor,
40{
41    Container {
42        base: c.base.into(),
43        on_base: c.on_base.into(),
44        divider: c.divider.into(),
45    }
46}
47
48fn convert_component<C: From<Rgb888>>(c: Component<Rgb888>) -> Component<C>
49where
50    C: PixelColor,
51{
52    Component {
53        base: c.base.into(),
54        pressed: c.pressed.into(),
55        disabled: c.disabled.into(),
56        on_base: c.on_base.into(),
57        border: c.border.into(),
58    }
59}
60
61fn convert_palette<C: From<Rgb888>>(p: Palette<Rgb888>) -> Palette<C>
62where
63    C: PixelColor,
64{
65    Palette {
66        neutral_0: p.neutral_0.into(),
67        neutral_2: p.neutral_2.into(),
68        neutral_4: p.neutral_4.into(),
69        neutral_5: p.neutral_5.into(),
70        neutral_6: p.neutral_6.into(),
71        neutral_8: p.neutral_8.into(),
72        neutral_10: p.neutral_10.into(),
73        accent_blue: p.accent_blue.into(),
74        accent_green: p.accent_green.into(),
75        accent_red: p.accent_red.into(),
76        accent_yellow: p.accent_yellow.into(),
77        black: p.black.into(),
78        white: p.white.into(),
79    }
80}