raui_material/component/
text_paper.rs

1use crate::theme::{ThemeColor, ThemeProps, ThemedTextMaterial, ThemedWidgetProps};
2use raui_core::prelude::*;
3use serde::{Deserialize, Serialize};
4
5#[derive(PropsData, Debug, Default, Clone, Serialize, Deserialize)]
6#[props_data(raui_core::props::PropsData)]
7#[prefab(raui_core::Prefab)]
8pub struct TextPaperProps {
9    #[serde(default)]
10    pub text: String,
11    #[serde(default)]
12    pub width: TextBoxSizeValue,
13    #[serde(default)]
14    pub height: TextBoxSizeValue,
15    #[serde(default)]
16    pub variant: String,
17    #[serde(default)]
18    pub use_main_color: bool,
19    #[serde(default)]
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub horizontal_align_override: Option<TextBoxHorizontalAlign>,
22    #[serde(default)]
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub vertical_align_override: Option<TextBoxVerticalAlign>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub color_override: Option<Color>,
27    #[serde(default)]
28    pub transform: Transform,
29}
30
31pub fn text_paper(context: WidgetContext) -> WidgetNode {
32    let WidgetContext {
33        idref,
34        key,
35        props,
36        shared_props,
37        ..
38    } = context;
39
40    let TextPaperProps {
41        text,
42        width,
43        height,
44        variant,
45        use_main_color,
46        horizontal_align_override,
47        vertical_align_override,
48        color_override,
49        transform,
50    } = props.read_cloned_or_default();
51    let themed_props = props.read_cloned_or_default::<ThemedWidgetProps>();
52    let ThemedTextMaterial {
53        mut horizontal_align,
54        mut vertical_align,
55        direction,
56        font,
57    } = match shared_props.read::<ThemeProps>() {
58        Ok(props) => props
59            .text_variants
60            .get(&variant)
61            .cloned()
62            .unwrap_or_default(),
63        Err(_) => Default::default(),
64    };
65    if let Some(horizontal_override) = horizontal_align_override {
66        horizontal_align = horizontal_override;
67    }
68    if let Some(alignment_override) = vertical_align_override {
69        vertical_align = alignment_override;
70    }
71    let color = if let Some(color_override) = color_override {
72        color_override
73    } else {
74        match shared_props.read::<ThemeProps>() {
75            Ok(props) => {
76                if use_main_color {
77                    match themed_props.color {
78                        ThemeColor::Default => props.active_colors.main.default.main,
79                        ThemeColor::Primary => props.active_colors.main.primary.main,
80                        ThemeColor::Secondary => props.active_colors.main.secondary.main,
81                    }
82                } else {
83                    match themed_props.color {
84                        ThemeColor::Default => props.active_colors.contrast.default.main,
85                        ThemeColor::Primary => props.active_colors.contrast.primary.main,
86                        ThemeColor::Secondary => props.active_colors.contrast.secondary.main,
87                    }
88                }
89            }
90            Err(_) => Default::default(),
91        }
92    };
93    let props = TextBoxProps {
94        text,
95        width,
96        height,
97        horizontal_align,
98        vertical_align,
99        direction,
100        font,
101        color,
102        transform,
103    };
104
105    make_widget!(text_box)
106        .key(key)
107        .maybe_idref(idref.cloned())
108        .with_props(props)
109        .into()
110}