raui_core/widget/component/containers/
flex_box.rs

1use crate::{
2    make_widget, pre_hooks,
3    widget::{
4        component::interactive::navigation::{
5            use_nav_container_active, use_nav_item, use_nav_jump, NavContainerActive,
6            NavItemActive, NavJumpActive,
7        },
8        context::WidgetContext,
9        node::WidgetNode,
10        unit::flex::{FlexBoxDirection, FlexBoxItemLayout, FlexBoxItemNode, FlexBoxNode},
11        utils::Transform,
12    },
13    PropsData, Scalar,
14};
15use serde::{Deserialize, Serialize};
16
17#[derive(PropsData, Debug, Default, Clone, Serialize, Deserialize)]
18#[props_data(crate::props::PropsData)]
19#[prefab(crate::Prefab)]
20pub struct FlexBoxProps {
21    #[serde(default)]
22    pub direction: FlexBoxDirection,
23    #[serde(default)]
24    pub separation: Scalar,
25    #[serde(default)]
26    pub wrap: bool,
27    #[serde(default)]
28    pub transform: Transform,
29}
30
31#[pre_hooks(use_nav_container_active, use_nav_jump, use_nav_item)]
32pub fn nav_flex_box(mut context: WidgetContext) -> WidgetNode {
33    let WidgetContext {
34        key,
35        props,
36        listed_slots,
37        ..
38    } = context;
39
40    let props = props
41        .clone()
42        .without::<NavContainerActive>()
43        .without::<NavJumpActive>()
44        .without::<NavItemActive>();
45
46    make_widget!(flex_box)
47        .key(key)
48        .merge_props(props)
49        .listed_slots(listed_slots)
50        .into()
51}
52
53pub fn flex_box(context: WidgetContext) -> WidgetNode {
54    let WidgetContext {
55        id,
56        props,
57        listed_slots,
58        ..
59    } = context;
60
61    let FlexBoxProps {
62        direction,
63        separation,
64        wrap,
65        transform,
66    } = props.read_cloned_or_default();
67
68    let items = listed_slots
69        .into_iter()
70        .filter_map(|slot| {
71            if let Some(props) = slot.props() {
72                let layout = props.read_cloned_or_default::<FlexBoxItemLayout>();
73                Some(FlexBoxItemNode { slot, layout })
74            } else {
75                None
76            }
77        })
78        .collect::<Vec<_>>();
79
80    FlexBoxNode {
81        id: id.to_owned(),
82        props: props.clone(),
83        items,
84        direction,
85        separation,
86        wrap,
87        transform,
88    }
89    .into()
90}