raui_material/component/
text_paper.rs

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::theme::{ThemeColor, ThemeProps, ThemedTextMaterial, ThemedWidgetProps};
use raui_core::prelude::*;
use serde::{Deserialize, Serialize};

#[derive(PropsData, Debug, Default, Clone, Serialize, Deserialize)]
#[props_data(raui_core::props::PropsData)]
#[prefab(raui_core::Prefab)]
pub struct TextPaperProps {
    #[serde(default)]
    pub text: String,
    #[serde(default)]
    pub width: TextBoxSizeValue,
    #[serde(default)]
    pub height: TextBoxSizeValue,
    #[serde(default)]
    pub variant: String,
    #[serde(default)]
    pub use_main_color: bool,
    #[serde(default)]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub horizontal_align_override: Option<TextBoxHorizontalAlign>,
    #[serde(default)]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub vertical_align_override: Option<TextBoxVerticalAlign>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub color_override: Option<Color>,
    #[serde(default)]
    pub transform: Transform,
}

pub fn text_paper(context: WidgetContext) -> WidgetNode {
    let WidgetContext {
        idref,
        key,
        props,
        shared_props,
        ..
    } = context;

    let TextPaperProps {
        text,
        width,
        height,
        variant,
        use_main_color,
        horizontal_align_override,
        vertical_align_override,
        color_override,
        transform,
    } = props.read_cloned_or_default();
    let themed_props = props.read_cloned_or_default::<ThemedWidgetProps>();
    let ThemedTextMaterial {
        mut horizontal_align,
        mut vertical_align,
        direction,
        font,
    } = match shared_props.read::<ThemeProps>() {
        Ok(props) => props
            .text_variants
            .get(&variant)
            .cloned()
            .unwrap_or_default(),
        Err(_) => Default::default(),
    };
    if let Some(horizontal_override) = horizontal_align_override {
        horizontal_align = horizontal_override;
    }
    if let Some(alignment_override) = vertical_align_override {
        vertical_align = alignment_override;
    }
    let color = if let Some(color_override) = color_override {
        color_override
    } else {
        match shared_props.read::<ThemeProps>() {
            Ok(props) => {
                if use_main_color {
                    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,
                    }
                } else {
                    match themed_props.color {
                        ThemeColor::Default => props.active_colors.contrast.default.main,
                        ThemeColor::Primary => props.active_colors.contrast.primary.main,
                        ThemeColor::Secondary => props.active_colors.contrast.secondary.main,
                    }
                }
            }
            Err(_) => Default::default(),
        }
    };
    let props = TextBoxProps {
        text,
        width,
        height,
        horizontal_align,
        vertical_align,
        direction,
        font,
        color,
        transform,
    };

    make_widget!(text_box)
        .key(key)
        .maybe_idref(idref.cloned())
        .with_props(props)
        .into()
}