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