raui_core/widget/unit/
grid.rs

1use 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}