toon_format/tui/components/
editor.rs

1//! Input and output editor panels.
2
3use ratatui::{
4    layout::Rect,
5    widgets::{
6        Block,
7        Borders,
8    },
9    Frame,
10};
11
12use crate::tui::{
13    state::AppState,
14    theme::Theme,
15};
16
17pub struct EditorComponent;
18
19impl EditorComponent {
20    pub fn render(
21        f: &mut Frame,
22        input_area: Rect,
23        output_area: Rect,
24        app: &mut AppState,
25        theme: &Theme,
26    ) {
27        let input_active = app.editor.is_input_active();
28        let input_title = format!(
29            " Input ({}) {} ",
30            match app.mode {
31                crate::tui::state::app_state::Mode::Encode => "JSON",
32                crate::tui::state::app_state::Mode::Decode => "TOON",
33            },
34            if input_active { "●" } else { "" }
35        );
36
37        let input_block = Block::default()
38            .borders(Borders::ALL)
39            .border_style(theme.border_style(input_active))
40            .title(input_title)
41            .style(theme.normal_style());
42
43        app.editor.input.set_block(input_block);
44        app.editor
45            .input
46            .set_cursor_line_style(theme.selection_style());
47        app.editor.input.set_style(theme.normal_style());
48
49        f.render_widget(&app.editor.input, input_area);
50
51        let output_active = app.editor.is_output_active();
52        let output_title = format!(
53            " Output ({}) {} ",
54            match app.mode {
55                crate::tui::state::app_state::Mode::Encode => "TOON",
56                crate::tui::state::app_state::Mode::Decode => "JSON",
57            },
58            if output_active { "●" } else { "" }
59        );
60
61        let output_block = Block::default()
62            .borders(Borders::ALL)
63            .border_style(theme.border_style(output_active))
64            .title(output_title)
65            .style(theme.normal_style());
66
67        app.editor.output.set_block(output_block);
68        app.editor
69            .output
70            .set_cursor_line_style(theme.selection_style());
71        app.editor.output.set_style(theme.normal_style());
72
73        f.render_widget(&app.editor.output, output_area);
74    }
75}