diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-02 22:49:03 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-02 23:25:05 +0300 |
| commit | 1eb7dac77e7b62ece76c43d75a349580f936b2c6 (patch) | |
| tree | fb12b872ef6c23acc98292ef9077eb8206aa0c89 /src | |
| parent | 0165c333ddf0707ed4455f48048feb50bd6500ba (diff) | |
add close action button to keybind help
Diffstat (limited to 'src')
| -rw-r--r-- | src/app/input.rs | 43 | ||||
| -rw-r--r-- | src/ui.rs | 32 |
2 files changed, 67 insertions, 8 deletions
diff --git a/src/app/input.rs b/src/app/input.rs index 0e6c5b62..d3a94596 100644 --- a/src/app/input.rs +++ b/src/app/input.rs @@ -1494,7 +1494,25 @@ impl AppState { && mouse.column < rect.x + rect.width && mouse.row >= rect.y && mouse.row < rect.y + rect.height; - if !inside { + let inner = Rect::new( + rect.x + 1, + rect.y + 1, + rect.width.saturating_sub(2), + rect.height.saturating_sub(2), + ); + let close = crate::ui::keybind_help_close_button_rect(Rect::new( + inner.x, + inner.y, + inner.width, + 1, + )); + if modal_action_from_buttons( + mouse.column, + mouse.row, + &[(close, ModalAction::Close)], + ) == Some(ModalAction::Close) + || !inside + { leave_modal(self); } } @@ -2506,6 +2524,29 @@ mod tests { } #[test] + fn clicking_keybind_help_close_button_closes_overlay() { + let mut app = app_for_mouse_test(); + app.state.mode = Mode::KeybindHelp; + + let rect = app.state.keybind_help_rect(); + let inner = Rect::new( + rect.x + 1, + rect.y + 1, + rect.width.saturating_sub(2), + rect.height.saturating_sub(2), + ); + let close = + crate::ui::keybind_help_close_button_rect(Rect::new(inner.x, inner.y, inner.width, 1)); + app.handle_mouse(mouse( + MouseEventKind::Down(MouseButton::Left), + close.x, + close.y, + )); + + assert_eq!(app.state.mode, Mode::Navigate); + } + + #[test] fn hovering_context_menu_updates_highlight() { let mut app = app_for_mouse_test(); app.state.context_menu = Some(ContextMenuState { @@ -1624,6 +1624,18 @@ fn keybind_help_groups(app: &AppState) -> Vec<(&'static str, Vec<(String, &'stat groups } +pub(crate) fn keybind_help_close_button_rect(area: Rect) -> Rect { + action_button_row_rects( + area, + &[ActionButtonSpec { + hint: Some("esc"), + label: "close", + }], + 0, + 0, + )[0] +} + fn render_keybind_help_overlay(app: &AppState, frame: &mut Frame) { let rect = app.keybind_help_rect(); let Some(inner) = render_panel_shell(frame, rect, app.palette.accent, app.palette.panel_bg) @@ -1644,14 +1656,20 @@ fn render_keybind_help_overlay(app: &AppState, frame: &mut Frame) { .fg(app.palette.mauve) .add_modifier(Modifier::BOLD); let label_style = Style::default().fg(app.palette.text); - let hint_style = Style::default().fg(app.palette.overlay0); - + let header = Rect::new(inner.x, inner.y, inner.width, 1); frame.render_widget( - Paragraph::new(Line::from(vec![ - Span::styled(" keybinds", title_style), - Span::styled(" esc to close", hint_style), - ])), - Rect::new(inner.x, inner.y, inner.width, 1), + Paragraph::new(Line::from(vec![Span::styled(" keybinds", title_style)])), + header, + ); + render_action_button( + frame, + keybind_help_close_button_rect(header), + Some("esc"), + "close", + Style::default() + .fg(app.palette.text) + .bg(app.palette.surface0) + .add_modifier(Modifier::BOLD), ); let groups = keybind_help_groups(app); |
