ferroui_controls/markup_types/
values.rs1use crate::{
6 AcrylicPlatformCompensationLevels, AutoSuggestBoxQuerySubmittedEventArgs,
7 AutoSuggestBoxSuggestionChosenEventArgs, AutoSuggestBoxTextChangedEventArgs, AutoSuggestionBoxTextChangeReason,
8 GridLength, GridUnitType, InfoBarCloseReason, InfoBarClosedEventArgs, InfoBarClosingEventArgs,
9 InfoBarOpenedEventArgs, InfoBarSeverity, NumberBoxSpinButtonPlacementMode, NumberBoxValidationMode,
10 NumberBoxValueChangedEventArgs, Symbol, TextLayoutRoundingPlacement, TickList, WindowTransparencyLevel,
11 WindowTransparencyLevelCollection,
12};
13use ferroui_base::data::core::ValueTypes;
14use ferroui_base::ferro_markup_type;
15use ferroui_base::media::MediaCollection;
16use ferroui_base::metadata::{MarkupType, MarkupTyped};
17
18ferro_markup_type!(struct GridLength {
19 namespace: "FerroUI.Controls",
20 handles: [GridLength],
21 parse: GridLength::parse,
22 constructors: [
23 () => GridLength::default,
24 (f64) => GridLength::from_pixels,
25 (f64, GridUnitType) => GridLength::new,
26 ],
27 static_properties: [
28 Auto: GridLength { get: GridLength::auto },
29 Star: GridLength { get: GridLength::star },
30 ],
31 properties: [
32 Value: f64 { get: |g: &GridLength| g.value() },
33 GridUnitType: GridUnitType { get: |g: &GridLength| g.grid_unit_type() },
34 IsAbsolute: bool { get: |g: &GridLength| g.is_absolute() },
35 IsAuto: bool { get: |g: &GridLength| g.is_auto() },
36 IsStar: bool { get: |g: &GridLength| g.is_star() },
37 ],
38});
39
40fn parse_transparency_level(s: &str) -> Result<WindowTransparencyLevel, String> {
43 match s.trim() {
44 "None" => Ok(WindowTransparencyLevel::none()),
45 "Transparent" => Ok(WindowTransparencyLevel::transparent()),
46 "Blur" => Ok(WindowTransparencyLevel::blur()),
47 "AcrylicBlur" => Ok(WindowTransparencyLevel::acrylic_blur()),
48 "Mica" => Ok(WindowTransparencyLevel::mica()),
49 other => Err(format!("Unable to parse \"{other}\" as a window transparency level.")),
50 }
51}
52
53fn parse_transparency_levels(s: &str) -> Result<WindowTransparencyLevelCollection, String> {
55 let levels: Result<Vec<_>, _> = s.split(',').filter(|part| !part.trim().is_empty()).map(parse_transparency_level).collect();
56 levels.map(WindowTransparencyLevelCollection::new)
57}
58
59ferro_markup_type!(class WindowTransparencyLevelCollection {
60 namespace: "FerroUI.Controls",
61 handles: [WindowTransparencyLevelCollection, Option<WindowTransparencyLevelCollection>],
62 parse: parse_transparency_levels,
63});
64
65ferro_markup_type!(struct WindowTransparencyLevel {
66 namespace: "FerroUI.Controls",
67 handles: [WindowTransparencyLevel],
68 parse: parse_transparency_level,
69 static_properties: [
70 None: WindowTransparencyLevel { get: WindowTransparencyLevel::none },
71 Transparent: WindowTransparencyLevel { get: WindowTransparencyLevel::transparent },
72 Blur: WindowTransparencyLevel { get: WindowTransparencyLevel::blur },
73 AcrylicBlur: WindowTransparencyLevel { get: WindowTransparencyLevel::acrylic_blur },
74 Mica: WindowTransparencyLevel { get: WindowTransparencyLevel::mica },
75 ],
76 constructors: [() => WindowTransparencyLevel::none],
77});
78
79ferro_markup_type!(struct AcrylicPlatformCompensationLevels {
80 namespace: "FerroUI.Controls",
81 handles: [AcrylicPlatformCompensationLevels],
82 constructors: [() => AcrylicPlatformCompensationLevels::default, (f64, f64, f64) => AcrylicPlatformCompensationLevels::new],
83});
84
85ferro_markup_type!(class TickList {
89 namespace: "FerroUI.Controls",
90 handles: [TickList, Option<TickList>],
91 base: MediaCollection<f64>,
92 constructors: [() => TickList::new],
93});
94
95pub(super) const TYPES: &[&MarkupType] = &[
97 <GridLength as MarkupTyped>::MARKUP,
98 <WindowTransparencyLevel as MarkupTyped>::MARKUP,
99 <WindowTransparencyLevelCollection as MarkupTyped>::MARKUP,
100 <AcrylicPlatformCompensationLevels as MarkupTyped>::MARKUP,
101 <TickList as MarkupTyped>::MARKUP,
102 <TextLayoutRoundingPlacement as MarkupTyped>::MARKUP,
104 <Symbol as MarkupTyped>::MARKUP,
106 <InfoBarSeverity as MarkupTyped>::MARKUP,
108 <InfoBarCloseReason as MarkupTyped>::MARKUP,
109 <InfoBarClosingEventArgs as MarkupTyped>::MARKUP,
110 <InfoBarClosedEventArgs as MarkupTyped>::MARKUP,
111 <InfoBarOpenedEventArgs as MarkupTyped>::MARKUP,
112 <NumberBoxSpinButtonPlacementMode as MarkupTyped>::MARKUP,
114 <NumberBoxValidationMode as MarkupTyped>::MARKUP,
115 <NumberBoxValueChangedEventArgs as MarkupTyped>::MARKUP,
116 <AutoSuggestionBoxTextChangeReason as MarkupTyped>::MARKUP,
117 <AutoSuggestBoxTextChangedEventArgs as MarkupTyped>::MARKUP,
118 <AutoSuggestBoxSuggestionChosenEventArgs as MarkupTyped>::MARKUP,
119 <AutoSuggestBoxQuerySubmittedEventArgs as MarkupTyped>::MARKUP,
120 <crate::media::ApplicationTheme as MarkupTyped>::MARKUP,
122 <crate::media::RevealBrushState as MarkupTyped>::MARKUP,
123 <crate::media::FocusVisualKind as MarkupTyped>::MARKUP,
124 <crate::ZoomMode as MarkupTyped>::MARKUP,
126];
127
128pub(super) fn register_value_types() {
131 ValueTypes::register_nullable::<GridLength>();
132 ValueTypes::register_nullable::<WindowTransparencyLevel>();
133 ValueTypes::register_nullable::<WindowTransparencyLevelCollection>();
134 ValueTypes::register_nullable::<AcrylicPlatformCompensationLevels>();
135 ValueTypes::register_nullable::<TickList>();
136 ValueTypes::register_nullable::<TextLayoutRoundingPlacement>();
137 ValueTypes::register_nullable::<Symbol>();
138 ValueTypes::register_nullable::<InfoBarSeverity>();
139 ValueTypes::register_nullable::<crate::ZoomMode>();
140 ValueTypes::register_nullable::<InfoBarCloseReason>();
141 ValueTypes::register_nullable::<NumberBoxSpinButtonPlacementMode>();
142 ValueTypes::register_nullable::<NumberBoxValidationMode>();
143 ValueTypes::register_nullable::<AutoSuggestionBoxTextChangeReason>();
144 crate::navigation::register_value_types();
145 crate::navigation_view_events::register_value_types();
146 ValueTypes::register_nullable::<crate::media::ApplicationTheme>();
147 ValueTypes::register_nullable::<crate::media::RevealBrushState>();
148 ValueTypes::register_nullable::<crate::media::FocusVisualKind>();
149 ValueTypes::register_cast::<TickList, MediaCollection<f64>>(|ticks| MediaCollection::from_list(ticks.list().clone()));
152 ValueTypes::register_display::<GridLength>();
154 ValueTypes::register_display::<WindowTransparencyLevel>();
155}