diff options
Diffstat (limited to 'src/frontend')
| -rw-r--r-- | src/frontend/app.rs | 117 | ||||
| -rw-r--r-- | src/frontend/handler.rs | 74 | ||||
| -rw-r--r-- | src/frontend/ui.rs | 2 |
3 files changed, 134 insertions, 59 deletions
diff --git a/src/frontend/app.rs b/src/frontend/app.rs index ed0318f..eeb2d4c 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -16,7 +16,7 @@ ///// use crate::backend::{bib::*, search::BibiSearch}; -use std::error; +use std::{error, net::SocketAddr}; use arboard::Clipboard; use itertools::Itertools; @@ -226,34 +226,81 @@ impl App { // Toggle moveable list between entries and tags pub fn toggle_area(&mut self) { - match self.current_area { - CurrentArea::EntryArea => { - self.current_area = CurrentArea::TagArea; - self.tag_list.tag_list_state.select(Some(0)) - } - CurrentArea::TagArea => { - self.current_area = CurrentArea::EntryArea; - self.tag_list.tag_list_state.select(None) - } - CurrentArea::SearchArea => { - if let Some(former_area) = &self.former_area { - match former_area { - FormerArea::EntryArea => self.current_area = CurrentArea::EntryArea, - FormerArea::TagArea => self.current_area = CurrentArea::TagArea, - _ => {} - } - } - } - CurrentArea::HelpArea => { - if let Some(former_area) = &self.former_area { - match former_area { - FormerArea::EntryArea => self.current_area = CurrentArea::EntryArea, - FormerArea::TagArea => self.current_area = CurrentArea::TagArea, - FormerArea::SearchArea => self.current_area = CurrentArea::SearchArea, - } - } + if let CurrentArea::EntryArea = self.current_area { + self.current_area = CurrentArea::TagArea; + self.tag_list.tag_list_state.select(Some(0)) + } else if let CurrentArea::TagArea = self.current_area { + self.current_area = CurrentArea::EntryArea; + self.tag_list.tag_list_state.select(None) + } + // match self.current_area { + // CurrentArea::EntryArea => { + // self.current_area = CurrentArea::TagArea; + // self.tag_list.tag_list_state.select(Some(0)) + // } + // CurrentArea::TagArea => { + // self.current_area = CurrentArea::EntryArea; + // self.tag_list.tag_list_state.select(None) + // } + // CurrentArea::SearchArea => { + // if let Some(former_area) = &self.former_area { + // match former_area { + // FormerArea::EntryArea => self.current_area = CurrentArea::EntryArea, + // FormerArea::TagArea => self.current_area = CurrentArea::TagArea, + // _ => {} + // } + // } + // } + // CurrentArea::HelpArea => { + // if let Some(former_area) = &self.former_area { + // match former_area { + // FormerArea::EntryArea => self.current_area = CurrentArea::EntryArea, + // FormerArea::TagArea => self.current_area = CurrentArea::TagArea, + // FormerArea::SearchArea => self.current_area = CurrentArea::SearchArea, + // } + // } + // } + // } + } + + // Enter the search area + pub fn enter_search_area(&mut self) { + if let CurrentArea::EntryArea = self.current_area { + if let Some(FormerArea::TagArea) = self.former_area { + self.search_struct.inner_search = true } + self.former_area = Some(FormerArea::EntryArea) + } else if let CurrentArea::TagArea = self.current_area { + self.former_area = Some(FormerArea::TagArea) + } + self.current_area = CurrentArea::SearchArea + } + + // Confirm search: Search former list by pattern + pub fn confirm_search(&mut self) { + if let Some(FormerArea::EntryArea) = self.former_area { + self.current_area = CurrentArea::EntryArea; + } else if let Some(FormerArea::TagArea) = self.former_area { + self.current_area = CurrentArea::TagArea; + self.tag_list.tag_list_state.select(Some(0)) + } + self.former_area = Some(FormerArea::SearchArea); + self.search_struct.search_string.clear(); + } + + // Break search: leave search area without filtering list + pub fn break_search(&mut self) { + if let Some(FormerArea::EntryArea) = self.former_area { + self.current_area = CurrentArea::EntryArea; + self.reset_entry_table(); + } else if let Some(FormerArea::TagArea) = self.former_area { + self.current_area = CurrentArea::TagArea; + self.reset_taglist(); + self.tag_list.tag_list_state.select(Some(0)) } + self.former_area = None; + // If search is canceled, reset default status of struct + self.search_struct.search_string.clear(); } // Yank the passed string to system clipboard @@ -337,6 +384,8 @@ 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.toggle_area(); + self.former_area = Some(FormerArea::TagArea); } // Entry Table commands @@ -374,6 +423,20 @@ impl App { self.entry_table = EntryTable::from_iter(self.biblio_data.entry_list.bibentries.clone()) } + 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.tag_list.tag_list_state.select(Some(0)) + } + self.former_area = None + } + // Search entry list pub fn search_entries(&mut self) { let orig_list = { diff --git a/src/frontend/handler.rs b/src/frontend/handler.rs index cdbd981..5c7519a 100644 --- a/src/frontend/handler.rs +++ b/src/frontend/handler.rs @@ -62,21 +62,27 @@ pub fn handle_key_events(key_event: KeyEvent, app: &mut App) -> AppResult<()> { app.select_last_tag(); } KeyCode::Char('/') => { - app.former_area = Some(FormerArea::TagArea); - app.current_area = CurrentArea::SearchArea; - // app.search_struct.is_search = true; + // app.former_area = Some(FormerArea::TagArea); + // app.current_area = CurrentArea::SearchArea; + app.enter_search_area(); + } + KeyCode::Char('f') | KeyCode::Char('F') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.enter_search_area(); + } } KeyCode::Tab | KeyCode::BackTab => { app.toggle_area(); } KeyCode::Esc => { - app.reset_taglist(); + app.reset_current_list(); + // app.reset_taglist(); } KeyCode::Enter => { app.filter_for_tags(); - app.toggle_area(); + // app.toggle_area(); // app.reset_taglist(); - app.former_area = Some(FormerArea::TagArea); + // app.former_area = Some(FormerArea::TagArea); } _ => {} }, @@ -98,46 +104,52 @@ pub fn handle_key_events(key_event: KeyEvent, app: &mut App) -> AppResult<()> { App::yank_text(&app.get_selected_citekey()); } KeyCode::Char('/') => { - if let Some(FormerArea::TagArea) = app.former_area { - app.search_struct.inner_search = true; + // if let Some(FormerArea::TagArea) = app.former_area { + // app.search_struct.inner_search = true; + // } + // app.former_area = Some(FormerArea::EntryArea); + // app.current_area = CurrentArea::SearchArea; + app.enter_search_area(); + } + KeyCode::Char('f') | KeyCode::Char('F') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.enter_search_area(); } - app.former_area = Some(FormerArea::EntryArea); - app.current_area = CurrentArea::SearchArea; } KeyCode::Tab | KeyCode::BackTab => { app.toggle_area(); } KeyCode::Esc => { - app.reset_entry_table(); - if app.search_struct.inner_search { - app.reset_taglist(); - } - app.former_area = None; + // app.reset_entry_table(); + // if app.search_struct.inner_search { + // app.reset_taglist(); + // } + // app.former_area = None; + app.reset_current_list(); } _ => {} }, // 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; - // If search is canceled, reset default status of struct - BibiSearch::default(); - // app.search_struct.search_string.clear(); - // app.search_struct.is_search = false; - // app.search_struct.filtered_entry_list.clear(); + // 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; + // // If search is canceled, reset default status of struct + // BibiSearch::default(); + app.break_search(); } KeyCode::Enter => { // TODO: run function for filtering the list - app.toggle_area(); - app.former_area = Some(FormerArea::SearchArea); - // app.search_string.clear(); - app.search_struct.search_string.clear(); + // app.toggle_area(); + // app.former_area = Some(FormerArea::SearchArea); + // // app.search_string.clear(); + // app.search_struct.search_string.clear(); + app.confirm_search(); } KeyCode::Backspace => { app.search_struct.search_string.pop(); diff --git a/src/frontend/ui.rs b/src/frontend/ui.rs index 7323917..0e7c219 100644 --- a/src/frontend/ui.rs +++ b/src/frontend/ui.rs @@ -74,7 +74,7 @@ impl Widget for &mut App { Layout::vertical([Constraint::Fill(1), Constraint::Fill(1)]).areas(main_area); let [tag_area, info_area] = - Layout::horizontal([Constraint::Percentage(30), Constraint::Fill(1)]).areas(item_area); + Layout::horizontal([Constraint::Max(25), Constraint::Min(35)]).areas(item_area); // Render header and footer App::render_header(header_area, buf); |
