raui_core/widget/unit/
portal.rs

1use crate::widget::{
2    node::{WidgetNode, WidgetNodePrefab},
3    unit::{
4        content::{ContentBoxItem, ContentBoxItemNode, ContentBoxItemNodePrefab},
5        flex::{FlexBoxItem, FlexBoxItemNode, FlexBoxItemNodePrefab},
6        grid::{GridBoxItem, GridBoxItemNode, GridBoxItemNodePrefab},
7        WidgetUnit, WidgetUnitData,
8    },
9    WidgetId,
10};
11use serde::{Deserialize, Serialize};
12use std::convert::TryFrom;
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub enum PortalBoxSlot {
16    Slot(WidgetUnit),
17    ContentItem(ContentBoxItem),
18    FlexItem(FlexBoxItem),
19    GridItem(GridBoxItem),
20}
21
22impl Default for PortalBoxSlot {
23    fn default() -> Self {
24        Self::Slot(Default::default())
25    }
26}
27
28impl TryFrom<PortalBoxSlotNode> for PortalBoxSlot {
29    type Error = ();
30
31    fn try_from(node: PortalBoxSlotNode) -> Result<Self, Self::Error> {
32        Ok(match node {
33            PortalBoxSlotNode::Slot(node) => PortalBoxSlot::Slot(WidgetUnit::try_from(node)?),
34            PortalBoxSlotNode::ContentItem(item) => {
35                PortalBoxSlot::ContentItem(ContentBoxItem::try_from(item)?)
36            }
37            PortalBoxSlotNode::FlexItem(item) => {
38                PortalBoxSlot::FlexItem(FlexBoxItem::try_from(item)?)
39            }
40            PortalBoxSlotNode::GridItem(item) => {
41                PortalBoxSlot::GridItem(GridBoxItem::try_from(item)?)
42            }
43        })
44    }
45}
46
47#[derive(Debug, Clone)]
48pub enum PortalBoxSlotNode {
49    Slot(WidgetNode),
50    ContentItem(ContentBoxItemNode),
51    FlexItem(FlexBoxItemNode),
52    GridItem(GridBoxItemNode),
53}
54
55impl Default for PortalBoxSlotNode {
56    fn default() -> Self {
57        Self::Slot(Default::default())
58    }
59}
60
61#[derive(Debug, Default, Clone, Serialize, Deserialize)]
62pub struct PortalBox {
63    #[serde(default)]
64    pub id: WidgetId,
65    #[serde(default)]
66    pub slot: Box<PortalBoxSlot>,
67    #[serde(default)]
68    pub owner: WidgetId,
69}
70
71impl WidgetUnitData for PortalBox {
72    fn id(&self) -> &WidgetId {
73        &self.id
74    }
75
76    fn get_children(&self) -> Vec<&WidgetUnit> {
77        vec![match &*self.slot {
78            PortalBoxSlot::Slot(b) => b,
79            PortalBoxSlot::ContentItem(b) => &b.slot,
80            PortalBoxSlot::FlexItem(b) => &b.slot,
81            PortalBoxSlot::GridItem(b) => &b.slot,
82        }]
83    }
84}
85
86impl TryFrom<PortalBoxNode> for PortalBox {
87    type Error = ();
88
89    fn try_from(node: PortalBoxNode) -> Result<Self, Self::Error> {
90        let PortalBoxNode { id, slot, owner } = node;
91        Ok(Self {
92            id,
93            slot: Box::new(PortalBoxSlot::try_from(*slot)?),
94            owner,
95        })
96    }
97}
98
99#[derive(Debug, Default, Clone)]
100pub struct PortalBoxNode {
101    pub id: WidgetId,
102    pub slot: Box<PortalBoxSlotNode>,
103    pub owner: WidgetId,
104}
105
106impl From<PortalBoxNode> for WidgetNode {
107    fn from(data: PortalBoxNode) -> Self {
108        Self::Unit(data.into())
109    }
110}
111
112#[derive(Debug, Default, Clone, Serialize, Deserialize)]
113pub(crate) struct PortalBoxNodePrefab {
114    #[serde(default)]
115    pub id: WidgetId,
116    #[serde(default)]
117    pub slot: Box<PortalBoxSlotNodePrefab>,
118    #[serde(default)]
119    pub owner: WidgetId,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
123pub(crate) enum PortalBoxSlotNodePrefab {
124    Slot(#[serde(default)] WidgetNodePrefab),
125    ContentItem(#[serde(default)] ContentBoxItemNodePrefab),
126    FlexItem(#[serde(default)] FlexBoxItemNodePrefab),
127    GridItem(#[serde(default)] GridBoxItemNodePrefab),
128}
129
130impl Default for PortalBoxSlotNodePrefab {
131    fn default() -> Self {
132        Self::Slot(Default::default())
133    }
134}