stynx_code_tui/widgets/
input_dialog.rs1use 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}