aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlukeflo2024-10-05 23:33:55 +0200
committerlukeflo2024-10-05 23:33:55 +0200
commit7369dace2c2584b0302b79eaf15f1945a9dc6e20 (patch)
treee900af64b6a10036f2fba8953e0c3cc545b81e0d /src
parentb97b9c1eb64cb4c22724293a36f488b46354a3ee (diff)
downloadbibiman-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.rs2
-rw-r--r--src/frontend/app.rs16
-rw-r--r--src/frontend/entries.rs1
-rw-r--r--src/frontend/keywords.rs27
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);
}