use crate::app::{App, FrameState, GoToHit};
use crate::ui::{helpers, theme::Palette};
use ratatui::{
Frame,
layout::{Alignment, Constraint, Direction, Layout, Rect},
style::Style,
text::{Line, Span},
widgets::{Block, BorderType, Borders, Clear, Paragraph},
};
pub(super) fn render_goto_overlay(
frame: &mut Frame<'_>,
area: Rect,
app: &App,
state: &mut FrameState,
palette: Palette,
) {
let row_count = app.goto_row_count().max(1);
let popup_width = area.width.saturating_sub(8).clamp(70, 112);
let popup_height = 5;
let popup = Rect {
x: area.x + area.width.saturating_sub(popup_width) / 2,
y: area.y + area.height.saturating_sub(popup_height + 2),
width: popup_width.min(area.width.saturating_sub(2)).max(10),
height: popup_height.min(area.height.saturating_sub(2)).max(4),
};
state.goto_panel = Some(popup);
frame.render_widget(Clear, popup);
frame.render_widget(
Block::default()
.title(Span::styled(
format!(" {} ", app.goto_title()),
Style::default().fg(palette.muted),
))
.title_alignment(Alignment::Center)
.borders(Borders::ALL)
.border_type(BorderType::Rounded)
.style(Style::default().bg(palette.chrome_alt).fg(palette.text))
.border_style(Style::default().fg(palette.border)),
popup,
);
let inner = helpers::inner_with_padding(popup);
let rows = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(1),
Constraint::Length(1),
Constraint::Length(1),
])
.split(inner);
let action_row = rows[1];
let columns = Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Percentage(20),
Constraint::Length(1),
Constraint::Percentage(20),
Constraint::Length(1),
Constraint::Percentage(20),
Constraint::Length(1),
Constraint::Percentage(20),
Constraint::Length(1),
Constraint::Percentage(20),
])
.split(action_row);
for index in 0..row_count.min(5) {
let rect = columns[index * 2];
let shortcut = app
.goto_row_shortcut(index)
.unwrap_or('?')
.to_ascii_lowercase();
let label = helpers::clamp_label(
app.goto_row_label(index),
rect.width.saturating_sub(5) as usize,
);
frame.render_widget(
Paragraph::new(Line::from(vec![
Span::styled(shortcut.to_string(), Style::default().fg(palette.accent)),
Span::styled(" -> ", Style::default().fg(palette.muted)),
Span::styled(label, Style::default().fg(palette.text)),
]))
.alignment(Alignment::Center)
.style(Style::default().bg(palette.chrome_alt).fg(palette.text)),
rect,
);
state.goto_hits.push(GoToHit {
rect: Rect {
x: rect.x,
y: inner.y,
width: rect.width,
height: inner.height,
},
index,
});
}
}