diff options
| author | Mo <76752051+mo8it@users.noreply.github.com> | 2024-09-04 00:40:22 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-04 00:40:22 +0200 |
| commit | 20616ff954f19551b7a421193ed915fa9a518915 (patch) | |
| tree | 9b7546034a6a6032ff20b3027f5b6db1e0c4fd3e /src/list | |
| parent | f696d9827023af13489015db8b9f3ab4fce6fee5 (diff) | |
| parent | f463cf86627411696922bd703e8c875eec7b367b (diff) | |
Merge pull request #2098 from frroossst/main
Made the list of exercises searchable, ref #2093
Diffstat (limited to 'src/list')
| -rw-r--r-- | src/list/scroll_state.rs | 2 | ||||
| -rw-r--r-- | src/list/state.rs | 33 |
2 files changed, 34 insertions, 1 deletions
diff --git a/src/list/scroll_state.rs b/src/list/scroll_state.rs index 25a7373..2c02ed4 100644 --- a/src/list/scroll_state.rs +++ b/src/list/scroll_state.rs @@ -46,7 +46,7 @@ impl ScrollState { self.selected } - fn set_selected(&mut self, selected: usize) { + pub fn set_selected(&mut self, selected: usize) { self.selected = Some(selected); self.update_offset(); } diff --git a/src/list/state.rs b/src/list/state.rs index 7a2d3bf..60077c7 100644 --- a/src/list/state.rs +++ b/src/list/state.rs @@ -44,6 +44,7 @@ pub struct ListState<'a> { term_width: u16, term_height: u16, show_footer: bool, + pub search_query: String, } impl<'a> ListState<'a> { @@ -76,6 +77,7 @@ impl<'a> ListState<'a> { term_width: 0, term_height: 0, show_footer: true, + search_query: String::new(), }; slf.set_term_size(width, height); @@ -345,6 +347,37 @@ impl<'a> ListState<'a> { Ok(()) } + pub fn apply_search_query(&mut self) { + self.message.push_str("search:"); + self.message.push_str(&self.search_query); + self.message.push('|'); + + if self.search_query.is_empty() { + return; + } + + let idx = self + .app_state + .exercises() + .iter() + .filter(|exercise| match self.filter() { + Filter::None => true, + Filter::Done => exercise.done, + Filter::Pending => !exercise.done, + }) + .position(|exercise| exercise.name.contains(self.search_query.as_str())); + + match idx { + Some(exercise_ind) => { + self.scroll_state.set_selected(exercise_ind); + } + None => { + let msg = String::from(" (not found)"); + self.message.push_str(&msg); + } + } + } + // Return `true` if there was something to select. pub fn selected_to_current_exercise(&mut self) -> Result<bool> { let Some(selected) = self.scroll_state.selected() else { |
