ferroui_base/styling/
container.rs1use super::{ContainerSizing, VisualQueryProvider};
2use crate::layout::Layoutable;
3use crate::{ferro_property, AttachedProperty, FerroObject, FerroProperty, StyledPropertyOptions};
4
5pub struct Container;
8
9crate::ferro_static_type!(Container);
10
11crate::ferro_properties! { impl Container {
12 ferro_property!(
13 pub fn name_property() -> AttachedProperty<Option<String>> {
15 FerroProperty::register_attached::<Container, Layoutable, _>("Name", None)
16 }
17 );
18
19 ferro_property!(
20 pub fn sizing_property() -> AttachedProperty<ContainerSizing> {
22 FerroProperty::register_attached_with::<Container, Layoutable, _>(
23 "Sizing",
24 StyledPropertyOptions::new(ContainerSizing::Normal).coerce(Container::update_query_provider),
25 )
26 }
27 );
28
29 ferro_property!(
30 pub(crate) fn query_provider_property() -> AttachedProperty<Option<VisualQueryProvider>> {
32 FerroProperty::register_attached::<Container, Layoutable, _>("QueryProvider", None)
33 }
34 );
35} }
36
37impl Container {
38 fn update_query_provider(obj: &FerroObject, sizing: ContainerSizing) -> ContainerSizing {
39 if let Some(layoutable) = obj.downcast_ref::<Layoutable>() {
40 if sizing != ContainerSizing::Normal {
41 if Self::get_query_provider(layoutable).is_none() {
42 layoutable.set_value(Self::query_provider_property(), Some(VisualQueryProvider::new()));
43 }
44 } else {
45 layoutable.set_value(Self::query_provider_property(), None);
46 }
47 }
48
49 sizing
50 }
51
52 pub fn get_name(layoutable: &Layoutable) -> Option<String> {
54 layoutable.get_value(Self::name_property())
55 }
56
57 pub fn set_name(layoutable: &Layoutable, name: Option<String>) {
59 layoutable.set_value(Self::name_property(), name);
60 }
61
62 pub fn get_sizing(layoutable: &Layoutable) -> ContainerSizing {
64 layoutable.get_value(Self::sizing_property())
65 }
66
67 pub fn set_sizing(layoutable: &Layoutable, sizing: ContainerSizing) {
69 layoutable.set_value(Self::sizing_property(), sizing);
70 }
71
72 pub(crate) fn get_query_provider(layoutable: &Layoutable) -> Option<VisualQueryProvider> {
74 layoutable.get_value(Self::query_provider_property())
75 }
76
77 pub fn set_query_provider_size(layoutable: &Layoutable, width: f64, height: f64, sizing: ContainerSizing) {
81 if let Some(query_provider) = Self::get_query_provider(layoutable) {
82 query_provider.set_size(width, height, sizing);
83 }
84 }
85}