raui_core/widget/unit/
grid.rs1use crate::{
2 PrefabValue, PropsData, Scalar,
3 props::Props,
4 widget::{
5 WidgetId,
6 node::{WidgetNode, WidgetNodePrefab},
7 unit::{WidgetUnit, WidgetUnitData},
8 utils::{IntRect, Rect, Transform},
9 },
10};
11use serde::{Deserialize, Serialize};
12use std::convert::TryFrom;
13
14#[derive(PropsData, Debug, Default, Clone, Serialize, Deserialize)]
15#[props_data(crate::props::PropsData)]
16#[prefab(crate::Prefab)]
17pub struct GridBoxItemLayout {
18 #[serde(default)]
19 pub space_occupancy: IntRect,
20 #[serde(default)]
21 pub margin: Rect,
22 #[serde(default)]
23 pub horizontal_align: Scalar,
24 #[serde(default)]
25 pub vertical_align: Scalar,
26}
27
28#[derive(Debug, Default, Clone, Serialize, Deserialize)]
29pub struct GridBoxItem {
30 #[serde(default)]
31 pub slot: WidgetUnit,
32 #[serde(default)]
33 pub layout: GridBoxItemLayout,
34}
35
36impl TryFrom<GridBoxItemNode> for GridBoxItem {
37 type Error = ();
38
39 fn try_from(node: GridBoxItemNode) -> Result<Self, Self::Error> {
40 let GridBoxItemNode { slot, layout } = node;
41 Ok(Self {
42 slot: WidgetUnit::try_from(slot)?,
43 layout,
44 })
45 }
46}
47
48#[derive(Debug, Default, Clone)]
49pub struct GridBoxItemNode {
50 pub slot: WidgetNode,
51 pub layout: GridBoxItemLayout,
52}
53
54#[derive(Debug, Default, Clone, Serialize, Deserialize)]
55pub struct GridBox {
56 #[serde(default)]
57 pub id: WidgetId,
58 #[serde(default)]
59 #[serde(skip_serializing_if = "Vec::is_empty")]
60 pub items: Vec<GridBoxItem>,
61 #[serde(default)]
62 pub cols: usize,
63 #[serde(default)]
64 pub rows: usize,
65 #[serde(default)]
66 pub transform: Transform,
67}
68
69impl WidgetUnitData for GridBox {
70 fn id(&self) -> &WidgetId {
71 &self.id
72 }
73
74 fn get_children(&self) -> Vec<&WidgetUnit> {
75 self.items.iter().map(|item| &item.slot).collect()
76 }
77}
78
79impl TryFrom<GridBoxNode> for GridBox {
80 type Error = ();
81
82 fn try_from(node: GridBoxNode) -> Result<Self, Self::Error> {
83 let GridBoxNode {
84 id,
85 items,
86 cols,
87 rows,
88 transform,
89 ..
90 } = node;
91 let items = items
92 .into_iter()
93 .map(GridBoxItem::try_from)
94 .collect::<Result<_, _>>()?;
95 Ok(Self {
96 id,
97 items,
98 cols,
99 rows,
100 transform,
101 })
102 }
103}
104
105#[derive(Debug, Default, Clone)]
106pub struct GridBoxNode {
107 pub id: WidgetId,
108 pub props: Props,
109 pub items: Vec<GridBoxItemNode>,
110 pub cols: usize,
111 pub rows: usize,
112 pub transform: Transform,
113}
114
115impl GridBoxNode {
116 pub fn remap_props<F>(&mut self, mut f: F)
117 where
118 F: FnMut(Props) -> Props,
119 {
120 let props = std::mem::take(&mut self.props);
121 self.props = (f)(props);
122 }
123}
124
125impl From<GridBoxNode> for WidgetNode {
126 fn from(data: GridBoxNode) -> Self {
127 Self::Unit(data.into())
128 }
129}
130
131#[derive(Debug, Default, Clone, Serialize, Deserialize)]
132pub(crate) struct GridBoxNodePrefab {
133 #[serde(default)]
134 pub id: WidgetId,
135 #[serde(default)]
136 pub props: PrefabValue,
137 #[serde(default)]
138 #[serde(skip_serializing_if = "Vec::is_empty")]
139 pub items: Vec<GridBoxItemNodePrefab>,
140 #[serde(default)]
141 pub cols: usize,
142 #[serde(default)]
143 pub rows: usize,
144 #[serde(default)]
145 pub transform: Transform,
146}
147
148#[derive(Debug, Default, Clone, Serialize, Deserialize)]
149pub(crate) struct GridBoxItemNodePrefab {
150 #[serde(default)]
151 pub slot: WidgetNodePrefab,
152 #[serde(default)]
153 pub layout: GridBoxItemLayout,
154}