From 836fd7e585af15cc1ccb0d4f04586ffec28d2a3c Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Wed, 20 May 2026 18:55:41 +0300 Subject: feat: add keybinding v2 refs #154 refs #201 refs #202 refs #219 --- src/ui.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 9 deletions(-) (limited to 'src/ui.rs') diff --git a/src/ui.rs b/src/ui.rs index ed52660e..050cf194 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -23,7 +23,7 @@ use self::dialogs::{render_confirm_close_overlay, render_rename_overlay}; use self::keybind_help::render_keybind_help_overlay; use self::menus::{ render_context_menu, render_global_launcher_menu, render_navigate_overlay, - render_resize_overlay, + render_prefix_overlay, render_resize_overlay, }; use self::mobile::{ compute_mobile_header_hit_areas, is_mobile_width, mobile_switcher_max_scroll_for_height, @@ -311,6 +311,7 @@ pub fn render(app: &AppState, frame: &mut Frame) { render_mobile_panel(app, frame, frame.area()) } Mode::Navigate => render_navigate_overlay(app, frame, terminal_area), + Mode::Prefix => render_prefix_overlay(app, frame, terminal_area), Mode::Resize => render_resize_overlay(app, frame, terminal_area), Mode::ConfirmClose => render_confirm_close_overlay(app, frame, terminal_area), Mode::ContextMenu => { @@ -850,6 +851,22 @@ mod tests { assert_eq!(lines[0].1.spans[1].style.bg, Some(palette.surface0)); } + #[test] + fn release_notes_config_inline_code_uses_nonbreaking_spaces() { + let palette = Palette::catppuccin(); + let lines = release_notes_lines("- After: `new_tab = \"prefix+c\"`", &palette); + + assert_eq!(lines.len(), 1); + assert_eq!( + lines[0].1.spans[2].content.as_ref(), + "new_tab\u{00a0}=\u{00a0}\"prefix+c\"" + ); + assert_eq!( + line_text(&lines[0].1).replace('\u{00a0}', " "), + " • After: new_tab = \"prefix+c\"" + ); + } + #[test] fn release_notes_preview_lines_show_update_steps() { let palette = Palette::catppuccin(); @@ -895,6 +912,28 @@ mod tests { assert_eq!(line_text(&lines[2].1), "▏ second"); } + #[test] + fn prefix_mode_renders_prefix_indicator() { + let mut app = crate::app::state::AppState::test_new(); + app.mode = Mode::Prefix; + app.view.terminal_area = ratatui::layout::Rect::new(0, 0, 60, 4); + let mut terminal = ratatui::Terminal::new(ratatui::backend::TestBackend::new(60, 4)) + .expect("test terminal"); + + terminal + .draw(|frame| render_prefix_overlay(&app, frame, app.view.terminal_area)) + .expect("draw prefix overlay"); + + let rendered = terminal + .backend() + .buffer() + .content() + .iter() + .map(|cell| cell.symbol()) + .collect::(); + assert!(rendered.contains("PREFIX")); + } + #[test] fn keybind_help_shows_unset_for_optional_actions() { let app = crate::app::state::AppState::test_new(); @@ -917,13 +956,19 @@ mod tests { assert!(workspace_tab.contains(&("unset".to_string(), "next workspace"))); assert!(workspace_tab.contains(&("unset".to_string(), "previous agent"))); assert!(workspace_tab.contains(&("unset".to_string(), "next agent"))); - assert!(workspace_tab.contains(&("unset".to_string(), "rename tab"))); - assert!(workspace_tab.contains(&("unset".to_string(), "previous tab"))); - assert!(workspace_tab.contains(&("unset".to_string(), "next tab"))); - assert!(workspace_tab.contains(&("unset".to_string(), "close tab"))); - assert!(panes.contains(&("unset".to_string(), "focus pane left"))); - assert!(panes.contains(&("unset".to_string(), "focus pane down"))); - assert!(panes.contains(&("unset".to_string(), "focus pane up"))); - assert!(panes.contains(&("unset".to_string(), "focus pane right"))); + assert!(workspace_tab.contains(&("unset".to_string(), "focus agent 1-9"))); + assert!(workspace_tab.contains(&("unset".to_string(), "switch workspace 1-9"))); + assert!(panes + .iter() + .any(|(key, label)| key == "prefix+h" && *label == "focus pane left")); + assert!(panes + .iter() + .any(|(key, label)| key == "prefix+j" && *label == "focus pane down")); + assert!(panes + .iter() + .any(|(key, label)| key == "prefix+k" && *label == "focus pane up")); + assert!(panes + .iter() + .any(|(key, label)| key == "prefix+l" && *label == "focus pane right")); } } -- cgit v1.2.3