Codex Handbook
tui/src/bottom_pane/mentions_v2/footer.rs 81 lines
use crossterm::event::KeyCode;use ratatui::buffer::Buffer;use ratatui::layout::Rect;use ratatui::style::Stylize;use ratatui::text::Line;use ratatui::widgets::Widget;use crate::key_hint;use crate::line_truncation::truncate_line_with_ellipsis_if_overflow;use super::search_mode::SearchMode;pub(super) fn render_footer(area: Rect, buf: &mut Buffer, search_mode: SearchMode) {    let right_line = search_mode_indicator_line(search_mode);    let right_width = right_line.width() as u16;    let gap = u16::from(right_width > 0);    let left_width = area.width.saturating_sub(right_width).saturating_sub(gap);    let left_line =        truncate_line_with_ellipsis_if_overflow(footer_hint_line(), left_width as usize);    left_line.render(        Rect {            x: area.x,            y: area.y,            width: left_width,            height: 1,        },        buf,    );    if right_width > 0 && right_width <= area.width {        right_line.render(            Rect {                x: area.x + area.width - right_width,                y: area.y,                width: right_width,                height: 1,            },            buf,        );    }}fn footer_hint_line() -> Line<'static> {    Line::from(vec![        key_hint::plain(KeyCode::Enter).into(),        " insert · ".dim(),        key_hint::plain(KeyCode::Esc).into(),        " close · ".dim(),        key_hint::plain(KeyCode::Left).into(),        "/".dim(),        key_hint::plain(KeyCode::Right).into(),        " switch search modes".dim(),    ])}fn search_mode_indicator_line(active_search_mode: SearchMode) -> Line<'static> {    let modes = [        SearchMode::Results,        SearchMode::FilesystemOnly,        SearchMode::Tools,    ];    let mut spans = Vec::with_capacity(modes.len() * 2 - 1);    for (index, search_mode) in modes.into_iter().enumerate() {        if index > 0 {            spans.push("  ".dim());        }        if search_mode == active_search_mode {            let label = format!("[{}]", search_mode.label());            let span = match search_mode {                SearchMode::Results | SearchMode::FilesystemOnly => label.cyan().bold(),                SearchMode::Tools => label.magenta().bold(),            };            spans.push(span);        } else {            spans.push(format!(" {} ", search_mode.label()).dim());        }    }    Line::from(spans)}