Skip to main content

stynx_code_tui/widgets/
input_dialog.rs

1use ratatui::{
2    buffer::Buffer,
3    layout::Rect,
4    style::{Modifier, Style},
5    text::{Line, Span},
6    widgets::{Block, Borders, Clear, Paragraph, Widget},
7};
8
9use crate::theme;
10
11pub struct InputDialog<'a> {
12    pub title: &'a str,
13    pub prompt: &'a str,
14    pub buffer: &'a str,
15}
16
17impl<'a> InputDialog<'a> {
18    pub fn new(title: &'a str, prompt: &'a str, buffer: &'a str) -> Self {
19        Self { title, prompt, buffer }
20    }
21}
22
23impl<'a> Widget for InputDialog<'a> {
24    fn render(self, area: Rect, buf: &mut Buffer) {
25        let w = 60.min(area.width.saturating_sub(4));
26        let h = 7.min(area.height.saturating_sub(4));
27        let x = area.x + (area.width.saturating_sub(w)) / 2;
28        let y = area.y + (area.height.saturating_sub(h)) / 2;
29        let rect = Rect { x, y, width: w, height: h };
30        Clear.render(rect, buf);
31
32        let block = Block::default()
33            .borders(Borders::ALL)
34            .border_style(Style::default().fg(theme::BORDER_ACTIVE()))
35            .style(Style::default().bg(theme::BACKGROUND_PANEL()))
36            .title(Span::styled(
37                format!(" {} ", self.title),
38                Style::default().fg(theme::TEXT()).add_modifier(Modifier::BOLD),
39            ));
40        let inner = block.inner(rect);
41        block.render(rect, buf);
42
43        let lines: Vec<Line<'static>> = vec![
44            Line::from(""),
45            Line::from(Span::styled(
46                format!("  {}", self.prompt),
47                Style::default().fg(theme::TEXT_MUTED()).bg(theme::BACKGROUND_PANEL()),
48            )),
49            Line::from(""),
50            Line::from(vec![
51                Span::styled(
52                    "  › ",
53                    Style::default().fg(theme::ACCENT()).bg(theme::BACKGROUND_PANEL()),
54                ),
55                Span::styled(
56                    self.buffer.to_string(),
57                    Style::default()
58                        .fg(theme::TEXT())
59                        .bg(theme::BACKGROUND_PANEL())
60                        .add_modifier(Modifier::BOLD),
61                ),
62                Span::styled(
63                    "▏",
64                    Style::default().fg(theme::ACCENT()).bg(theme::BACKGROUND_PANEL()),
65                ),
66            ]),
67            Line::from(""),
68            Line::from(Span::styled(
69                "  enter  confirm   esc  cancel ".to_string(),
70                Style::default().fg(theme::TEXT_MUTED()).bg(theme::BACKGROUND_PANEL()),
71            )),
72        ];
73
74        Paragraph::new(lines)
75            .style(Style::default().bg(theme::BACKGROUND_PANEL()))
76            .render(inner, buf);
77    }
78}