aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-02 22:49:03 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-02 23:25:05 +0300
commit1eb7dac77e7b62ece76c43d75a349580f936b2c6 (patch)
treefb12b872ef6c23acc98292ef9077eb8206aa0c89 /src
parent0165c333ddf0707ed4455f48048feb50bd6500ba (diff)
add close action button to keybind help
Diffstat (limited to 'src')
-rw-r--r--src/app/input.rs43
-rw-r--r--src/ui.rs32
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 {
diff --git a/src/ui.rs b/src/ui.rs
index 20f37b5a..c48d1e7c 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -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);