raui_core/widget/component/containers/
size_box.rs

1use crate::{
2    PropsData, unpack_named_slots,
3    widget::{
4        context::WidgetContext,
5        node::WidgetNode,
6        unit::size::{SizeBoxAspectRatio, SizeBoxNode, SizeBoxSizeValue},
7        utils::{Rect, Transform},
8    },
9};
10use serde::{Deserialize, Serialize};
11
12#[derive(PropsData, Debug, Default, Clone, Serialize, Deserialize)]
13#[props_data(crate::props::PropsData)]
14#[prefab(crate::Prefab)]
15pub struct SizeBoxProps {
16    #[serde(default)]
17    pub width: SizeBoxSizeValue,
18    #[serde(default)]
19    pub height: SizeBoxSizeValue,
20    #[serde(default)]
21    pub margin: Rect,
22    #[serde(default)]
23    pub keep_aspect_ratio: SizeBoxAspectRatio,
24    #[serde(default)]
25    pub transform: Transform,
26}
27
28pub fn size_box(context: WidgetContext) -> WidgetNode {
29    let WidgetContext {
30        id,
31        props,
32        named_slots,
33        ..
34    } = context;
35    unpack_named_slots!(named_slots => content);
36
37    let SizeBoxProps {
38        width,
39        height,
40        margin,
41        keep_aspect_ratio,
42        transform,
43    } = props.read_cloned_or_default();
44
45    SizeBoxNode {
46        id: id.to_owned(),
47        props: props.clone(),
48        slot: Box::new(content),
49        width,
50        height,
51        margin,
52        keep_aspect_ratio,
53        transform,
54    }
55    .into()
56}