tuigui 0.23.0

An easy-to-use, highly extensible, and speedy TUI library.
Documentation
use crate::preludes::widget_creation::*;

#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
/// A widget that grows in size when the widget grows in size
/// but also never shrinks in size (even when the child does)
pub struct GrowContainer<W: Widget> {
    /// Child widget
    pub widget: W,
    /// Set to 'false' if you want the container to be able to be bigger than the minimum size
    pub fixed_size: bool,
    /// Minimum size allowed
    min_size: Size,
    /// Widget data
    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;
    }
}