diff --git a/src/list.rs b/src/list.rs index 0f7b9bdd..753b9e02 100644 --- a/src/list.rs +++ b/src/list.rs @@ -168,7 +168,9 @@ impl CustomList { } items } else { - self.filtered_items + let mut sorted_items = self.filtered_items.clone(); + sorted_items.sort_by(|a, b| a.name.cmp(b.name)); + sorted_items .iter() .map(|node| { Line::from(format!("{} {}", state.theme.cmd_icon, node.name)) @@ -238,6 +240,15 @@ impl CustomList { } } + /// Resets the selection to the first item + pub fn reset_selection(&mut self) { + if !self.filtered_items.is_empty() { + self.list_state.select(Some(0)); + } else { + self.list_state.select(None); + } + } + /// Handle key events, we are only interested in `Press` and `Repeat` events pub fn handle_key(&mut self, event: KeyEvent, state: &AppState) -> Option { if event.kind == KeyEventKind::Release { @@ -310,8 +321,11 @@ impl CustomList { } fn try_scroll_up(&mut self) { - self.list_state - .select(Some(self.list_state.selected().unwrap().saturating_sub(1))); + if let Some(selected) = self.list_state.selected() { + if selected > 0 { + self.list_state.select(Some(selected.saturating_sub(1))); + } + } } fn try_scroll_down(&mut self) { @@ -335,8 +349,6 @@ impl CustomList { self.list_state .select(Some((curr_selection + 1).min(count))); } - } else if count > 0 { - self.list_state.select(Some(0)); } } diff --git a/src/main.rs b/src/main.rs index c1122acb..b6a175b7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -162,7 +162,10 @@ fn run(terminal: &mut Terminal, state: &AppState) -> io::Result<( search_input = String::new(); in_search_mode = false } - KeyCode::Enter => in_search_mode = false, + KeyCode::Enter => { + in_search_mode = false; + custom_list.reset_selection(); + } _ => {} } } else if let Some(cmd) = custom_list.handle_key(key, state) {