diff options
| author | lukeflo | 2024-10-12 21:42:34 +0200 |
|---|---|---|
| committer | lukeflo | 2024-10-12 22:41:38 +0200 |
| commit | 7f13ca33714287501b203f37e61514621d9591cd (patch) | |
| tree | 23d73825a3ede741638736c97d269377151eb462 /src/frontend | |
| parent | 2fa5f8193c2cf3b75f54a37f0f7c4b5ae9d7d665 (diff) | |
| parent | 3ff98d4d74e1297dd71e1dd36ef49ebe2e5f1f91 (diff) | |
| download | bibiman-7f13ca33714287501b203f37e61514621d9591cd.tar.gz bibiman-7f13ca33714287501b203f37e61514621d9591cd.zip | |
Merge branch 'enhance-nested-search'
Completely reworked the search mechanism:
- Always take the current entry table as reference
- No need for many intermediate snapshots of different lists/tables
- Only single snapshot of current entry table when entering search, so deleting of chars will reshow entries
Diffstat (limited to 'src/frontend')
| -rw-r--r-- | src/frontend/app.rs | 12 | ||||
| -rw-r--r-- | src/frontend/entries.rs | 20 | ||||
| -rw-r--r-- | src/frontend/keywords.rs | 51 | ||||
| -rw-r--r-- | src/frontend/ui.rs | 24 |
4 files changed, 36 insertions, 71 deletions
diff --git a/src/frontend/app.rs b/src/frontend/app.rs index ee2ab05..31383c7 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -161,7 +161,7 @@ impl App { if let CurrentArea::TagArea = self.current_area { self.tag_list.tag_list_state.select(Some(0)) } - self.search_struct.filtered_entry_list.clear(); + self.entry_table.entry_table_at_search_start.clear(); self.search_struct.filtered_tag_list.clear(); self.search_struct.inner_search = false; self.former_area = None @@ -175,7 +175,6 @@ impl App { } pub fn scroll_info_down(&mut self) { - // self.entry_table.entry_info_scroll = self.entry_table.entry_info_scroll + 1; self.entry_table.entry_info_scroll = self.entry_table.entry_info_scroll.saturating_add(1); self.entry_table.entry_info_scroll_state = self .entry_table @@ -184,11 +183,6 @@ impl App { } pub fn scroll_info_up(&mut self) { - // if self.entry_table.entry_info_scroll == 0 { - // {} - // } else { - // self.entry_table.entry_info_scroll = self.entry_table.entry_info_scroll - 1; - // } self.entry_table.entry_info_scroll = self.entry_table.entry_info_scroll.saturating_sub(1); self.entry_table.entry_info_scroll_state = self .entry_table @@ -204,6 +198,8 @@ impl App { if let Some(FormerArea::TagArea) = self.former_area { self.search_struct.inner_search = true } + self.entry_table.entry_table_at_search_start = + self.entry_table.entry_table_items.clone(); self.former_area = Some(FormerArea::EntryArea) } else if let CurrentArea::TagArea = self.current_area { self.former_area = Some(FormerArea::TagArea) @@ -221,6 +217,7 @@ impl App { } self.former_area = Some(FormerArea::SearchArea); self.search_struct.search_string.clear(); + self.entry_table.entry_table_at_search_start.clear(); } // Break search: leave search area without filtering list @@ -238,6 +235,7 @@ impl App { self.former_area = None; // If search is canceled, reset default status of struct self.search_struct.search_string.clear(); + self.entry_table.entry_table_at_search_start.clear(); } // Remove last char from search pattern and filter list immidiately diff --git a/src/frontend/entries.rs b/src/frontend/entries.rs index 081de4c..98604f9 100644 --- a/src/frontend/entries.rs +++ b/src/frontend/entries.rs @@ -29,6 +29,7 @@ use std::process::{Command, Stdio}; #[derive(Debug)] pub struct EntryTable { pub entry_table_items: Vec<EntryTableItem>, + pub entry_table_at_search_start: Vec<EntryTableItem>, pub entry_table_state: TableState, pub entry_scroll_state: ScrollbarState, pub entry_info_scroll: u16, @@ -54,6 +55,7 @@ impl FromIterator<Vec<String>> for EntryTable { let entry_info_scroll_state = ScrollbarState::default(); Self { entry_table_items, + entry_table_at_search_start: Vec::new(), entry_table_state, entry_scroll_state, entry_info_scroll: 0, @@ -63,7 +65,7 @@ impl FromIterator<Vec<String>> for EntryTable { } // Define contents of each entry table row -#[derive(Debug)] +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct EntryTableItem { pub authors: String, pub title: String, @@ -248,20 +250,12 @@ impl App { // Search entry list pub fn search_entries(&mut self) { - let orig_list = { - if self.search_struct.inner_search { - let orig_list = &self.search_struct.filtered_entry_list; - orig_list - } else { - let orig_list = &self.biblio_data.entry_list.bibentries; - orig_list - } - }; + // Use snapshot of entry list saved when starting the search + // so deleting a char, will show former entries too + let orig_list = self.entry_table.entry_table_at_search_start.clone(); 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) + self.entry_table.entry_table_items = filtered_list; } // Open file connected with entry through 'file' or 'pdf' field diff --git a/src/frontend/keywords.rs b/src/frontend/keywords.rs index 6aa4068..0363609 100644 --- a/src/frontend/keywords.rs +++ b/src/frontend/keywords.rs @@ -16,7 +16,6 @@ ///// use super::app::{App, FormerArea}; -use super::entries::EntryTable; use crate::backend::search::BibiSearch; use ratatui::widgets::{ListState, ScrollbarState}; @@ -105,47 +104,37 @@ impl App { } pub fn filter_tags_by_entries(&mut self) { - if !self.search_struct.filtered_entry_list.is_empty() { - self.search_struct.filtered_tag_list.clear(); - let orig_list = self.search_struct.filtered_entry_list.clone(); - 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); - } + let mut filtered_keywords: Vec<String> = Vec::new(); + + let orig_list = &self.entry_table.entry_table_items; + + for e in orig_list { + if !e.keywords.is_empty() { + let mut key_vec: Vec<String> = e + .keywords + .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(); + 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); - } + 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) { - let orig_list = { - if self.search_struct.inner_search { - let orig_list = &self.search_struct.filtered_entry_list; - orig_list - } else { - let orig_list = &self.biblio_data.entry_list.bibentries; - orig_list - } - }; + let orig_list = &self.entry_table.entry_table_items; let keyword = self.get_selected_tag(); 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.entry_table.entry_table_items = filtered_list; self.filter_tags_by_entries(); self.toggle_area(); self.former_area = Some(FormerArea::TagArea); diff --git a/src/frontend/ui.rs b/src/frontend/ui.rs index 7edcf43..a328df7 100644 --- a/src/frontend/ui.rs +++ b/src/frontend/ui.rs @@ -258,34 +258,18 @@ impl App { .add_modifier(Modifier::ITALIC) .fg(TEXT_FG_COLOR); let lines = { - let idx = self.entry_table.entry_table_state.selected().unwrap(); - let cur_entry = &self.entry_table.entry_table_items[idx]; // if self.entry_table.entry_table_items.len() > 0 { if self.entry_table.entry_table_state.selected().is_some() { + let idx = self.entry_table.entry_table_state.selected().unwrap(); + let cur_entry = &self.entry_table.entry_table_items[idx]; let mut lines = vec![]; lines.push(Line::from(vec![ Span::styled("Authors: ", style_value), - Span::styled( - // String::from(BibiEntry::get_authors( - // &self.get_selected_citekey(), - // &self.main_biblio.bibliography, - // )), - // Style::new().green(), - cur_entry.authors.clone(), - Style::new().green(), - ), + Span::styled(cur_entry.authors.clone(), Style::new().green()), ])); lines.push(Line::from(vec![ Span::styled("Title: ", style_value), - Span::styled( - // String::from(BibiEntry::get_title( - // &self.get_selected_citekey(), - // &self.main_biblio.bibliography, - // )), - // Style::new().magenta(), - cur_entry.title.clone(), - Style::new().magenta(), - ), + Span::styled(cur_entry.title.clone(), Style::new().magenta()), ])); lines.push(Line::from(vec