aboutsummaryrefslogtreecommitdiff
path: root/src/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend')
-rw-r--r--src/frontend/app.rs117
-rw-r--r--src/frontend/handler.rs74
-rw-r--r--src/frontend/ui.rs2
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);