Files
Cagire/crates/ratatui/src/confirm.rs

68 lines
1.8 KiB
Rust

//! Yes/No confirmation dialog widget.
use crate::theme;
use ratatui::layout::{Alignment, Constraint, Layout, Rect};
use ratatui::style::Style;
use ratatui::text::{Line, Span};
use ratatui::widgets::Paragraph;
use ratatui::Frame;
use super::ModalFrame;
/// Modal dialog with Yes/No buttons.
pub struct ConfirmModal<'a> {
title: &'a str,
message: &'a str,
selected: bool,
}
impl<'a> ConfirmModal<'a> {
pub fn new(title: &'a str, message: &'a str, selected: bool) -> Self {
Self {
title,
message,
selected,
}
}
pub fn render_centered(self, frame: &mut Frame, term: Rect) -> Rect {
let t = theme::get();
let inner = ModalFrame::new(self.title)
.width(30)
.height(5)
.border_color(t.confirm.border)
.render_centered(frame, term);
let rows = Layout::vertical([Constraint::Length(1), Constraint::Length(1)]).split(inner);
frame.render_widget(
Paragraph::new(self.message).alignment(Alignment::Center),
rows[0],
);
let yes_style = if self.selected {
Style::new().fg(t.confirm.button_selected_fg).bg(t.confirm.button_selected_bg)
} else {
Style::default()
};
let no_style = if !self.selected {
Style::new().fg(t.confirm.button_selected_fg).bg(t.confirm.button_selected_bg)
} else {
Style::default()
};
let buttons = Line::from(vec![
Span::styled(" Yes ", yes_style),
Span::raw(" "),
Span::styled(" No ", no_style),
]);
frame.render_widget(
Paragraph::new(buttons).alignment(Alignment::Center),
rows[1],
);
inner
}
}