This repository has been archived on 2026-01-13. You can view files and clone it, but cannot push or open issues or pull requests.
rmptui/src/event/search_keys.rs

111 lines
3.3 KiB
Rust
Executable File

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(())
}