raui_material/component/
text_paper.rs

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