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}