diff options
| author | lukeflo | 2024-09-30 13:25:17 +0200 |
|---|---|---|
| committer | lukeflo | 2024-09-30 13:25:17 +0200 |
| commit | d3dbd1a7633f13280145024ac1d668b5a820f5ed (patch) | |
| tree | 37e6400df6d423172d349dfbe9be242d930dee2a | |
| parent | adaeba1a907dfee5f33afe832e9e9a7e9f59b1f2 (diff) | |
| download | bibiman-d3dbd1a7633f13280145024ac1d668b5a820f5ed.tar.gz bibiman-d3dbd1a7633f13280145024ac1d668b5a820f5ed.zip | |
Finish framework for searching list/table entries
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/backend/search.rs | 13 | ||||
| -rw-r--r-- | src/frontend/app.rs | 109 | ||||
| -rw-r--r-- | src/frontend/handler.rs | 35 | ||||
| -rw-r--r-- | src/frontend/ui.rs | 10 | ||||
| -rw-r--r-- | src/main.rs | 2 |
6 files changed, 99 insertions, 71 deletions
@@ -12,7 +12,6 @@ crossterm = { version = "0.28.1", features = ["event-stream"] } futures = "0.3.30" itertools = "0.13.0" nucleo-matcher = "0.3.1" -# ratatui = "0.28.1" ratatui = { version = "0.28.1", features = ["unstable-rendered-line-info"]} regex = "1.10.6" sarge = "7.2.5" diff --git a/src/backend/search.rs b/src/backend/search.rs index ae874db..c3b5816 100644 --- a/src/backend/search.rs +++ b/src/backend/search.rs @@ -38,3 +38,16 @@ pub fn search_entry_list(search_pattern: &str, orig_list: Vec<Vec<String>>) -> V } filtered_list } + +pub fn search_tag_list(search_pattern: &str, orig_list: Vec<String>) -> Vec<String> { + // Set up matcher (TODO: One time needed only) + let mut matcher = Matcher::new(Config::DEFAULT); + + // Filter the list items by search pattern + let filtered_matches: Vec<String> = { + let matches = Pattern::parse(search_pattern, CaseMatching::Ignore, Normalization::Smart) + .match_list(orig_list, &mut matcher); + matches.into_iter().map(|f| f.0.to_string()).collect() + }; + filtered_matches +} diff --git a/src/frontend/app.rs b/src/frontend/app.rs index 970a064..1105901 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -204,6 +204,8 @@ impl App { // Handles the tick event of the terminal. pub fn tick(&self) {} + // General commands + // Set running to false to quit the application. pub fn quit(&mut self) { self.running = false; @@ -241,6 +243,13 @@ impl App { } } + // Yank the passed string to system clipboard + pub fn yank_text(selection: &str) { + let mut clipboard = Clipboard::new().unwrap(); + let yanked_text = selection.to_string(); + clipboard.set_text(yanked_text).unwrap(); + } + pub fn scroll_info_down(&mut self) { self.scroll_info = self.scroll_info + 1; } @@ -262,47 +271,50 @@ impl App { // self.tag_list.tag_list_state.select(None); } - pub fn select_next(&mut self) { + // Tag List commands + + // Movement + pub fn select_next_tag(&mut self) { + self.tag_list.tag_list_state.select_next(); + } + + pub fn select_previous_tag(&mut self) { + self.tag_list.tag_list_state.select_previous(); + } + + pub fn select_first_tag(&mut self) { + self.tag_list.tag_list_state.select_first(); + } + + pub fn select_last_tag(&mut self) { + self.tag_list.tag_list_state.select_last(); + } + + pub fn reset_taglist(&mut self) { + self.tag_list = TagList::from_iter(self.main_biblio.citekeys.clone()) + } + + // Entry Table commands + + // Movement + pub fn select_next_entry(&mut self) { self.scroll_info = 0; - match self.current_area { - CurrentArea::EntryArea => self.entry_table.entry_table_state.select_next(), - CurrentArea::TagArea => self.tag_list.tag_list_state.select_next(), - _ => {} - } - // self.tag_list.tag_list_state.select_next(); + self.entry_table.entry_table_state.select_next(); } - pub fn select_previous(&mut self) { + + pub fn select_previous_entry(&mut self) { self.scroll_info = 0; - match self.current_area { - CurrentArea::EntryArea => self.entry_table.entry_table_state.select_previous(), - CurrentArea::TagArea => self.tag_list.tag_list_state.select_previous(), - _ => {} - } - // self.tag_list.tag_list_state.select_previous(); + self.entry_table.entry_table_state.select_previous(); } - pub fn select_first(&mut self) { - match self.current_area { - CurrentArea::EntryArea => { - self.scroll_info = 0; - self.entry_table.entry_table_state.select_first(); - } - CurrentArea::TagArea => self.tag_list.tag_list_state.select_first(), - _ => {} - } - // self.tag_list.tag_list_state.select_first(); + pub fn select_first_entry(&mut self) { + self.scroll_info = 0; + self.entry_table.entry_table_state.select_first(); } - pub fn select_last(&mut self) { - match self.current_area { - CurrentArea::EntryArea => { - self.scroll_info = 0; - self.entry_table.entry_table_state.select_last(); - } - CurrentArea::TagArea => self.tag_list.tag_list_state.select_last(), - _ => {} - } - // self.tag_list.tag_list_state.select_last(); + pub fn select_last_entry(&mut self) { + self.scroll_info = 0; + self.entry_table.entry_table_state.select_last(); } // Get the citekey of the selected entry @@ -312,21 +324,26 @@ impl App { citekey } - // Yank the passed string to system clipboard - pub fn yank_text(selection: &str) { - let mut clipboard = Clipboard::new().unwrap(); - let yanked_text = selection.to_string(); - clipboard.set_text(yanked_text).unwrap(); + // Reset Entry Table to initial state + pub fn reset_entry_table(&mut self) { + self.entry_table = EntryTable::from_iter(self.biblio_data.entry_list.bibentries.clone()) } // Search entry list pub fn search_entries(&mut self) { - let orig_list = &self.biblio_data.entry_list.bibentries; - let filtered_list = search::search_entry_list(&self.search_string, orig_list.clone()); - self.entry_table = EntryTable::from_iter(filtered_list) - } - - pub fn reset_entry_table(&mut self) { - self.entry_table = EntryTable::from_iter(self.biblio_data.entry_list.bibentries.clone()) + match self.former_area { + Some(FormerArea::EntryArea) => { + let orig_list = &self.biblio_data.entry_list.bibentries; + let filtered_list = + search::search_entry_list(&self.search_string, orig_list.clone()); + self.entry_table = EntryTable::from_iter(filtered_list) + } + Some(FormerArea::TagArea) => { + let orig_list = &self.main_biblio.citekeys; + let filtered_list = search::search_tag_list(&self.search_string, orig_list.clone()); + self.tag_list = TagList::from_iter(filtered_list) + } + _ => {} + } } } diff --git a/src/frontend/handler.rs b/src/frontend/handler.rs index 573795c..c3eeed5 100644 --- a/src/frontend/handler.rs +++ b/src/frontend/handler.rs @@ -47,19 +47,16 @@ pub fn handle_key_events(key_event: KeyEvent, app: &mut App) -> AppResult<()> { // Keycodes for the tag area CurrentArea::TagArea => match key_event.code { KeyCode::Char('j') | KeyCode::Down => { - app.select_next(); + app.select_next_tag(); } KeyCode::Char('k') | KeyCode::Up => { - app.select_previous(); - } - KeyCode::Char('h') | KeyCode::Left => { - app.select_none(); + app.select_previous_tag(); } KeyCode::Char('g') | KeyCode::Home => { - app.select_first(); + app.select_first_tag(); } KeyCode::Char('G') | KeyCode::End => { - app.select_last(); + app.select_last_tag(); } KeyCode::Char('/') => { app.former_area = Some(FormerArea::TagArea); @@ -68,24 +65,26 @@ pub fn handle_key_events(key_event: KeyEvent, app: &mut App) -> AppResult<()> { KeyCode::Tab | KeyCode::BackTab => { app.toggle_area(); } + KeyCode::Esc => { + if let Some(FormerArea::SearchArea) = app.former_area { + app.reset_taglist(); + } + } _ => {} }, // Keycodes for the entry area CurrentArea::EntryArea => match key_event.code { KeyCode::Char('j') | KeyCode::Down => { - app.select_next(); + app.select_next_entry(); } KeyCode::Char('k') | KeyCode::Up => { - app.select_previous(); - } - KeyCode::Char('h') | KeyCode::Left => { - app.select_none(); + app.select_previous_entry(); } KeyCode::Char('g') | KeyCode::Home => { - app.select_first(); + app.select_first_entry(); } KeyCode::Char('G') | KeyCode::End => { - app.select_last(); + app.select_last_entry(); } KeyCode::Char('y') => { App::yank_text(&app.get_selected_citekey()); @@ -104,13 +103,17 @@ pub fn handle_key_events(key_event: KeyEvent, app: &mut App) -> AppResult<()> { } _ => {} }, - // Keycodes for the search area (popup) + // Keycodes for the search area (rendered in footer) CurrentArea::SearchArea => match key_event.code { KeyCode::Esc => { app.toggle_area(); + if let Some(FormerArea::EntryArea) = app.former_area { + app.reset_entry_table(); + } else if let Some(FormerArea::TagArea) = app.former_area { + app.reset_taglist(); + } app.former_area = None; app.search_string.clear(); - app.reset_entry_table(); } KeyCode::Enter => { // TODO: run function for filtering the list diff --git a/src/frontend/ui.rs b/src/frontend/ui.rs index 5ca7100..0829227 100644 --- a/src/frontend/ui.rs +++ b/src/frontend/ui.rs @@ -15,7 +15,6 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. ///// -use futures::SinkExt; use ratatui::{ buffer::Buffer, layout::{Constraint, Layout, Rect}, @@ -90,7 +89,6 @@ impl Widget for &mut App { App::render_header(header_area, buf); self.render_footer(footer_area, buf); // Render list area where entry gets selected - // self.render_entry_table(list_area, buf); self.render_entrytable(list_area, buf); // Render infos related to selected entry // TODO: only placeholder at the moment, has to be impl. @@ -152,11 +150,11 @@ impl App { pub fn render_entrytable(&mut self, area: Rect, buf: &mut Buffer) { let block = Block::bordered() // can also be Block::new .title( - Line::raw(" Selection List ") + Line::raw(" Bibliographic Entries ") .centered() + .bold() .fg(Color::Indexed(39)), ) - // .borders(Borders::TOP) // set borders for Block::new .border_set(symbols::border::ROUNDED) .border_style(BOX_BORDER_STYLE_MAIN) .bg(Color::Black); // .bg(NORMAL_ROW_BG); @@ -270,7 +268,7 @@ impl App { // We show the list item's info under the list in this paragraph let block = Block::bordered() - .title(Line::raw(" Entry Information ").centered()) + .title(Line::raw(" Entry Information ").centered().bold()) // .borders(Borders::TOP) .border_set(symbols::border::ROUNDED) .border_style(BOX_BORDER_STYLE_MAIN) @@ -308,7 +306,7 @@ impl App { pub fn render_taglist(&mut self, area: Rect, buf: &mut Buffer) { let block = Block::bordered() - .title(Line::raw(" Tag List ").centered()) + .title(Line::raw(" Keywords ").centered().bold()) .border_set(symbols::border::ROUNDED) .border_style(BOX_BORDER_STYLE_MAIN) .bg(Color::Black); diff --git a/src/main.rs b/src/main.rs index cf7375f..c7007ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -72,7 +72,5 @@ async fn main() -> AppResult<()> { // Exit the user interface. tui.exit()?; - // let idx = &app.entry_table.entry_table_state.selected().unwrap(); - // println!("{:#?}", &app.entry_table.entry_table_items[*idx].citekey); Ok(()) } |
