aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlukeflo2024-09-30 13:25:17 +0200
committerlukeflo2024-09-30 13:25:17 +0200
commitd3dbd1a7633f13280145024ac1d668b5a820f5ed (patch)
tree37e6400df6d423172d349dfbe9be242d930dee2a
parentadaeba1a907dfee5f33afe832e9e9a7e9f59b1f2 (diff)
downloadbibiman-d3dbd1a7633f13280145024ac1d668b5a820f5ed.tar.gz
bibiman-d3dbd1a7633f13280145024ac1d668b5a820f5ed.zip
Finish framework for searching list/table entries
-rw-r--r--Cargo.toml1
-rw-r--r--src/backend/search.rs13
-rw-r--r--src/frontend/app.rs109
-rw-r--r--src/frontend/handler.rs35
-rw-r--r--src/frontend/ui.rs10
-rw-r--r--src/main.rs2
6 files changed, 99 insertions, 71 deletions
diff --git a/Cargo.toml b/Cargo.toml
index cc62a61..5338522 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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(())
}