use crate::error; pub trait Widget { fn set_size(&mut self, size: WidgetSize) -> Result<(), error::WitError>; fn size(&self) -> WidgetSize; fn add_child(&mut self, child: Box) -> Result<(), error::WitError>; fn children(&self) -> &[Box]; fn set_pos(&mut self, pos: WidgetPos) -> Result<(), error::WitError>; fn pos(&self) -> WidgetPos; fn set_display_mode(&mut self, display: DisplayMode) -> Result<(), error::WitError>; fn display_mode(&self) -> DisplayMode; fn set_static(&mut self) -> Result<(), error::WitError> { self.set_display_mode(DisplayMode::Static) } fn is_static(&self) -> bool { matches!(self.display_mode(), DisplayMode::Static) } fn set_floating(&mut self) -> Result<(), error::WitError> { self.set_display_mode(DisplayMode::Floating) } fn is_floating(&self) -> bool { matches!(self.display_mode(), DisplayMode::Floating) } fn hide(&mut self) -> Result<(), error::WitError> { self.set_display_mode(DisplayMode::Hidden) } fn is_hidden(&self) -> bool { matches!(self.display_mode(), DisplayMode::Hidden) } } // should write some macros to make this nicer #[derive(Clone, Copy)] pub struct WidgetSize(WidgetSizeDimn, WidgetSizeDimn); impl WidgetSize { #[inline(always)] pub fn x(&self) -> WidgetSizeDimn { self.0 } #[inline(always)] pub fn y(&self) -> WidgetSizeDimn { self.1 } } impl From for (u16, u16) { #[inline(always)] fn from(size: WidgetSize) -> Self { (size.0.into(), size.1.into()) } } #[derive(Clone, Copy)] pub enum WidgetSizeDimn { Static(u16), Fill, Fit, } impl From for u16 { #[inline(always)] fn from(dim: WidgetSizeDimn) -> Self { match dim { WidgetSizeDimn::Static(x) => x, WidgetSizeDimn::Fill => todo!(), WidgetSizeDimn::Fit => todo!(), } } } #[derive(Clone, Copy)] pub struct WidgetPos(WidgetPosDimn, WidgetPosDimn); impl WidgetPos { #[inline(always)] pub fn x(&self) -> WidgetPosDimn { self.0 } #[inline(always)] pub fn y(&self) -> WidgetPosDimn { self.1 } } impl Default for WidgetPos { fn default() -> WidgetPos { WidgetPos(WidgetPosDimn::FloatStart, WidgetPosDimn::FloatStart) } } #[derive(Clone, Copy)] pub enum WidgetPosDimn { Static(u16), FloatStart, FloatEnd, } impl Default for WidgetPosDimn { fn default() -> Self { Self::FloatStart } } #[derive(Clone, Copy)] pub enum DisplayMode { Static, Floating, Hidden, }