diff options
Diffstat (limited to 'src/commands/search_string.rs')
-rw-r--r-- | src/commands/search_string.rs | 70 |
1 files changed, 17 insertions, 53 deletions
diff --git a/src/commands/search_string.rs b/src/commands/search_string.rs index 53d54ea..084fc89 100644 --- a/src/commands/search_string.rs +++ b/src/commands/search_string.rs @@ -1,65 +1,29 @@ -use crate::context::AppContext; -use crate::tab::JoshutoTab; -use crate::util::search::SearchPattern; +use crate::context::{AppContext, MatchContext}; use super::cursor_move; +use super::search; -pub fn search_string_fwd(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> { - let curr_list = curr_tab.curr_list_ref()?; +pub fn search_string(context: &mut AppContext, pattern: &str, incremental: bool) { + let case_sensitivity = context + .config_ref() + .search_options_ref() + .string_case_sensitivity; - let offset = curr_list.get_index()? + 1; - let contents_len = curr_list.contents.len(); - for i in 0..contents_len { - let file_name_lower = curr_list.contents[(offset + i) % contents_len] - .file_name() - .to_lowercase(); - if file_name_lower.contains(pattern) { - return Some((offset + i) % contents_len); - } - } - None -} + let search_context = MatchContext::new_string(pattern, case_sensitivity); -pub fn search_string_start(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> { - let curr_list = curr_tab.curr_list_ref()?; + let curr_tab = context.tab_context_ref().curr_tab_ref(); - let contents_len = curr_list.contents.len(); - for i in 0..contents_len { - let file_name_lower = curr_list.contents[i].file_name().to_lowercase(); - if file_name_lower.contains(pattern) { - return Some(i); + if incremental { + if let Some(new_index) = search::search_next_impl(curr_tab, &search_context, 0) { + cursor_move::cursor_move(context, new_index); } - } - None -} + } else if let Some(index) = curr_tab.curr_list_ref().and_then(|c| c.get_index()) { + let offset = index + 1; -pub fn search_string_rev(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> { - let curr_list = curr_tab.curr_list_ref()?; - - let offset = curr_list.get_index()?; - let contents_len = curr_list.contents.len(); - for i in (0..contents_len).rev() { - let file_name_lower = curr_list.contents[(offset + i) % contents_len] - .file_name() - .to_lowercase(); - if file_name_lower.contains(pattern) { - return Some((offset + i) % contents_len); + if let Some(new_index) = search::search_next_impl(curr_tab, &search_context, offset) { + cursor_move::cursor_move(context, new_index); } } - None -} - -pub fn search_string(context: &mut AppContext, pattern: &str, incremental: bool) { - let pattern = pattern.to_lowercase(); - let curr_tab = context.tab_context_ref().curr_tab_ref(); - let index = if incremental { - search_string_start(curr_tab, pattern.as_str()) - } else { - search_string_fwd(curr_tab, pattern.as_str()) - }; - if let Some(index) = index { - cursor_move::cursor_move(context, index); - } - context.set_search_context(SearchPattern::String(pattern)); + context.set_search_context(search_context); } |