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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
use crate::{ props::{Props, PropsDef}, widget::{ node::WidgetNode, unit::WidgetUnitData, utils::{Color, Rect}, WidgetId, }, Scalar, }; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, convert::TryFrom}; #[derive(Debug, Copy, Clone, Serialize, Deserialize)] pub enum ImageBoxImageScaling { Strech, Frame(Scalar), } impl Default for ImageBoxImageScaling { fn default() -> Self { Self::Strech } } #[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct ImageBoxImage { #[serde(default)] pub id: String, #[serde(default)] pub source_rect: Option<Rect>, #[serde(default)] pub scaling: ImageBoxImageScaling, #[serde(default)] pub tint: Color, } #[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct ImageBoxProcedural { #[serde(default)] pub id: String, #[serde(default)] pub parameters: HashMap<String, Scalar>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum ImageBoxMaterial { Color(Color), Image(ImageBoxImage), Procedural(ImageBoxProcedural), } impl Default for ImageBoxMaterial { fn default() -> Self { Self::Color(Color::default()) } } #[derive(Debug, Copy, Clone, Serialize, Deserialize)] pub enum ImageBoxSizeValue { Fill, Exact(Scalar), } impl Default for ImageBoxSizeValue { fn default() -> Self { Self::Fill } } #[derive(Debug, Default, Copy, Clone, Serialize, Deserialize)] pub struct ImageBoxAspectRatio { #[serde(default)] pub horizontal_alignment: Scalar, #[serde(default)] pub vertical_alignment: Scalar, } #[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct ImageBox { #[serde(default)] pub id: WidgetId, #[serde(default)] pub width: ImageBoxSizeValue, #[serde(default)] pub height: ImageBoxSizeValue, #[serde(default)] pub content_keep_aspect_ratio: Option<ImageBoxAspectRatio>, #[serde(default)] pub material: ImageBoxMaterial, } impl WidgetUnitData for ImageBox { fn id(&self) -> &WidgetId { &self.id } } impl TryFrom<ImageBoxNode> for ImageBox { type Error = (); fn try_from(node: ImageBoxNode) -> Result<Self, Self::Error> { let ImageBoxNode { id, width, height, content_keep_aspect_ratio, material, .. } = node; Ok(Self { id, width, height, content_keep_aspect_ratio, material, }) } } #[derive(Debug, Default, Clone)] pub struct ImageBoxNode { pub id: WidgetId, pub props: Props, pub width: ImageBoxSizeValue, pub height: ImageBoxSizeValue, pub content_keep_aspect_ratio: Option<ImageBoxAspectRatio>, pub material: ImageBoxMaterial, } impl ImageBoxNode { pub fn remap_props<F>(&mut self, mut f: F) where F: FnMut(Props) -> Props, { let props = std::mem::replace(&mut self.props, Default::default()); self.props = (f)(props); } } impl Into<WidgetNode> for ImageBoxNode { fn into(self) -> WidgetNode { WidgetNode::Unit(self.into()) } } #[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct ImageBoxNodeDef { #[serde(default)] pub id: WidgetId, #[serde(default)] pub props: PropsDef, #[serde(default)] pub width: ImageBoxSizeValue, #[serde(default)] pub height: ImageBoxSizeValue, #[serde(default)] pub content_keep_aspect_ratio: Option<ImageBoxAspectRatio>, #[serde(default)] pub material: ImageBoxMaterial, }