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<dyn Widget>) -> Result<(), error::WitError>;
fn children(&self) -> &[Box<dyn Widget>];
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<WidgetSize> 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<WidgetSizeDimn> 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,
}