gitkraft_tui/features/editor/
view.rs1use 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}