raui_material/component/
text_paper.rs1use 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}