raui_core/widget/component/containers/
grid_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_direction_active,
6 NavContainerActive, NavItemActive, NavJumpActive,
7 },
8 context::WidgetContext,
9 node::WidgetNode,
10 unit::grid::{GridBoxItemLayout, GridBoxItemNode, GridBoxNode},
11 utils::Transform,
12 },
13 PropsData,
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 GridBoxProps {
21 #[serde(default)]
22 pub cols: usize,
23 #[serde(default)]
24 pub rows: usize,
25 #[serde(default)]
26 pub transform: Transform,
27}
28
29#[pre_hooks(use_nav_container_active, use_nav_jump_direction_active, use_nav_item)]
30pub fn nav_grid_box(mut context: WidgetContext) -> WidgetNode {
31 let WidgetContext {
32 key,
33 props,
34 listed_slots,
35 ..
36 } = context;
37
38 let props = props
39 .clone()
40 .without::<NavContainerActive>()
41 .without::<NavJumpActive>()
42 .without::<NavItemActive>();
43
44 make_widget!(grid_box)
45 .key(key)
46 .merge_props(props)
47 .listed_slots(listed_slots)
48 .into()
49}
50
51pub fn grid_box(context: WidgetContext) -> WidgetNode {
52 let WidgetContext {
53 id,
54 props,
55 listed_slots,
56 ..
57 } = context;
58
59 let GridBoxProps {
60 cols,
61 rows,
62 transform,
63 } = props.read_cloned_or_default();
64
65 let items = listed_slots
66 .into_iter()
67 .filter_map(|slot| {
68 if let Some(props) = slot.props() {
69 let layout = props.read_cloned_or_default::<GridBoxItemLayout>();
70 Some(GridBoxItemNode { slot, layout })
71 } else {
72 None
73 }
74 })
75 .collect::<Vec<_>>();
76
77 GridBoxNode {
78 id: id.to_owned(),
79 props: props.clone(),
80 items,
81 cols,
82 rows,
83 transform,
84 }
85 .into()
86}