From 882e5d928975c2649fab29ff4c6c31bfec6a27d9 Mon Sep 17 00:00:00 2001 From: ClementTsang Date: Sat, 15 Feb 2020 20:25:32 -0500 Subject: More minor refactoring to generalize the app search state struct. --- src/app.rs | 180 ++++++++++++++++++++++++++++++++++++++++++------------------ src/main.rs | 12 +++- 2 files changed, 136 insertions(+), 56 deletions(-) (limited to 'src') diff --git a/src/app.rs b/src/app.rs index 5b69ee09..e4089fec 100644 --- a/src/app.rs +++ b/src/app.rs @@ -60,14 +60,31 @@ impl Default for AppScrollState { } } -/// AppSearchState only deals with the search's current settings and state. -pub struct ProcessSearchState { +/// AppSearchState deals with generic searching (mainly for graph filtering) +pub struct AppSearchState { is_enabled: bool, current_search_query: String, - pub is_searching_with_pid: bool, current_regex: std::result::Result, current_cursor_position: usize, pub is_invalid_or_blank_search: bool, +} + +impl Default for AppSearchState { + fn default() -> Self { + AppSearchState { + is_enabled: false, + current_search_query: String::default(), + current_regex: BASE_REGEX.clone(), + current_cursor_position: 0, + is_invalid_or_blank_search: true, + } + } +} + +/// ProcessSearchState only deals with process' search's current settings and state. +pub struct ProcessSearchState { + pub search_state: AppSearchState, + pub is_searching_with_pid: bool, pub is_ignoring_case: bool, pub is_searching_whole_word: bool, pub is_searching_with_regex: bool, @@ -76,13 +93,9 @@ pub struct ProcessSearchState { impl Default for ProcessSearchState { fn default() -> Self { ProcessSearchState { - is_enabled: false, - current_search_query: String::default(), + search_state: AppSearchState::default(), is_searching_with_pid: false, is_ignoring_case: true, - current_regex: BASE_REGEX.clone(), - is_invalid_or_blank_search: true, - current_cursor_position: 0, is_searching_whole_word: false, is_searching_with_regex: false, } @@ -208,11 +221,11 @@ impl App { self.reset_multi_tap_keys(); self.help_dialog_state.is_showing_help = false; self.delete_dialog_state.is_showing_dd = false; - if self.process_search_state.is_enabled { + if self.process_search_state.search_state.is_enabled { self.current_widget_selected = WidgetPosition::Process; - self.process_search_state.is_enabled = false; + self.process_search_state.search_state.is_enabled = false; } - self.process_search_state.current_search_query = String::new(); + self.process_search_state.search_state.current_search_query = String::new(); self.process_search_state.is_searching_with_pid = false; self.to_delete_process_list = None; self.dd_err = None; @@ -227,9 +240,9 @@ impl App { self.delete_dialog_state.is_on_yes = false; self.to_delete_process_list = None; self.dd_err = None; - } else if self.process_search_state.is_enabled { + } else if self.process_search_state.search_state.is_enabled { self.current_widget_selected = WidgetPosition::Process; - self.process_search_state.is_enabled = false; + self.process_search_state.search_state.is_enabled = false; } else if self.is_expanded { self.is_expanded = false; } @@ -278,7 +291,7 @@ impl App { match self.current_widget_selected { WidgetPosition::Process | WidgetPosition::ProcessSearch => { // Toggle on - self.process_search_state.is_enabled = true; + self.process_search_state.search_state.is_enabled = true; self.current_widget_selected = WidgetPosition::ProcessSearch; } _ => {} @@ -287,7 +300,7 @@ impl App { } pub fn is_searching(&self) -> bool { - self.process_search_state.is_enabled + self.process_search_state.search_state.is_enabled } pub fn is_in_search_widget(&self) -> bool { @@ -315,7 +328,7 @@ impl App { } pub fn get_current_search_query(&self) -> &String { - &self.process_search_state.current_search_query + &self.process_search_state.search_state.current_search_query } pub fn toggle_ignore_case(&mut self) { @@ -329,28 +342,43 @@ impl App { } pub fn update_regex(&mut self) { - self.process_search_state.current_regex = - if self.process_search_state.current_search_query.is_empty() { - self.process_search_state.is_invalid_or_blank_search = true; - BASE_REGEX.clone() - } else { - let mut final_regex_string = self.process_search_state.current_search_query.clone(); - - if !self.process_search_state.is_searching_with_regex { - final_regex_string = regex::escape(&final_regex_string); - } + self.process_search_state.search_state.current_regex = if self + .process_search_state + .search_state + .current_search_query + .is_empty() + { + self.process_search_state + .search_state + .is_invalid_or_blank_search = true; + BASE_REGEX.clone() + } else { + let mut final_regex_string = self + .process_search_state + .search_state + .current_search_query + .clone(); + + if !self.process_search_state.is_searching_with_regex { + final_regex_string = regex::escape(&final_regex_string); + } - if self.process_search_state.is_searching_whole_word { - final_regex_string = format!("^{}$", final_regex_string); - } - if self.process_search_state.is_ignoring_case { - final_regex_string = format!("(?i){}", final_regex_string); - } + if self.process_search_state.is_searching_whole_word { + final_regex_string = format!("^{}$", final_regex_string); + } + if self.process_search_state.is_ignoring_case { + final_regex_string = format!("(?i){}", final_regex_string); + } - regex::Regex::new(&final_regex_string) - }; - self.process_search_state.is_invalid_or_blank_search = - self.process_search_state.current_regex.is_err(); + regex::Regex::new(&final_regex_string) + }; + self.process_search_state + .search_state + .is_invalid_or_blank_search = self + .process_search_state + .search_state + .current_regex + .is_err(); self.app_scroll_positions .process_scroll_state .previous_scroll_position = 0; @@ -360,7 +388,9 @@ impl App { } pub fn get_cursor_position(&self) -> usize { - self.process_search_state.current_cursor_position + self.process_search_state + .search_state + .current_cursor_position } /// One of two functions allowed to run while in a dialog... @@ -391,11 +421,23 @@ impl App { pub fn on_backspace(&mut self) { if let WidgetPosition::ProcessSearch = self.current_widget_selected { - if self.process_search_state.current_cursor_position > 0 { - self.process_search_state.current_cursor_position -= 1; + if self + .process_search_state + .search_state + .current_cursor_position + > 0 + { + self.process_search_state + .search_state + .current_cursor_position -= 1; self.process_search_state + .search_state .current_search_query - .remove(self.process_search_state.current_cursor_position); + .remove( + self.process_search_state + .search_state + .current_cursor_position, + ); self.update_regex(); self.update_process_gui = true; @@ -404,7 +446,7 @@ impl App { } pub fn get_current_regex_matcher(&self) -> &std::result::Result { - &self.process_search_state.current_regex + &self.process_search_state.search_state.current_regex } pub fn on_up_key(&mut self) { @@ -428,8 +470,15 @@ impl App { pub fn on_left_key(&mut self) { if !self.is_in_dialog() { if let WidgetPosition::ProcessSearch = self.current_widget_selected { - if self.process_search_state.current_cursor_position > 0 { - self.process_search_state.current_cursor_position -= 1; + if self + .process_search_state + .search_state + .current_cursor_position + > 0 + { + self.process_search_state + .search_state + .current_cursor_position -= 1; } } } else if self.delete_dialog_state.is_showing_dd && !self.delete_dialog_state.is_on_yes { @@ -440,10 +489,19 @@ impl App { pub fn on_right_key(&mut self) { if !self.is_in_dialog() { if let WidgetPosition::ProcessSearch = self.current_widget_selected { - if self.process_search_state.current_cursor_position - < self.process_search_state.current_search_query.len() + if self + .process_search_state + .search_state + .current_cursor_position + < self + .process_search_state + .search_state + .current_search_query + .len() { - self.process_search_state.current_cursor_position += 1; + self.process_search_state + .search_state + .current_cursor_position += 1; } } } else if self.delete_dialog_state.is_showing_dd && self.delete_dialog_state.is_on_yes { @@ -454,7 +512,9 @@ impl App { pub fn skip_cursor_beginning(&mut self) { if !self.is_in_dialog() { if let WidgetPosition::ProcessSearch = self.current_widget_selected { - self.process_search_state.current_cursor_position = 0; + self.process_search_state + .search_state + .current_cursor_position = 0; } } } @@ -462,8 +522,13 @@ impl App { pub fn skip_cursor_end(&mut self) { if !self.is_in_dialog() { if let WidgetPosition::ProcessSearch = self.current_widget_selected { - self.process_search_state.current_cursor_position = - self.process_search_state.current_search_query.len(); + self.process_search_state + .search_state + .current_cursor_position = self + .process_search_state + .search_state + .current_search_query + .len(); } } } @@ -481,11 +546,18 @@ impl App { self.last_key_press = current_key_press_inst; if let WidgetPosition::ProcessSearch = self.current_widget_selected { - self.process_search_state.current_search_query.insert( - self.process_search_state.current_cursor_position, - caught_char, - ); - self.process_search_state.current_cursor_position += 1; + self.process_search_state + .search_state + .current_search_query + .insert( + self.process_search_state + .search_state + .current_cursor_position, + caught_char, + ); + self.process_search_state + .search_state + .current_cursor_position += 1; self.update_regex(); diff --git a/src/main.rs b/src/main.rs index 45311267..c5b28c2c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -735,7 +735,11 @@ fn update_final_process_list(app: &mut app::App) { .clone() .into_iter() .filter(|process| { - if app.process_search_state.is_invalid_or_blank_search { + if app + .process_search_state + .search_state + .is_invalid_or_blank_search + { true } else if let Ok(matcher) = app.get_current_regex_matcher() { matcher.is_match(&process.name) @@ -749,7 +753,11 @@ fn update_final_process_list(app: &mut app::App) { .process_data .iter() .filter(|(_pid, process)| { - if app.process_search_state.is_invalid_or_blank_search { + if app + .process_search_state + .search_state + .is_invalid_or_blank_search + { true } else if let Ok(matcher) = app.get_current_regex_matcher() { if app.process_search_state.is_searching_with_pid { -- cgit v1.2.3