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
use crate::theme::{ThemeColor, ThemeProps, ThemedImageMaterial, ThemedWidgetProps}; use raui_core::prelude::*; use serde::{Deserialize, Serialize}; #[derive(PropsData, Debug, Default, Clone, Serialize, Deserialize)] #[props_data(raui_core::props::PropsData)] #[prefab(raui_core::Prefab)] pub struct SwitchPaperProps { #[serde(default)] pub on: bool, #[serde(default)] pub variant: String, #[serde(default)] pub size_level: usize, } pub fn switch_paper(context: WidgetContext) -> WidgetNode { let WidgetContext { idref, key, props, shared_props, .. } = context; let SwitchPaperProps { on, variant, size_level, } = props.read_cloned_or_default(); let themed_props = props.read_cloned_or_default::<ThemedWidgetProps>(); let color = match shared_props.read::<ThemeProps>() { Ok(props) => match themed_props.color { ThemeColor::Default => props.active_colors.main.default.main, ThemeColor::Primary => props.active_colors.main.primary.main, ThemeColor::Secondary => props.active_colors.main.secondary.main, }, Err(_) => Default::default(), }; let (size, material) = match shared_props.read::<ThemeProps>() { Ok(props) => { let size = props .icons_level_sizes .get(size_level) .copied() .unwrap_or(24.0); let material = if let Some(material) = props.switch_variants.get(&variant) { if on { material.on.clone() } else { material.off.clone() } } else { Default::default() }; (size, material) } Err(_) => (24.0, Default::default()), }; let image = match material { ThemedImageMaterial::Color => ImageBoxProps { material: ImageBoxMaterial::Color(ImageBoxColor { color, scaling: if on { ImageBoxImageScaling::Stretch } else { ImageBoxImageScaling::Frame((size_level as Scalar, true).into()) }, }), width: ImageBoxSizeValue::Exact(size), height: ImageBoxSizeValue::Exact(size), ..Default::default() }, ThemedImageMaterial::Image(mut data) => { data.tint = color; ImageBoxProps { material: ImageBoxMaterial::Image(data), width: ImageBoxSizeValue::Exact(size), height: ImageBoxSizeValue::Exact(size), ..Default::default() } } ThemedImageMaterial::Procedural(data) => ImageBoxProps { material: ImageBoxMaterial::Procedural(data), width: ImageBoxSizeValue::Exact(size), height: ImageBoxSizeValue::Exact(size), ..Default::default() }, }; widget! { (#{key} | {idref.cloned()} image_box: {image}) } }