Skip to main content

gitkraft_tui/features/editor/
view.rs

1use ratatui::layout::Rect;
2use ratatui::style::{Modifier, Style};
3use ratatui::text::{Line, Span};
4use ratatui::widgets::{Block, Borders, List, ListItem};
5use ratatui::Frame;
6
7use crate::app::App;
8
9pub fn render(app: &mut App, frame: &mut Frame, area: Rect) {
10    let theme = app.theme();
11
12    let block = Block::default()
13        .title(" Editor — Shift+E close ")
14        .borders(Borders::ALL)
15        .border_style(Style::default().fg(theme.border_active))
16        .style(Style::default().bg(theme.bg));
17
18    let items: Vec<ListItem> = std::iter::once(("none", gitkraft_core::Editor::None))
19        .chain(
20            gitkraft_core::EDITOR_NAMES
21                .iter()
22                .enumerate()
23                .map(|(i, name)| (*name, gitkraft_core::Editor::from_index(i))),
24        )
25        .map(|(name, editor)| {
26            let is_selected = editor == app.editor;
27            let marker = if is_selected { "✔ " } else { "  " };
28            let style = if is_selected {
29                Style::default()
30                    .fg(theme.success)
31                    .add_modifier(Modifier::BOLD)
32            } else {
33                Style::default().fg(theme.text_primary)
34            };
35            ListItem::new(Line::from(vec![
36                Span::styled(marker, style),
37                Span::styled(name.to_string(), style),
38            ]))
39        })
40        .collect();
41
42    let list = List::new(items)
43        .block(block)
44        .highlight_style(
45            Style::default()
46                .bg(theme.sel_bg)
47                .add_modifier(Modifier::REVERSED),
48        )
49        .highlight_symbol("▸ ");
50
51    frame.render_stateful_widget(list, area, &mut app.editor_list_state);
52}