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