use crate::prelude::*; use std::marker::{Sized, Unsize}; pub struct WidgetPtr { pub inner: Option, } impl Widget for WidgetPtr { fn draw(&mut self, painter: &mut Painter) { if let Some(id) = &self.inner { painter.widget(id); } } fn desired_width(&mut self, ctx: &mut SizeCtx) -> Len { if let Some(id) = &self.inner { ctx.width(id) } else { Len::ZERO } } fn desired_height(&mut self, ctx: &mut SizeCtx) -> Len { if let Some(id) = &self.inner { ctx.height(id) } else { Len::ZERO } } } impl WidgetPtr { pub fn new() -> Self { Self::default() } pub fn empty() -> Self { Self { inner: Default::default(), } } pub fn set>(&mut self, to: StrongWidget) { self.inner = Some(to) } pub fn replace>( &mut self, to: StrongWidget, ) -> Option { self.inner.replace(to) } } impl Default for WidgetPtr { fn default() -> Self { Self::empty() } }