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