ferroui_controls/markup_types/
values.rs1use crate::{
6 AcrylicPlatformCompensationLevels, GridLength, GridUnitType, TextLayoutRoundingPlacement, TickList,
7 WindowTransparencyLevel, WindowTransparencyLevelCollection,
8};
9use ferroui_base::data::core::ValueTypes;
10use ferroui_base::ferro_markup_type;
11use ferroui_base::media::MediaCollection;
12use ferroui_base::metadata::{MarkupType, MarkupTyped};
13
14ferro_markup_type!(struct GridLength {
15 namespace: "FerroUI.Controls",
16 handles: [GridLength],
17 parse: GridLength::parse,
18 constructors: [
19 () => GridLength::default,
20 (f64) => GridLength::from_pixels,
21 (f64, GridUnitType) => GridLength::new,
22 ],
23 static_properties: [
24 Auto: GridLength { get: GridLength::auto },
25 Star: GridLength { get: GridLength::star },
26 ],
27 properties: [
28 Value: f64 { get: |g: &GridLength| g.value() },
29 GridUnitType: GridUnitType { get: |g: &GridLength| g.grid_unit_type() },
30 IsAbsolute: bool { get: |g: &GridLength| g.is_absolute() },
31 IsAuto: bool { get: |g: &GridLength| g.is_auto() },
32 IsStar: bool { get: |g: &GridLength| g.is_star() },
33 ],
34});
35
36fn parse_transparency_level(s: &str) -> Result<WindowTransparencyLevel, String> {
39 match s.trim() {
40 "None" => Ok(WindowTransparencyLevel::none()),
41 "Transparent" => Ok(WindowTransparencyLevel::transparent()),
42 "Blur" => Ok(WindowTransparencyLevel::blur()),
43 "AcrylicBlur" => Ok(WindowTransparencyLevel::acrylic_blur()),
44 "Mica" => Ok(WindowTransparencyLevel::mica()),
45 other => Err(format!("Unable to parse \"{other}\" as a window transparency level.")),
46 }
47}
48
49fn parse_transparency_levels(s: &str) -> Result<WindowTransparencyLevelCollection, String> {
51 let levels: Result<Vec<_>, _> = s.split(',').filter(|part| !part.trim().is_empty()).map(parse_transparency_level).collect();
52 levels.map(WindowTransparencyLevelCollection::new)
53}
54
55ferro_markup_type!(class WindowTransparencyLevelCollection {
56 namespace: "FerroUI.Controls",
57 handles: [WindowTransparencyLevelCollection, Option<WindowTransparencyLevelCollection>],
58 parse: parse_transparency_levels,
59});
60
61ferro_markup_type!(struct WindowTransparencyLevel {
62 namespace: "FerroUI.Controls",
63 handles: [WindowTransparencyLevel],
64 parse: parse_transparency_level,
65 static_properties: [
66 None: WindowTransparencyLevel { get: WindowTransparencyLevel::none },
67 Transparent: WindowTransparencyLevel { get: WindowTransparencyLevel::transparent },
68 Blur: WindowTransparencyLevel { get: WindowTransparencyLevel::blur },
69 AcrylicBlur: WindowTransparencyLevel { get: WindowTransparencyLevel::acrylic_blur },
70 Mica: WindowTransparencyLevel { get: WindowTransparencyLevel::mica },
71 ],
72 constructors: [() => WindowTransparencyLevel::none],
73});
74
75ferro_markup_type!(struct AcrylicPlatformCompensationLevels {
76 namespace: "FerroUI.Controls",
77 handles: [AcrylicPlatformCompensationLevels],
78 constructors: [() => AcrylicPlatformCompensationLevels::default, (f64, f64, f64) => AcrylicPlatformCompensationLevels::new],
79});
80
81ferro_markup_type!(class TickList {
85 namespace: "FerroUI.Controls",
86 handles: [TickList, Option<TickList>],
87 base: MediaCollection<f64>,
88 constructors: [() => TickList::new],
89});
90
91pub(super) const TYPES: &[&MarkupType] = &[
93 <GridLength as MarkupTyped>::MARKUP,
94 <WindowTransparencyLevel as MarkupTyped>::MARKUP,
95 <WindowTransparencyLevelCollection as MarkupTyped>::MARKUP,
96 <AcrylicPlatformCompensationLevels as MarkupTyped>::MARKUP,
97 <TickList as MarkupTyped>::MARKUP,
98 <TextLayoutRoundingPlacement as MarkupTyped>::MARKUP,
100];
101
102pub(super) fn register_value_types() {
105 ValueTypes::register_nullable::<GridLength>();
106 ValueTypes::register_nullable::<WindowTransparencyLevel>();
107 ValueTypes::register_nullable::<WindowTransparencyLevelCollection>();
108 ValueTypes::register_nullable::<AcrylicPlatformCompensationLevels>();
109 ValueTypes::register_nullable::<TickList>();
110 ValueTypes::register_nullable::<TextLayoutRoundingPlacement>();
111 ValueTypes::register_cast::<TickList, MediaCollection<f64>>(|ticks| MediaCollection::from_list(ticks.list().clone()));
114 ValueTypes::register_display::<GridLength>();
116 ValueTypes::register_display::<WindowTransparencyLevel>();
117}