aboutsummaryrefslogtreecommitdiff
path: root/src/event_handler/search_keys.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/event_handler/search_keys.rs')
-rw-r--r--src/event_handler/search_keys.rs110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/event_handler/search_keys.rs b/src/event_handler/search_keys.rs
new file mode 100644
index 0000000..db59fa5
--- /dev/null
+++ b/src/event_handler/search_keys.rs
@@ -0,0 +1,110 @@
+use crate::{
+ app::{App, AppResult, SelectedTab},
+ ui::InputMode,
+};
+use crossterm::event::{KeyCode, KeyEvent};
+use rust_fuzzy_search::{self, fuzzy_search_sorted};
+
+pub fn handle_search_keys(key_event: KeyEvent, app: &mut App) -> AppResult<()> {
+ match app.selected_tab {
+ SelectedTab::DirectoryBrowser => {
+ let list: Vec<&str> = app
+ .browser
+ .filetree
+ .iter()
+ .map(|(_, f)| f.as_str())
+ .collect::<Vec<&str>>();
+
+ let res: Vec<(&str, f32)> = fuzzy_search_sorted(&app.search_input, &list);
+ let res = res.iter().map(|(x, _)| *x).collect::<Vec<&str>>();
+
+ for (i, (_, item)) in app.browser.filetree.iter().enumerate() {
+ if item.contains(res.first().unwrap()) {
+ app.browser.selected = i;
+ }
+ }
+ }
+
+ SelectedTab::Queue => {
+ let list: Vec<&str> = app
+ .queue_list
+ .list
+ .iter()
+ .map(|f| f.file.as_str())
+ .collect::<Vec<&str>>();
+ let res: Vec<(&str, f32)> = fuzzy_search_sorted(&app.search_input, &list);
+ let res = res.iter().map(|(x, _)| *x).collect::<Vec<&str>>();
+
+ for (i, item) in app.queue_list.list.iter().enumerate() {
+ if item.file.contains(res.first().unwrap()) {
+ app.queue_list.index = i;
+ }
+ }
+ }
+
+ SelectedTab::Playlists => {
+ let list: Vec<&str> = app
+ .pl_list
+ .list
+ .iter()
+ .map(|f| f.as_str())
+ .collect::<Vec<&str>>();
+ let res: Vec<(&str, f32)> = fuzzy_search_sorted(&app.search_input, &list);
+ let res = res.iter().map(|(x, _)| *x).collect::<Vec<&str>>();
+
+ for (i, item) in app.pl_list.list.iter().enumerate() {
+ if item.contains(res.first().unwrap()) {
+ app.pl_list.index = i;
+ }
+ }
+ }
+ }
+
+ // Keybind for searching
+ //
+ // Keybinds for when the search prompt is visible
+ match key_event.code {
+ KeyCode::Esc => {
+ app.inputmode = InputMode::Normal;
+ }
+ KeyCode::Char(to_insert) => {
+ app.enter_char(to_insert);
+ }
+ KeyCode::Enter => {
+ let list: Vec<&str> = app
+ .browser
+ .filetree
+ .iter()
+ .map(|(_, f)| f.as_str())
+ .collect::<Vec<&str>>();
+
+ let res: Vec<(&str, f32)> = fuzzy_search_sorted(&app.search_input, &list);
+ let (res, _) = res.first().unwrap();
+
+ for (i, (_, item)) in app.browser.filetree.iter().enumerate() {
+ if item.contains(res) {
+ app.browser.selected = i;
+ }
+ }
+
+ app.search_input.clear();
+ app.reset_cursor();
+ app.inputmode = InputMode::Normal;
+ }
+
+ KeyCode::Backspace => {
+ app.delete_char();
+ }
+
+ KeyCode::Left => {
+ app.move_cursor_left();
+ }
+
+ KeyCode::Right => {
+ app.move_cursor_right();
+ }
+
+ _ => {}
+ }
+ Ok(())
+}