diff options
| author | lukeflo | 2024-10-05 23:33:55 +0200 |
|---|---|---|
| committer | lukeflo | 2024-10-05 23:33:55 +0200 |
| commit | 7369dace2c2584b0302b79eaf15f1945a9dc6e20 (patch) | |
| tree | e900af64b6a10036f2fba8953e0c3cc545b81e0d /src | |
| parent | b97b9c1eb64cb4c22724293a36f488b46354a3ee (diff) | |
| download | bibiman-7369dace2c2584b0302b79eaf15f1945a9dc6e20.tar.gz bibiman-7369dace2c2584b0302b79eaf15f1945a9dc6e20.zip | |
refine search mechanism, filter tag list for available entries
Diffstat (limited to 'src')
| -rw-r--r-- | src/backend/search.rs | 2 | ||||
| -rw-r--r-- | src/frontend/app.rs | 16 | ||||
| -rw-r--r-- | src/frontend/entries.rs | 1 | ||||
| -rw-r--r-- | src/frontend/keywords.rs | 27 |
4 files changed, 37 insertions, 9 deletions
diff --git a/src/backend/search.rs b/src/backend/search.rs index 6afb791..7319acc 100644 --- a/src/backend/search.rs +++ b/src/backend/search.rs @@ -9,6 +9,7 @@ pub struct BibiSearch { pub search_string: String, // Search string show in footer, used for search pub inner_search: bool, // True, if we trigger a search for already filtered list pub filtered_entry_list: Vec<Vec<String>>, // Temporary holds filtered entry list to refilter it + pub filtered_tag_list: Vec<String>, } impl Default for BibiSearch { @@ -17,6 +18,7 @@ impl Default for BibiSearch { search_string: String::new(), inner_search: false, filtered_entry_list: Vec::new(), + filtered_tag_list: Vec::new(), } } } diff --git a/src/frontend/app.rs b/src/frontend/app.rs index fc04f74..00c1b45 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -146,16 +146,14 @@ impl App { } pub fn reset_current_list(&mut self) { - if let CurrentArea::EntryArea = self.current_area { - self.entry_table = - EntryTable::from_iter(self.biblio_data.entry_list.bibentries.clone()); - if self.search_struct.inner_search { - self.tag_list = TagList::from_iter(self.main_biblio.keyword_list.clone()) - } - } else if let CurrentArea::TagArea = self.current_area { - self.tag_list = TagList::from_iter(self.main_biblio.keyword_list.clone()); + self.entry_table = EntryTable::from_iter(self.biblio_data.entry_list.bibentries.clone()); + self.tag_list = TagList::from_iter(self.main_biblio.keyword_list.clone()); + if let CurrentArea::TagArea = self.current_area { self.tag_list.tag_list_state.select(Some(0)) } + self.search_struct.filtered_entry_list.clear(); + self.search_struct.filtered_tag_list.clear(); + self.search_struct.inner_search = false; self.former_area = None } @@ -224,6 +222,7 @@ impl App { self.search_struct.search_string.pop(); if let Some(FormerArea::EntryArea) = self.former_area { self.search_entries(); + self.filter_tags_by_entries(); } else if let Some(FormerArea::TagArea) = self.former_area { self.search_tags(); } @@ -234,6 +233,7 @@ impl App { self.search_struct.search_string.push(search_pattern); if let Some(FormerArea::EntryArea) = self.former_area { self.search_entries(); + self.filter_tags_by_entries(); } else if let Some(FormerArea::TagArea) = self.former_area { self.search_tags(); } diff --git a/src/frontend/entries.rs b/src/frontend/entries.rs index c370507..46adcff 100644 --- a/src/frontend/entries.rs +++ b/src/frontend/entries.rs @@ -195,6 +195,7 @@ impl App { let filtered_list = BibiSearch::search_entry_list(&mut self.search_struct.search_string, orig_list.clone()); //search::search_entry_list(&self.search_string, orig_list.clone()); + self.search_struct.filtered_entry_list = filtered_list.clone(); self.entry_table = EntryTable::from_iter(filtered_list) } } diff --git a/src/frontend/keywords.rs b/src/frontend/keywords.rs index cb0c28f..311366a 100644 --- a/src/frontend/keywords.rs +++ b/src/frontend/keywords.rs @@ -88,7 +88,31 @@ impl App { self.tag_list = TagList::from_iter(filtered_list) } - // Filter the entry list by tags + pub fn filter_tags_by_entries(&mut self) { + if !self.search_struct.filtered_entry_list.is_empty() { + let orig_list = &self.search_struct.filtered_entry_list; + let mut filtered_keywords: Vec<String> = Vec::new(); + + for e in orig_list { + if !e[4].is_empty() { + let mut key_vec: Vec<String> = e[4] + .split(',') + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) + .collect(); + filtered_keywords.append(&mut key_vec); + } + } + + filtered_keywords.sort_by(|a, b| a.to_lowercase().cmp(&b.to_lowercase())); + filtered_keywords.dedup(); + + self.search_struct.filtered_tag_list = filtered_keywords.clone(); + self.tag_list = TagList::from_iter(filtered_keywords); + } + } + + // Filter the entry list by tags when hitting enter // If already inside a filtered tag or entry list, apply the filtering // to the already filtered list only pub fn filter_for_tags(&mut self) { @@ -105,6 +129,7 @@ impl App { let filtered_list = BibiSearch::filter_entries_by_tag(&keyword, &orig_list); self.search_struct.filtered_entry_list = filtered_list; self.entry_table = EntryTable::from_iter(self.search_struct.filtered_entry_list.clone()); + self.filter_tags_by_entries(); self.toggle_area(); self.former_area = Some(FormerArea::TagArea); } |
