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