use crate::model::template::EditorState;
use ratatui::{
prelude::*,
widgets::{Block, Borders},
};
pub struct TemplateEditorWidget;
impl TemplateEditorWidget {
pub fn new() -> Self {
Self
}
pub fn render(
&self,
area: Rect,
buf: &mut Buffer,
state: &mut EditorState,
is_focused: bool,
has_missing_vars: bool,
) {
let border_style = if is_focused {
Style::default().fg(Color::Yellow) } else {
Style::default().fg(Color::Rgb(139, 69, 19)) };
let title_spans = if !state.is_valid {
vec![
Span::styled("Template ", Style::default().fg(Color::White)),
Span::styled(
"e",
Style::default().fg(Color::Red).add_modifier(Modifier::BOLD),
),
Span::styled("ditor ", Style::default().fg(Color::White)),
Span::styled(
format!("(SYNTAX ERROR: {})", state.validation_message),
Style::default().fg(Color::Red),
),
]
} else if has_missing_vars {
vec![
Span::styled("Template ", Style::default().fg(Color::White)),
Span::styled(
"e",
Style::default().fg(Color::Red).add_modifier(Modifier::BOLD),
),
Span::styled("ditor ", Style::default().fg(Color::White)),
Span::styled(" (MISSING VARIABLES)", Style::default().fg(Color::Red)),
]
} else {
vec![
Span::styled("Template ", Style::default().fg(Color::White)),
Span::styled(
"e",
Style::default().fg(Color::Red).add_modifier(Modifier::BOLD),
),
Span::styled("ditor ", Style::default().fg(Color::White)),
Span::styled(" (VALID)", Style::default().fg(Color::Green)),
]
};
let mut textarea = state.editor.clone();
textarea.set_block(
Block::default()
.borders(Borders::ALL)
.title(Line::from(title_spans))
.border_style(border_style),
);
if is_focused {
textarea.set_cursor_line_style(Style::default().add_modifier(Modifier::UNDERLINED));
textarea.set_cursor_style(Style::default().fg(Color::Yellow));
}
if !state.is_valid || has_missing_vars {
textarea.set_style(Style::default().fg(Color::Rgb(139, 69, 19))); } else {
textarea.set_style(Style::default().fg(Color::White));
}
Widget::render(&textarea, area, buf);
}
}
impl Default for TemplateEditorWidget {
fn default() -> Self {
Self::new()
}
}