use crate::preludes::widget_creation::*;
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct GrowContainer<W: Widget> {
pub widget: W,
pub fixed_size: bool,
min_size: Size,
widget_data: WidgetData,
}
impl<W: Widget> GrowContainer<W> {
pub fn new(widget: W, fixed_size: bool) -> Self {
let size = widget.widget_info().size_info.get_min();
Self {
widget,
fixed_size,
min_size: size,
widget_data: WidgetData::new(),
}
}
}
impl<W: Widget> Widget for GrowContainer<W> {
fn draw(&mut self, canvas: &mut Canvas, state_frame: Option<&EventStateFrame>) {
let widget_size = self.widget.widget_info().size_info.get_min();
self.min_size = Size::new(
self.min_size.cols.max(widget_size.cols),
self.min_size.rows.max(widget_size.rows),
);
self.widget.draw(canvas, state_frame);
}
fn widget_info(&self) -> WidgetInfo {
WidgetInfo {
size_info: match self.fixed_size {
true => WidgetSizeInfo::Fixed(self.min_size),
false => WidgetSizeInfo::Dynamic {
min: Some(self.min_size),
max: None,
},
},
}
}
fn widget_data(&mut self) -> &mut WidgetData {
return &mut self.widget_data;
}
}