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