From f2be11e36491944e064e293f35e5f21ce9f3dded Mon Sep 17 00:00:00 2001 From: Saurabh Kumar Bajpai Date: Sun, 31 May 2026 14:11:29 +0530 Subject: [PATCH 1/2] fix(ui): add contextual keyboard status hint --- src/ui/draw.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/ui/draw.rs b/src/ui/draw.rs index c55c00d..edfc4ca 100644 --- a/src/ui/draw.rs +++ b/src/ui/draw.rs @@ -386,6 +386,33 @@ fn draw_settings_tab(frame: &mut Frame, app: &App, area: Rect, theme: &crate::co frame.render_widget(paragraph, area); } +fn keyboard_hint(app: &App) -> String { + let keys = &app.config.keys; + + match app.input_mode { + InputMode::Editing => match app.current_tab { + crate::ui::app::Tab::Search => { + format!("Esc to exit search mode • Enter to search • {} to quit", keys.quit) + } + crate::ui::app::Tab::Settings => { + format!("Esc to stop editing • Enter to save • {} to quit", keys.quit) + } + _ => format!("Esc to stop editing • Enter to submit • {} to quit", keys.quit), + }, + InputMode::Normal => match app.current_tab { + crate::ui::app::Tab::Search => format!( + "Press '{}' for help • '{}' to search • '{}' to quit", + keys.help, keys.search_edit, keys.quit + ), + crate::ui::app::Tab::Settings => format!( + "Press '{}' for help • Enter/Space to edit • '{}' to quit", + keys.help, keys.quit + ), + _ => format!("Press '{}' for help • '{}' to quit", keys.help, keys.quit), + }, + } +} + fn draw_status_bar(frame: &mut Frame, app: &App, area: Rect, theme: &crate::config::Theme) { let highlight_color = app.config.get_color(&theme.highlight_color); let secondary_color = app.config.get_color(&theme.text_secondary); @@ -419,8 +446,8 @@ fn draw_status_bar(frame: &mut Frame, app: &App, area: Rect, theme: &crate::conf ), Span::raw(" | "), Span::styled( - "Press '?' for help ", - Style::default().fg(primary_color).add_modifier(Modifier::ITALIC), + keyboard_hint(app), + Style::default().fg(primary_color).add_modifier(Modifier::DIM), ), ]); From 1d493524724cffc4456a65bc640fa2bce8dfbeef Mon Sep 17 00:00:00 2001 From: Saurabh Kumar Bajpai Date: Thu, 4 Jun 2026 02:29:33 +0530 Subject: [PATCH 2/2] test(ui): cover keyboard status hint --- src/ui/draw.rs | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/src/ui/draw.rs b/src/ui/draw.rs index edfc4ca..15481a9 100644 --- a/src/ui/draw.rs +++ b/src/ui/draw.rs @@ -6,7 +6,10 @@ use ratatui::{ widgets::{Block, BorderType, Clear, List, ListItem, Paragraph, Wrap}, }; -use crate::ui::{app::App, input::InputMode}; +use crate::ui::{ + app::{App, Tab}, + input::InputMode, +}; fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect { let popup_layout = Layout::vertical([ @@ -387,24 +390,30 @@ fn draw_settings_tab(frame: &mut Frame, app: &App, area: Rect, theme: &crate::co } fn keyboard_hint(app: &App) -> String { - let keys = &app.config.keys; + keyboard_hint_text(app.input_mode, app.current_tab, &app.config.keys) +} - match app.input_mode { - InputMode::Editing => match app.current_tab { - crate::ui::app::Tab::Search => { +fn keyboard_hint_text( + input_mode: InputMode, + current_tab: Tab, + keys: &crate::config::Keys, +) -> String { + match input_mode { + InputMode::Editing => match current_tab { + Tab::Search => { format!("Esc to exit search mode • Enter to search • {} to quit", keys.quit) } - crate::ui::app::Tab::Settings => { + Tab::Settings => { format!("Esc to stop editing • Enter to save • {} to quit", keys.quit) } _ => format!("Esc to stop editing • Enter to submit • {} to quit", keys.quit), }, - InputMode::Normal => match app.current_tab { - crate::ui::app::Tab::Search => format!( + InputMode::Normal => match current_tab { + Tab::Search => format!( "Press '{}' for help • '{}' to search • '{}' to quit", keys.help, keys.search_edit, keys.quit ), - crate::ui::app::Tab::Settings => format!( + Tab::Settings => format!( "Press '{}' for help • Enter/Space to edit • '{}' to quit", keys.help, keys.quit ), @@ -732,3 +741,26 @@ fn draw_help_overlay(frame: &mut Frame, app: &App, theme: &crate::config::Theme) area, ); } + +#[cfg(test)] +mod tests { + use super::{InputMode, Tab, keyboard_hint_text}; + + fn keys() -> crate::config::Keys { + crate::config::Config::default().keys + } + + #[test] + fn normal_search_hint_includes_help_search_and_quit() { + let hint = keyboard_hint_text(InputMode::Normal, Tab::Search, &keys()); + + assert_eq!(hint, "Press '?' for help • 'e' to search • 'q' to quit"); + } + + #[test] + fn editing_settings_hint_is_contextual() { + let hint = keyboard_hint_text(InputMode::Editing, Tab::Settings, &keys()); + + assert_eq!(hint, "Esc to stop editing • Enter to save • q to quit"); + } +}