diff --git a/src/tui.rs b/src/tui.rs index e660142..28b4b61 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -1,10 +1,11 @@ +use std::collections::VecDeque; use std::sync::mpsc; use anyhow::Result; use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyModifiers}; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::style::{Color, Style}; -use ratatui::text::{Line, Span}; +use ratatui::text::Span; use ratatui::widgets::{Block, Borders, Cell, Paragraph, Row, Table, TableState}; use ratatui::Frame; use tracing::trace; @@ -208,22 +209,32 @@ fn draw_search(state: &mut State, frame: &mut Frame, area: Rect) { fn draw_list(state: &mut State, frame: &mut Frame, area: Rect) { - state.filtered_projects = state - .projects - .list - .iter() - .filter_map(|project| { - let search_value = state.search.value(); + let search_value = state.search.value(); + let projects = &state.projects.list; - if search_value.is_empty() { - return Some(project.clone()); + state.filtered_projects = if search_value.is_empty() { + projects.clone() + } else { + let mut filtered = VecDeque::new(); + + for project in projects.iter() { + match fuzzy_search(search_value, &project.name()) { + Some(indices) => { + trace!(?search_value, ?project, ?indices); + filtered.push_front(project.clone()); + } + None => { + let path = project.path().to_str().unwrap(); + if let Some(indices) = fuzzy_search(search_value, path) { + trace!(?search_value, ?project, ?indices); + filtered.push_back(project.clone()); + } + } } + } - let indices = fuzzy_search(search_value, &project.name())?; - trace!(?search_value, ?project, ?indices); - Some(project.clone()) - }) - .collect(); + Vec::from(filtered) + }; let rows = state.filtered_projects.iter().map(|project| { let name = project.name();