summaryrefslogtreecommitdiff
path: root/src/list/state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/list/state.rs')
-rw-r--r--src/list/state.rs54
1 files changed, 32 insertions, 22 deletions
diff --git a/src/list/state.rs b/src/list/state.rs
index 9e813a0..be6c42e 100644
--- a/src/list/state.rs
+++ b/src/list/state.rs
@@ -347,34 +347,44 @@ impl<'a> ListState<'a> {
Ok(())
}
- pub fn select_if_matches_search_query(&mut self) {
+ 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,
- })
- .enumerate()
- .find_map(|(i, s)| {
- if s.name.contains(self.search_query.as_str()) {
- Some(i)
- } else {
- None
- }
- });
+ .app_state
+ .exercises()
+ .iter()
+ .filter_map(|exercise| {
+ match self.filter() {
+ Filter::None => Some(exercise),
+ Filter::Done if exercise.done => Some(exercise),
+ Filter::Pending if !exercise.done => Some(exercise),
+ _ => None,
+ }
+ })
+ .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);
+ }
+ }
match idx {
- Some(i) => {
- let exercise_ind = i;
+ Some(x) => {
+ let exercise_ind = x;
self.scroll_state.set_selected(exercise_ind);
- self.update_rows();
}
None => {
- let msg = String::from("[NOT FOUND]") + &self.message.clone();
- self.message.clear();
+ let msg = String::from(" (not found)");
self.message.push_str(&msg);
}
}