diff --git a/tui/src/hint.rs b/tui/src/hint.rs index 00ac4fae5..9d10e4dac 100644 --- a/tui/src/hint.rs +++ b/tui/src/hint.rs @@ -120,7 +120,7 @@ pub fn draw_shortcuts(state: &AppState, frame: &mut Frame, area: Rect) { hints.push(Shortcut::new(vec!["q", "CTRL-c"], "Exit linutil")); if state.at_root() { - hints.push(Shortcut::new(vec!["h", "Left", "Tab"], "Focus tab list")); + hints.push(Shortcut::new(vec!["h", "Left"], "Focus tab list")); hints.push(get_list_item_shortcut(state)); } else { if state.selected_item_is_up_dir() { @@ -136,14 +136,14 @@ pub fn draw_shortcuts(state: &AppState, frame: &mut Frame, area: Rect) { hints.push(Shortcut::new(vec!["d"], "Command Description")); } } - hints.push(Shortcut::new(vec!["Tab"], "Focus tab list")); }; hints.push(Shortcut::new(vec!["k", "Up"], "Select item above")); hints.push(Shortcut::new(vec!["j", "Down"], "Select item below")); hints.push(Shortcut::new(vec!["t"], "Next theme")); hints.push(Shortcut::new(vec!["T"], "Previous theme")); - + hints.push(Shortcut::new(vec!["Tab"], "Next tab")); + hints.push(Shortcut::new(vec!["Shift-Tab"], "Previous tab")); ShortcutList { scope_name: "Item list", hints, @@ -154,11 +154,13 @@ pub fn draw_shortcuts(state: &AppState, frame: &mut Frame, area: Rect) { scope_name: "Tab list", hints: vec![ Shortcut::new(vec!["q", "CTRL-c"], "Exit linutil"), - Shortcut::new(vec!["l", "Right", "Tab", "Enter"], "Focus action list"), + Shortcut::new(vec!["l", "Right", "Enter"], "Focus action list"), Shortcut::new(vec!["k", "Up"], "Select item above"), Shortcut::new(vec!["j", "Down"], "Select item below"), Shortcut::new(vec!["t"], "Next theme"), Shortcut::new(vec!["T"], "Previous theme"), + Shortcut::new(vec!["Tab"], "Next tab"), + Shortcut::new(vec!["Shift-Tab"], "Previous tab"), ], }, diff --git a/tui/src/state.rs b/tui/src/state.rs index 4613be182..d5d943a71 100644 --- a/tui/src/state.rs +++ b/tui/src/state.rs @@ -247,6 +247,31 @@ impl AppState { return true; } + // Handle key only when Tablist or List is focused + // Prevents exiting the application even when a command is running + // Add keys here which should work on both TabList and List + if matches!(self.focus, Focus::TabList | Focus::List) { + match key.code { + KeyCode::Tab => { + if self.current_tab.selected().unwrap() == self.tabs.len() - 1 { + self.current_tab.select_first(); // Select first tab when it is at last + } else { + self.current_tab.select_next(); + } + self.refresh_tab(); + } + KeyCode::BackTab => { + if self.current_tab.selected().unwrap() == 0 { + self.current_tab.select(Some(self.tabs.len() - 1)); // Select last tab when it is at first + } else { + self.current_tab.select_previous(); + } + self.refresh_tab(); + } + _ => {} + } + } + match &mut self.focus { Focus::FloatingWindow(command) => { if command.handle_key_event(key) { @@ -268,9 +293,7 @@ impl AppState { } Focus::TabList => match key.code { - KeyCode::Enter | KeyCode::Char('l') | KeyCode::Right | KeyCode::Tab => { - self.focus = Focus::List - } + KeyCode::Enter | KeyCode::Char('l') | KeyCode::Right => self.focus = Focus::List, KeyCode::Char('j') | KeyCode::Down if self.current_tab.selected().unwrap() + 1 < self.tabs.len() => @@ -304,7 +327,6 @@ impl AppState { } } KeyCode::Char('/') => self.enter_search(), - KeyCode::Tab => self.focus = Focus::TabList, KeyCode::Char('t') => self.theme.next(), KeyCode::Char('T') => self.theme.prev(), _ => {}