raui_core/widget/component/containers/
content_box.rs1use crate::{
4    make_widget, pre_hooks,
5    widget::{
6        component::interactive::navigation::{
7            use_nav_container_active, use_nav_item, use_nav_jump_direction_active,
8            NavContainerActive, NavItemActive, NavJumpActive,
9        },
10        context::WidgetContext,
11        node::WidgetNode,
12        unit::content::{ContentBoxItemLayout, ContentBoxItemNode, ContentBoxNode},
13        utils::Transform,
14    },
15    PropsData,
16};
17use serde::{Deserialize, Serialize};
18
19#[derive(PropsData, Debug, Default, Clone, Serialize, Deserialize)]
21#[props_data(crate::props::PropsData)]
22#[prefab(crate::Prefab)]
23pub struct ContentBoxProps {
24    #[serde(default)]
26    pub clipping: bool,
27    #[serde(default)]
29    pub transform: Transform,
30}
31
32#[pre_hooks(use_nav_container_active, use_nav_jump_direction_active, use_nav_item)]
33pub fn nav_content_box(mut context: WidgetContext) -> WidgetNode {
34    let WidgetContext {
35        key,
36        props,
37        listed_slots,
38        ..
39    } = context;
40
41    let props = props
42        .clone()
43        .without::<NavContainerActive>()
44        .without::<NavJumpActive>()
45        .without::<NavItemActive>();
46
47    make_widget!(content_box)
48        .key(key)
49        .merge_props(props)
50        .listed_slots(listed_slots)
51        .into()
52}
53
54pub fn content_box(context: WidgetContext) -> WidgetNode {
70    let WidgetContext {
71        id,
72        props,
73        listed_slots,
74        ..
75    } = context;
76
77    let ContentBoxProps {
78        clipping,
79        transform,
80    } = props.read_cloned_or_default();
81
82    let items = listed_slots
83        .into_iter()
84        .filter_map(|slot| {
85            if let Some(props) = slot.props() {
86                let layout = props.read_cloned_or_default::<ContentBoxItemLayout>();
87                Some(ContentBoxItemNode { slot, layout })
88            } else {
89                None
90            }
91        })
92        .collect::<Vec<_>>();
93
94    ContentBoxNode {
95        id: id.to_owned(),
96        props: props.clone(),
97        items,
98        clipping,
99        transform,
100    }
101    .into()
102}