use crate::{
graphics::{
colours::{self, RGBA},
shapes, Shape, Size,
},
Border, DebugWidget, ToAny, Widget,
};
#[derive(Debug)]
pub struct Container {
pub size: Size,
pub colour: RGBA,
pub borders: Option<[Border; 4]>,
pub widget: Box<dyn Widget>,
}
crate::dynamic_widget!(Container);
impl Widget for Container {
fn shape(&self, size: Option<Size>) -> Shape {
assert_eq!(size, None);
shapes::Builder::new()
.rectangle(self.size, self.borders)
.fill(self.colour)
.finish()
}
}
impl Container {
pub fn new<T: Widget + 'static>(
size: Size,
colour: RGBA,
borders: [Border; 4],
widget: T,
) -> Self {
Self {
size,
colour,
borders: Some(borders),
widget: Box::new(widget),
}
}
pub fn simple<T: Widget + 'static>(size: Size, widget: T) -> Self {
Self {
size,
colour: colours::TRANSPARENT,
borders: None,
widget: Box::new(widget),
}
}
pub fn coloured<T: Widget + 'static>(size: Size, colour: RGBA, widget: T) -> Self {
Self {
size,
colour,
borders: None,
widget: Box::new(widget),
}
}
pub fn bordered<T: Widget + 'static>(size: Size, borders: [Border; 4], widget: T) -> Self {
Self {
size,
colour: RGBA::default(),
borders: Some(borders),
widget: Box::new(widget),
}
}
}