diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-20 18:55:41 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-20 18:55:41 +0300 |
| commit | 836fd7e585af15cc1ccb0d4f04586ffec28d2a3c (patch) | |
| tree | a3bf07e7af7ffd884a38fce3d65f8c2243bc0615 /src/ui.rs | |
| parent | be66f33d2acde30d25794bcead991e5e7b7eaff8 (diff) | |
feat: add keybinding v2
refs #154
refs #201
refs #202
refs #219
Diffstat (limited to 'src/ui.rs')
| -rw-r--r-- | src/ui.rs | 63 |
1 files changed, 54 insertions, 9 deletions
@@ -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 => { @@ -851,6 +852,22 @@ mod tests { } #[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(); let lines = release_notes_preview_lines("0.5.0", "herdr update", &palette); @@ -896,6 +913,28 @@ mod tests { } #[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::<String>(); + assert!(rendered.contains("PREFIX")); + } + + #[test] fn keybind_help_shows_unset_for_optional_actions() { let app = crate::app::state::AppState::test_new(); let groups = keybind_help_groups(&app); @@ -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")); } } |
