rtlibs-tui 0.1.4

rtools library: ratatui widgets
Documentation
use std::marker::PhantomData;

use ratatui::buffer::Buffer;
use ratatui::layout::Alignment;
use ratatui::layout::Constraint;
use ratatui::layout::Layout;
use ratatui::layout::Rect;
use ratatui::style::Style;
use ratatui::widgets::Block;
use ratatui::widgets::Clear;
use ratatui::widgets::StatefulWidget;
use ratatui::widgets::Widget;

use super::ModalContainerState;
use super::ModalKind;

pub struct ModalContainerWidget<T, R>
{
    phantom_t: PhantomData<T>,
    phantom_r: PhantomData<R>,
}

impl<T, R> std::default::Default for ModalContainerWidget<T, R>
{
    fn default() -> Self
    {
        Self::new()
    }
}

impl<T, R> ModalContainerWidget<T, R>
{
    pub fn new() -> Self
    {
        Self {
            phantom_t: PhantomData,
            phantom_r: PhantomData,
        }
    }
}

impl<T, R> StatefulWidget for ModalContainerWidget<T, R>
{
    type State = ModalContainerState<T, R>;

    fn render(
        self,
        area: Rect,
        buf: &mut Buffer,
        state: &mut Self::State,
    )
    {
        if let Some(modal) = state
            .modal
            .as_mut()
        {
            Block::new()
                .style(Style::new().fg(ratatui::style::Color::DarkGray))
                .render(
                    area, buf,
                );

            let mut area = match modal
                .config()
                .kind
            {
                ModalKind::FullScreen => area,
                ModalKind::Large =>
                {
                    let [_, area, _] = Layout::horizontal([
                        Constraint::Fill(1),
                        Constraint::Fill(10),
                        Constraint::Fill(1),
                    ])
                    .areas(area);
                    let [_, area, _] = Layout::vertical([
                        Constraint::Fill(1),
                        Constraint::Fill(10),
                        Constraint::Fill(1),
                    ])
                    .areas(area);
                    area
                }
                ModalKind::Small =>
                {
                    let [_, area, _] = Layout::horizontal([
                        Constraint::Fill(1),
                        Constraint::Fill(2),
                        Constraint::Fill(1),
                    ])
                    .areas(area);
                    let [_, area, _] = Layout::vertical([
                        Constraint::Fill(1),
                        Constraint::Fill(1),
                        Constraint::Fill(1),
                    ])
                    .areas(area);
                    area
                }
                ModalKind::Rect(width, height) =>
                {
                    let [_, area, _] = Layout::horizontal([
                        Constraint::Fill(1),
                        Constraint::Length(width),
                        Constraint::Fill(1),
                    ])
                    .areas(area);
                    let [_, area, _] = Layout::vertical([
                        Constraint::Fill(1),
                        Constraint::Length(height),
                        Constraint::Fill(1),
                    ])
                    .areas(area);
                    area
                }
            };

            Clear.render(
                area, buf,
            );

            if modal
                .config()
                .bordered
            {
                Block::bordered()
                    .title(
                        modal
                            .config()
                            .title
                            .as_str(),
                    )
                    .title_alignment(Alignment::Center)
                    .render(
                        area, buf,
                    );
                area.x += 1;
                area.y += 1;
                area.width -= 2;
                area.height -= 2;
            }

            modal.render(
                area, buf,
            );
        }
    }
}