raui_core/widget/component/containers/
vertical_box.rs

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