raui_core/widget/component/containers/
vertical_box.rs1use 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}