use super::{ContainerSizing, VisualQueryProvider};
use crate::layout::Layoutable;
use crate::{ferro_property, AttachedProperty, FerroObject, FerroProperty, StyledPropertyOptions};
pub struct Container;
crate::ferro_static_type!(Container);
crate::ferro_properties! { impl Container {
ferro_property!(
pub fn name_property() -> AttachedProperty<Option<String>> {
FerroProperty::register_attached::<Container, Layoutable, _>("Name", None)
}
);
ferro_property!(
pub fn sizing_property() -> AttachedProperty<ContainerSizing> {
FerroProperty::register_attached_with::<Container, Layoutable, _>(
"Sizing",
StyledPropertyOptions::new(ContainerSizing::Normal).coerce(Container::update_query_provider),
)
}
);
ferro_property!(
pub(crate) fn query_provider_property() -> AttachedProperty<Option<VisualQueryProvider>> {
FerroProperty::register_attached::<Container, Layoutable, _>("QueryProvider", None)
}
);
} }
impl Container {
fn update_query_provider(obj: &FerroObject, sizing: ContainerSizing) -> ContainerSizing {
if let Some(layoutable) = obj.downcast_ref::<Layoutable>() {
if sizing != ContainerSizing::Normal {
if Self::get_query_provider(layoutable).is_none() {
layoutable.set_value(Self::query_provider_property(), Some(VisualQueryProvider::new()));
}
} else {
layoutable.set_value(Self::query_provider_property(), None);
}
}
sizing
}
pub fn get_name(layoutable: &Layoutable) -> Option<String> {
layoutable.get_value(Self::name_property())
}
pub fn set_name(layoutable: &Layoutable, name: Option<String>) {
layoutable.set_value(Self::name_property(), name);
}
pub fn get_sizing(layoutable: &Layoutable) -> ContainerSizing {
layoutable.get_value(Self::sizing_property())
}
pub fn set_sizing(layoutable: &Layoutable, sizing: ContainerSizing) {
layoutable.set_value(Self::sizing_property(), sizing);
}
pub(crate) fn get_query_provider(layoutable: &Layoutable) -> Option<VisualQueryProvider> {
layoutable.get_value(Self::query_provider_property())
}
pub fn set_query_provider_size(layoutable: &Layoutable, width: f64, height: f64, sizing: ContainerSizing) {
if let Some(query_provider) = Self::get_query_provider(layoutable) {
query_provider.set_size(width, height, sizing);
}
}
}