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,
);
}
}
}