1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use crate::theme::{ThemeColor, ThemeProps, ThemedImageMaterial, ThemedWidgetProps};
use raui_core::prelude::*;
use serde::{Deserialize, Serialize};

#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct SwitchPaperProps {
    #[serde(default)]
    pub on: bool,
    #[serde(default)]
    pub variant: String,
    #[serde(default)]
    pub size_level: usize,
}
implement_props_data!(SwitchPaperProps, "SwitchPaperProps");

widget_component! {
    pub switch_paper(key, props, shared_props) {
        let SwitchPaperProps { on, variant, size_level } = props.read_cloned_or_default();
        let themed_props = props.read_cloned_or_default::<ThemedWidgetProps>();
        let color = match shared_props.read::<ThemeProps>() {
            Ok(props) => match themed_props.color {
                ThemeColor::Default => props.active_colors.main.default.main,
                ThemeColor::Primary => props.active_colors.main.primary.main,
                ThemeColor::Secondary => props.active_colors.main.secondary.main,
            },
            Err(_) => Default::default(),
        };
        let (size, material) = match shared_props.read::<ThemeProps>() {
            Ok(props) => {
                let size = props.icons_level_sizes.get(size_level).copied().unwrap_or(24.0);
                let material = if let Some(material) = props.switch_variants.get(&variant) {
                    if on {
                        material.on.clone()
                    } else {
                        material.off.clone()
                    }
                } else {
                    Default::default()
                };
                (size, material)
            }
            Err(_) => (24.0, Default::default()),
        };
        let image = match material {
            ThemedImageMaterial::Color => ImageBoxProps {
                material: ImageBoxMaterial::Color(ImageBoxColor {
                    color,
                    scaling: if on {
                        ImageBoxImageScaling::Stretch
                    } else {
                        ImageBoxImageScaling::Frame((size_level as Scalar, true).into())
                    },
                }),
                width: ImageBoxSizeValue::Exact(size),
                height: ImageBoxSizeValue::Exact(size),
                ..Default::default()
            },
            ThemedImageMaterial::Image(mut data) => {
                data.tint = color;
                ImageBoxProps {
                    material: ImageBoxMaterial::Image(data),
                    width: ImageBoxSizeValue::Exact(size),
                    height: ImageBoxSizeValue::Exact(size),
                    ..Default::default()
                }
            },
            ThemedImageMaterial::Procedural(data) => ImageBoxProps {
                material: ImageBoxMaterial::Procedural(data),
                width: ImageBoxSizeValue::Exact(size),
                height: ImageBoxSizeValue::Exact(size),
                ..Default::default()
            },
        };
        widget! {
            (#{key} image_box: {image})
        }
    }
}