raui_core/widget/unit/
size.rs1use 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}