1use gen_analyzer::{value::Value, PropKey};
2use gen_utils::err_from_to;
3
4use crate::{
5 builtin::prop::{
6 GChooseType, Layout, LiveDependency, MouseCursor, Prop, TextWrap, Themes, Vec2, Walk, F32,
7 F64,
8 },
9 from_gen::MakepadColor,
10 from_gen_props, props_to_tokens,
11};
12
13#[derive(Debug, Clone)]
14pub enum Props {
15 Theme(Themes),
16 Color(MakepadColor),
17 TextHoverColor(MakepadColor),
18 TextFocusColor(MakepadColor),
19 FontSize(F64),
20 HeightFactor(F64),
21 Wrap(TextWrap),
22 FontFamily(LiveDependency),
23 TextVisible(bool),
24 Size(F32),
25 CheckboxBackgroundColor(MakepadColor),
26 CheckboxBackgroundVisible(bool),
27 CheckboxHoverColor(MakepadColor),
28 CheckboxSelectedColor(MakepadColor),
29 StrokeColor(MakepadColor),
30 StrokeHoverColor(MakepadColor),
31 StrokeSelectedColor(MakepadColor),
32 CheckboxBorderColor(MakepadColor),
33 CheckboxBorderWidth(F32),
34 Scale(F32),
35 BackgroundColor(MakepadColor),
36 HoverColor(MakepadColor),
37 FocusColor(MakepadColor),
38 ShadowColor(MakepadColor),
39 BorderColor(MakepadColor),
40 BackgroundVisible(bool),
41 BorderWidth(F32),
42 BorderRadius(F32),
43 SpreadRadius(F32),
44 BlurRadius(F32),
45 ShadowOffset(Vec2),
46 Cursor(MouseCursor),
47 Value(String),
48 Selected(bool),
49 Text(String),
50 CheckboxType(GChooseType),
51 Walk(Walk),
52 Layout(Layout),
53 Visible(bool),
54 AnimationKey(bool),
55 GrabKeyFocus(bool),
56 EventKey(bool),
57}
58
59from_gen_props!(Props);
60
61impl TryFrom<(PropKey, Value)> for Props {
62 type Error = gen_utils::error::Error;
63
64 fn try_from(value: (PropKey, Value)) -> Result<Self, Self::Error> {
65 match value.0.name.as_str() {
66 "theme" => Ok(Props::Theme(Themes::try_from(&value.1)?)),
67 "color" => Ok(Props::Color(MakepadColor::try_from((&value.1, None))?)),
68 "text_hover_color" => Ok(Props::TextHoverColor(MakepadColor::try_from((
69 &value.1, None,
70 ))?)),
71 "text_focus_color" => Ok(Props::TextFocusColor(MakepadColor::try_from((
72 &value.1, None,
73 ))?)),
74 "font_size" => Ok(Props::FontSize(value.1.as_f64()?.into())),
75 "height_factor" => Ok(Props::HeightFactor(value.1.as_f64()?.into())),
76 "wrap" => Ok(Props::Wrap(TextWrap::try_from(&value.1)?)),
77 "font_family" => Ok(Props::FontFamily(LiveDependency::try_from(&value.1)?)),
78 "text_visible" => Ok(Props::TextVisible(value.1.as_bool()?)),
79 "size" => Ok(Props::Size(value.1.as_f32()?.into())),
80 "checkbox_background_color" => Ok(Props::CheckboxBackgroundColor(
81 MakepadColor::try_from((&value.1, None))?,
82 )),
83 "checkbox_background_visible" => {
84 Ok(Props::CheckboxBackgroundVisible(value.1.as_bool()?))
85 }
86 "checkbox_hover_color" => Ok(Props::CheckboxHoverColor(MakepadColor::try_from((
87 &value.1, None,
88 ))?)),
89 "checkbox_selected_color" => Ok(Props::CheckboxSelectedColor(MakepadColor::try_from(
90 (&value.1, None),
91 )?)),
92 "stroke_color" => Ok(Props::StrokeColor(MakepadColor::try_from((
93 &value.1, None,
94 ))?)),
95 "stroke_hover_color" => Ok(Props::StrokeHoverColor(MakepadColor::try_from((
96 &value.1, None,
97 ))?)),
98 "stroke_selected_color" => Ok(Props::StrokeSelectedColor(MakepadColor::try_from((
99 &value.1, None,
100 ))?)),
101 "checkbox_border_color" => Ok(Props::CheckboxBorderColor(MakepadColor::try_from((
102 &value.1, None,
103 ))?)),
104 "checkbox_border_width" => Ok(Props::CheckboxBorderWidth(value.1.as_f32()?.into())),
105 "scale" => Ok(Props::Scale(value.1.as_f32()?.into())),
106 "background_color" => Ok(Props::BackgroundColor(MakepadColor::try_from((
107 &value.1, None,
108 ))?)),
109 "hover_color" => Ok(Props::HoverColor(MakepadColor::try_from((&value.1, None))?)),
110 "focus_color" => Ok(Props::FocusColor(MakepadColor::try_from((&value.1, None))?)),
111 "shadow_color" => Ok(Props::ShadowColor(MakepadColor::try_from((
112 &value.1, None,
113 ))?)),
114 "border_color" => Ok(Props::BorderColor(MakepadColor::try_from((
115 &value.1, None,
116 ))?)),
117 "background_visible" => Ok(Props::BackgroundVisible(value.1.as_bool()?)),
118 "border_width" => Ok(Props::BorderWidth(value.1.as_f32()?.into())),
119 "border_radius" => Ok(Props::BorderRadius(value.1.as_f32()?.into())),
120 "spread_radius" => Ok(Props::SpreadRadius(value.1.as_f32()?.into())),
121 "blur_radius" => Ok(Props::BlurRadius(value.1.as_f32()?.into())),
122 "shadow_offset" => Ok(Props::ShadowOffset(Vec2::try_from(&value.1)?)),
123 "cursor" => Ok(Props::Cursor(MouseCursor::try_from(&value.1)?)),
124 "value" => Ok(Props::Value(value.1.as_string()?)),
125 "selected" => Ok(Props::Selected(value.1.as_bool()?)),
126 "text" => Ok(Props::Text(value.1.as_string()?)),
127 "checkbox_type" => Ok(Props::CheckboxType(GChooseType::try_from(&value.1)?)),
128 "visible" => Ok(Props::Visible(value.1.as_bool()?)),
129 "animation_key" => Ok(Props::AnimationKey(value.1.as_bool()?)),
130 "grab_key_focus" => Ok(Props::GrabKeyFocus(value.1.as_bool()?)),
131 "event_key" => Ok(Props::EventKey(value.1.as_bool()?)),
132 _ => {
133 if let Ok(prop) = Walk::try_from(&value) {
134 return Ok(Props::Walk(prop));
135 } else if let Ok(prop) = Layout::try_from(&value) {
136 return Ok(Props::Layout(prop));
137 } else {
138 return Err(err_from_to!(
139 "GenUI Props" => &format!("Makepad GCheckbox Prop, Invalid Prop: {}", value.0.name)
140 ).to_runtime("Makepad Compiler"));
141 }
142 }
143 }
144 }
145}
146
147props_to_tokens! {
148 Props,
149 Props::Theme => theme, false,
150 Props::Color => color, false,
151 Props::TextHoverColor => text_hover_color, false,
152 Props::TextFocusColor => text_focus_color, false,
153 Props::FontSize => font_size, false,
154 Props::HeightFactor => height_factor, false,
155 Props::Wrap => wrap, false,
156 Props::FontFamily => font_family, false,
157 Props::TextVisible => text_visible, false,
158 Props::Size => size, false,
159 Props::CheckboxBackgroundColor => checkbox_background_color, false,
160 Props::CheckboxBackgroundVisible => checkbox_background_visible, false,
161 Props::CheckboxHoverColor => checkbox_hover_color, false,
162 Props::CheckboxSelectedColor => checkbox_selected_color, false,
163 Props::StrokeColor => stroke_color, false,
164 Props::StrokeHoverColor => stroke_hover_color, false,
165 Props::StrokeSelectedColor => stroke_selected_color, false,
166 Props::CheckboxBorderColor => checkbox_border_color, false,
167 Props::CheckboxBorderWidth => checkbox_border_width, false,
168 Props::Scale => scale, false,
169 Props::BackgroundColor => background_color, false,
170 Props::HoverColor => hover_color, false,
171 Props::FocusColor => focus_color, false,
172 Props::ShadowColor => shadow_color, false,
173 Props::BorderColor => border_color, false,
174 Props::BackgroundVisible => background_visible, false,
175 Props::BorderWidth => border_width, false,
176 Props::BorderRadius => border_radius, false,
177 Props::SpreadRadius => spread_radius, false,
178 Props::BlurRadius => blur_radius, false,
179 Props::ShadowOffset => shadow_offset, false,
180 Props::Cursor => cursor, false,
181 Props::Value => value, false,
182 Props::Selected => selected, false,
183 Props::Text => text, false,
184 Props::CheckboxType => checkbox_type, false,
185 Props::Walk => walk, true,
186 Props::Layout => layout, true,
187 Props::Visible => visible, false,
188 Props::AnimationKey => animation_key, false,
189 Props::GrabKeyFocus => grab_key_focus, false,
190 Props::EventKey => event_key, false
191}