raui_core/widget/unit/
size.rs

1use crate::{
2    props::Props,
3    widget::{
4        node::{WidgetNode, WidgetNodePrefab},
5        unit::{WidgetUnit, WidgetUnitData},
6        utils::{Rect, Transform},
7        WidgetId,
8    },
9    PrefabValue, Scalar,
10};
11use serde::{Deserialize, Serialize};
12use std::convert::TryFrom;
13
14#[derive(Debug, Default, Copy, Clone, Serialize, Deserialize)]
15pub enum SizeBoxSizeValue {
16    #[default]
17    Content,
18    Fill,
19    Exact(Scalar),
20}
21
22#[derive(Debug, Default, Copy, Clone, Serialize, Deserialize)]
23pub enum SizeBoxAspectRatio {
24    #[default]
25    None,
26    WidthOfHeight(Scalar),
27    HeightOfWidth(Scalar),
28}
29
30#[derive(Debug, Default, Clone, Serialize, Deserialize)]
31pub struct SizeBox {
32    #[serde(default)]
33    pub id: WidgetId,
34    #[serde(default)]
35    pub slot: Box<WidgetUnit>,
36    #[serde(default)]
37    pub width: SizeBoxSizeValue,
38    #[serde(default)]
39    pub height: SizeBoxSizeValue,
40    #[serde(default)]
41    pub margin: Rect,
42    #[serde(default)]
43    pub keep_aspect_ratio: SizeBoxAspectRatio,
44    #[serde(default)]
45    pub transform: Transform,
46}
47
48impl WidgetUnitData for SizeBox {
49    fn id(&self) -> &WidgetId {
50        &self.id
51    }
52
53    fn get_children(&self) -> Vec<&WidgetUnit> {
54        vec![&self.slot]
55    }
56}
57
58impl TryFrom<SizeBoxNode> for SizeBox {
59    type Error = ();
60
61    fn try_from(node: SizeBoxNode) -> Result<Self, Self::Error> {
62        let SizeBoxNode {
63            id,
64            slot,
65            width,
66            height,
67            margin,
68            keep_aspect_ratio,
69            transform,
70            ..
71        } = node;
72        Ok(Self {
73            id,
74            slot: Box::new(WidgetUnit::try_from(*slot)?),
75            width,
76            height,
77            margin,
78            keep_aspect_ratio,
79            transform,
80        })
81    }
82}
83
84#[derive(Debug, Default, Clone)]
85pub struct SizeBoxNode {
86    pub id: WidgetId,
87    pub props: Props,
88    pub slot: Box<WidgetNode>,
89    pub width: SizeBoxSizeValue,
90    pub height: SizeBoxSizeValue,
91    pub margin: Rect,
92    pub keep_aspect_ratio: SizeBoxAspectRatio,
93    pub transform: Transform,
94}
95
96impl SizeBoxNode {
97    pub fn remap_props<F>(&mut self, mut f: F)
98    where
99        F: FnMut(Props) -> Props,
100    {
101        let props = std::mem::take(&mut self.props);
102        self.props = (f)(props);
103    }
104}
105
106impl From<SizeBoxNode> for WidgetNode {
107    fn from(data: SizeBoxNode) -> Self {
108        Self::Unit(data.into())
109    }
110}
111
112#[derive(Debug, Default, Clone, Serialize, Deserialize)]
113pub(crate) struct SizeBoxNodePrefab {
114    #[serde(default)]
115    pub id: WidgetId,
116    #[serde(default)]
117    pub props: PrefabValue,
118    #[serde(default)]
119    pub slot: Box<WidgetNodePrefab>,
120    #[serde(default)]
121    pub width: SizeBoxSizeValue,
122    #[serde(default)]
123    pub height: SizeBoxSizeValue,
124    #[serde(default)]
125    pub keep_aspect_ratio: SizeBoxAspectRatio,
126    #[serde(default)]
127    pub margin: Rect,
128    #[serde(default)]
129    pub transform: Transform,
130}