raui_core/widget/component/containers/
vertical_box.rs

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