aboutsummaryrefslogtreecommitdiff
path: root/src/ui.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-20 18:55:41 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-20 18:55:41 +0300
commit836fd7e585af15cc1ccb0d4f04586ffec28d2a3c (patch)
treea3bf07e7af7ffd884a38fce3d65f8c2243bc0615 /src/ui.rs
parentbe66f33d2acde30d25794bcead991e5e7b7eaff8 (diff)
feat: add keybinding v2
refs #154 refs #201 refs #202 refs #219
Diffstat (limited to 'src/ui.rs')
-rw-r--r--src/ui.rs63
1 files changed, 54 insertions, 9 deletions
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 => {
@@ -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"));
}
}