use ratatui::{
prelude::*,
widgets::{Block, Borders},
};
use tui_textarea::TextArea;
#[derive(Debug)]
pub struct Prompt<'a> {
text: TextArea<'a>,
is_active: bool,
}
impl<'a> Prompt<'a> {
pub fn new() -> Self {
Prompt {
text: TextArea::default(),
is_active: false,
}
}
fn layer(&self, area: Rect) -> Rect {
(if self.is_active {
Layout::default()
.direction(Direction::Vertical)
.constraints(vec![Constraint::Max(3)])
.split(area.inner(&Margin {
horizontal: 1,
vertical: 0,
}))
} else {
Layout::default()
.direction(Direction::Vertical)
.constraints(vec![Constraint::Max(3)])
.split(area)
})[0]
}
fn set_style(&mut self) {
if self.is_active {
self.text.set_cursor_line_style(Style::default());
self.text.set_placeholder_text(">");
self.text.set_block(
Block::default()
.borders(Borders::ALL)
.style(Style::default().fg(Color::LightGreen)),
);
} else {
self.text.set_cursor_line_style(Style::default());
self.text.set_placeholder_text(">");
self.text.set_block(
Block::default()
.title("Prompt")
.title_alignment(Alignment::Left)
.borders(Borders::ALL)
.style(Style::default()),
);
}
}
pub fn toggle(&mut self) {
self.is_active = !self.is_active;
}
pub fn render(&mut self, area: Rect, f: &mut Frame<'_>) {
let layer = self.layer(area);
self.set_style();
f.render_widget(self.text.widget(), layer);
}
}