refactor: simplify partial ordering fn, clean up code

This commit is contained in:
ClementTsang 2022-05-15 19:00:25 -04:00
parent 1877ed5c88
commit 0831a56341
6 changed files with 108 additions and 103 deletions

View File

@ -172,7 +172,7 @@ impl App {
.widget_states .widget_states
.values_mut() .values_mut()
.for_each(|state| { .for_each(|state| {
state.search_state.search_state.reset(); state.proc_search.search_state.reset();
}); });
// Clear current delete list // Clear current delete list
@ -223,7 +223,7 @@ impl App {
{ {
if current_proc_state.is_search_enabled() || current_proc_state.is_sort_open if current_proc_state.is_search_enabled() || current_proc_state.is_sort_open
{ {
current_proc_state.search_state.search_state.is_enabled = false; current_proc_state.proc_search.search_state.is_enabled = false;
current_proc_state.is_sort_open = false; current_proc_state.is_sort_open = false;
self.is_force_redraw = true; self.is_force_redraw = true;
return; return;
@ -236,7 +236,7 @@ impl App {
.get_mut_widget_state(self.current_widget.widget_id - 1) .get_mut_widget_state(self.current_widget.widget_id - 1)
{ {
if current_proc_state.is_search_enabled() { if current_proc_state.is_search_enabled() {
current_proc_state.search_state.search_state.is_enabled = false; current_proc_state.proc_search.search_state.is_enabled = false;
self.move_widget_selection(&WidgetDirection::Up); self.move_widget_selection(&WidgetDirection::Up);
self.is_force_redraw = true; self.is_force_redraw = true;
return; return;
@ -325,7 +325,7 @@ impl App {
_ => 0, _ => 0,
}, },
) { ) {
proc_widget_state.search_state.search_state.is_enabled = true; proc_widget_state.proc_search.search_state.is_enabled = true;
self.move_widget_selection(&WidgetDirection::Down); self.move_widget_selection(&WidgetDirection::Down);
self.is_force_redraw = true; self.is_force_redraw = true;
} }
@ -412,12 +412,12 @@ impl App {
.get_mut(&(self.current_widget.widget_id - 1)) .get_mut(&(self.current_widget.widget_id - 1))
{ {
if is_in_search_widget && proc_widget_state.is_search_enabled() { if is_in_search_widget && proc_widget_state.is_search_enabled() {
proc_widget_state.search_state.search_toggle_ignore_case(); proc_widget_state.proc_search.search_toggle_ignore_case();
proc_widget_state.update_query(); proc_widget_state.update_query();
proc_widget_state.force_update = true; proc_widget_state.force_update = true;
// Remember, it's the opposite (ignoring case is case "in"sensitive) // Remember, it's the opposite (ignoring case is case "in"sensitive)
is_case_sensitive = Some(!proc_widget_state.search_state.is_ignoring_case); is_case_sensitive = Some(!proc_widget_state.proc_search.is_ignoring_case);
} }
} }
@ -463,12 +463,12 @@ impl App {
.get_mut(&(self.current_widget.widget_id - 1)) .get_mut(&(self.current_widget.widget_id - 1))
{ {
if is_in_search_widget && proc_widget_state.is_search_enabled() { if is_in_search_widget && proc_widget_state.is_search_enabled() {
proc_widget_state.search_state.search_toggle_whole_word(); proc_widget_state.proc_search.search_toggle_whole_word();
proc_widget_state.update_query(); proc_widget_state.update_query();
proc_widget_state.force_update = true; proc_widget_state.force_update = true;
is_searching_whole_word = is_searching_whole_word =
Some(proc_widget_state.search_state.is_searching_whole_word); Some(proc_widget_state.proc_search.is_searching_whole_word);
} }
} }
@ -518,12 +518,12 @@ impl App {
.get_mut(&(self.current_widget.widget_id - 1)) .get_mut(&(self.current_widget.widget_id - 1))
{ {
if is_in_search_widget && proc_widget_state.is_search_enabled() { if is_in_search_widget && proc_widget_state.is_search_enabled() {
proc_widget_state.search_state.search_toggle_regex(); proc_widget_state.proc_search.search_toggle_regex();
proc_widget_state.update_query(); proc_widget_state.update_query();
proc_widget_state.force_update = true; proc_widget_state.force_update = true;
is_searching_with_regex = is_searching_with_regex =
Some(proc_widget_state.search_state.is_searching_with_regex); Some(proc_widget_state.proc_search.is_searching_with_regex);
} }
} }
@ -631,10 +631,10 @@ impl App {
.get_mut(&(self.current_widget.widget_id - 1)) .get_mut(&(self.current_widget.widget_id - 1))
{ {
if is_in_search_widget { if is_in_search_widget {
if proc_widget_state.search_state.search_state.is_enabled if proc_widget_state.proc_search.search_state.is_enabled
&& proc_widget_state.get_search_cursor_position() && proc_widget_state.get_search_cursor_position()
< proc_widget_state < proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.len() .len()
@ -644,17 +644,17 @@ impl App {
.search_walk_forward(proc_widget_state.get_search_cursor_position()); .search_walk_forward(proc_widget_state.get_search_cursor_position());
let _removed_chars: String = proc_widget_state let _removed_chars: String = proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.drain(current_cursor..proc_widget_state.get_search_cursor_position()) .drain(current_cursor..proc_widget_state.get_search_cursor_position())
.collect(); .collect();
proc_widget_state.search_state.search_state.grapheme_cursor = proc_widget_state.proc_search.search_state.grapheme_cursor =
GraphemeCursor::new( GraphemeCursor::new(
current_cursor, current_cursor,
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.len(), .len(),
@ -680,7 +680,7 @@ impl App {
.get_mut(&(self.current_widget.widget_id - 1)) .get_mut(&(self.current_widget.widget_id - 1))
{ {
if is_in_search_widget if is_in_search_widget
&& proc_widget_state.search_state.search_state.is_enabled && proc_widget_state.proc_search.search_state.is_enabled
&& proc_widget_state.get_search_cursor_position() > 0 && proc_widget_state.get_search_cursor_position() > 0
{ {
let current_cursor = proc_widget_state.get_search_cursor_position(); let current_cursor = proc_widget_state.get_search_cursor_position();
@ -688,17 +688,17 @@ impl App {
.search_walk_back(proc_widget_state.get_search_cursor_position()); .search_walk_back(proc_widget_state.get_search_cursor_position());
let removed_chars: String = proc_widget_state let removed_chars: String = proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.drain(proc_widget_state.get_search_cursor_position()..current_cursor) .drain(proc_widget_state.get_search_cursor_position()..current_cursor)
.collect(); .collect();
proc_widget_state.search_state.search_state.grapheme_cursor = proc_widget_state.proc_search.search_state.grapheme_cursor =
GraphemeCursor::new( GraphemeCursor::new(
proc_widget_state.get_search_cursor_position(), proc_widget_state.get_search_cursor_position(),
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.len(), .len(),
@ -706,11 +706,11 @@ impl App {
); );
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.char_cursor_position -= UnicodeWidthStr::width(removed_chars.as_str()); .char_cursor_position -= UnicodeWidthStr::width(removed_chars.as_str());
proc_widget_state.search_state.search_state.cursor_direction = proc_widget_state.proc_search.search_state.cursor_direction =
CursorDirection::Left; CursorDirection::Left;
proc_widget_state.update_query(); proc_widget_state.update_query();
@ -722,7 +722,7 @@ impl App {
pub fn get_process_filter(&self, widget_id: u64) -> &Option<query::Query> { pub fn get_process_filter(&self, widget_id: u64) -> &Option<query::Query> {
if let Some(process_widget_state) = self.proc_state.widget_states.get(&widget_id) { if let Some(process_widget_state) = self.proc_state.widget_states.get(&widget_id) {
&process_widget_state.search_state.search_state.query &process_widget_state.proc_search.search_state.query
} else { } else {
&None &None
} }
@ -819,15 +819,15 @@ impl App {
.search_walk_back(proc_widget_state.get_search_cursor_position()); .search_walk_back(proc_widget_state.get_search_cursor_position());
if proc_widget_state.get_search_cursor_position() < prev_cursor { if proc_widget_state.get_search_cursor_position() < prev_cursor {
let str_slice = &proc_widget_state let str_slice = &proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
[proc_widget_state.get_search_cursor_position()..prev_cursor]; [proc_widget_state.get_search_cursor_position()..prev_cursor];
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.char_cursor_position -= UnicodeWidthStr::width(str_slice); .char_cursor_position -= UnicodeWidthStr::width(str_slice);
proc_widget_state.search_state.search_state.cursor_direction = proc_widget_state.proc_search.search_state.cursor_direction =
CursorDirection::Left; CursorDirection::Left;
} }
} }
@ -889,15 +889,15 @@ impl App {
); );
if proc_widget_state.get_search_cursor_position() > prev_cursor { if proc_widget_state.get_search_cursor_position() > prev_cursor {
let str_slice = &proc_widget_state let str_slice = &proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
[prev_cursor..proc_widget_state.get_search_cursor_position()]; [prev_cursor..proc_widget_state.get_search_cursor_position()];
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.char_cursor_position += UnicodeWidthStr::width(str_slice); .char_cursor_position += UnicodeWidthStr::width(str_slice);
proc_widget_state.search_state.search_state.cursor_direction = proc_widget_state.proc_search.search_state.cursor_direction =
CursorDirection::Right; CursorDirection::Right;
} }
} }
@ -1005,21 +1005,21 @@ impl App {
.get_mut(&(self.current_widget.widget_id - 1)) .get_mut(&(self.current_widget.widget_id - 1))
{ {
if is_in_search_widget { if is_in_search_widget {
proc_widget_state.search_state.search_state.grapheme_cursor = proc_widget_state.proc_search.search_state.grapheme_cursor =
GraphemeCursor::new( GraphemeCursor::new(
0, 0,
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.len(), .len(),
true, true,
); );
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.char_cursor_position = 0; .char_cursor_position = 0;
proc_widget_state.search_state.search_state.cursor_direction = proc_widget_state.proc_search.search_state.cursor_direction =
CursorDirection::Left; CursorDirection::Left;
} }
} }
@ -1037,31 +1037,31 @@ impl App {
.get_mut(&(self.current_widget.widget_id - 1)) .get_mut(&(self.current_widget.widget_id - 1))
{ {
if is_in_search_widget { if is_in_search_widget {
proc_widget_state.search_state.search_state.grapheme_cursor = proc_widget_state.proc_search.search_state.grapheme_cursor =
GraphemeCursor::new( GraphemeCursor::new(
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.len(), .len(),
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.len(), .len(),
true, true,
); );
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.char_cursor_position = UnicodeWidthStr::width( .char_cursor_position = UnicodeWidthStr::width(
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.as_str(), .as_str(),
); );
proc_widget_state.search_state.search_state.cursor_direction = proc_widget_state.proc_search.search_state.cursor_direction =
CursorDirection::Right; CursorDirection::Right;
} }
} }
@ -1117,16 +1117,16 @@ impl App {
} }
let removed_chars: String = proc_widget_state let removed_chars: String = proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.drain(start_index..end_index) .drain(start_index..end_index)
.collect(); .collect();
proc_widget_state.search_state.search_state.grapheme_cursor = GraphemeCursor::new( proc_widget_state.proc_search.search_state.grapheme_cursor = GraphemeCursor::new(
start_index, start_index,
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.len(), .len(),
@ -1134,12 +1134,11 @@ impl App {
); );
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.char_cursor_position -= UnicodeWidthStr::width(removed_chars.as_str()); .char_cursor_position -= UnicodeWidthStr::width(removed_chars.as_str());
proc_widget_state.search_state.search_state.cursor_direction = proc_widget_state.proc_search.search_state.cursor_direction = CursorDirection::Left;
CursorDirection::Left;
proc_widget_state.update_query(); proc_widget_state.update_query();
proc_widget_state.force_update = true; proc_widget_state.force_update = true;
@ -1214,23 +1213,23 @@ impl App {
&& proc_widget_state.is_search_enabled() && proc_widget_state.is_search_enabled()
&& UnicodeWidthStr::width( && UnicodeWidthStr::width(
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.as_str(), .as_str(),
) <= MAX_SEARCH_LENGTH ) <= MAX_SEARCH_LENGTH
{ {
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.insert(proc_widget_state.get_search_cursor_position(), caught_char); .insert(proc_widget_state.get_search_cursor_position(), caught_char);
proc_widget_state.search_state.search_state.grapheme_cursor = proc_widget_state.proc_search.search_state.grapheme_cursor =
GraphemeCursor::new( GraphemeCursor::new(
proc_widget_state.get_search_cursor_position(), proc_widget_state.get_search_cursor_position(),
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.len(), .len(),
@ -1240,14 +1239,14 @@ impl App {
.search_walk_forward(proc_widget_state.get_search_cursor_position()); .search_walk_forward(proc_widget_state.get_search_cursor_position());
proc_widget_state proc_widget_state
.search_state .proc_search
.search_state .search_state
.char_cursor_position += .char_cursor_position +=
UnicodeWidthChar::width(caught_char).unwrap_or(0); UnicodeWidthChar::width(caught_char).unwrap_or(0);
proc_widget_state.update_query(); proc_widget_state.update_query();
proc_widget_state.force_update = true; proc_widget_state.force_update = true;
proc_widget_state.search_state.search_state.cursor_direction = proc_widget_state.proc_search.search_state.cursor_direction =
CursorDirection::Right; CursorDirection::Right;
return; return;

View File

@ -306,7 +306,7 @@ impl TableComponentHeader for ProcWidgetColumn {
pub struct ProcWidget { pub struct ProcWidget {
pub mode: ProcWidgetMode, pub mode: ProcWidgetMode,
pub search_state: ProcessSearchState, pub proc_search: ProcessSearchState,
pub table_state: TableComponentState<ProcWidgetColumn>, pub table_state: TableComponentState<ProcWidgetColumn>,
pub sort_table_state: TableComponentState, pub sort_table_state: TableComponentState,
@ -391,7 +391,7 @@ impl ProcWidget {
}; };
ProcWidget { ProcWidget {
search_state: process_search_state, proc_search: process_search_state,
table_state, table_state,
sort_table_state, sort_table_state,
is_sort_open: false, is_sort_open: false,
@ -419,10 +419,10 @@ impl ProcWidget {
/// call it before this function. /// call it before this function.
pub fn update_displayed_process_data(&mut self, data_collection: &DataCollection) { pub fn update_displayed_process_data(&mut self, data_collection: &DataCollection) {
// Now update everything else. // Now update everything else.
let search_query = if self.search_state.search_state.is_invalid_or_blank_search() { let search_query = if self.proc_search.search_state.is_invalid_or_blank_search() {
&None &None
} else { } else {
&self.search_state.search_state.query &self.proc_search.search_state.query
}; };
let table_data = match &self.mode { let table_data = match &self.mode {
ProcWidgetMode::Tree { collapsed_pids } => { ProcWidgetMode::Tree { collapsed_pids } => {
@ -863,7 +863,7 @@ impl ProcWidget {
} }
/// Marks the selected column as hidden, and automatically resets the selected column if currently selected. /// Marks the selected column as hidden, and automatically resets the selected column if currently selected.
pub fn hide_column(&mut self, index: usize) { fn hide_column(&mut self, index: usize) {
if let Some(col) = self.table_state.columns.get_mut(index) { if let Some(col) = self.table_state.columns.get_mut(index) {
col.is_hidden = true; col.is_hidden = true;
@ -877,7 +877,7 @@ impl ProcWidget {
} }
/// Marks the selected column as shown. /// Marks the selected column as shown.
pub fn show_column(&mut self, index: usize) { fn show_column(&mut self, index: usize) {
if let Some(col) = self.table_state.columns.get_mut(index) { if let Some(col) = self.table_state.columns.get_mut(index) {
col.is_hidden = false; col.is_hidden = false;
} }
@ -964,48 +964,48 @@ impl ProcWidget {
} }
pub fn get_search_cursor_position(&self) -> usize { pub fn get_search_cursor_position(&self) -> usize {
self.search_state.search_state.grapheme_cursor.cur_cursor() self.proc_search.search_state.grapheme_cursor.cur_cursor()
} }
pub fn get_char_cursor_position(&self) -> usize { pub fn get_char_cursor_position(&self) -> usize {
self.search_state.search_state.char_cursor_position self.proc_search.search_state.char_cursor_position
} }
pub fn is_search_enabled(&self) -> bool { pub fn is_search_enabled(&self) -> bool {
self.search_state.search_state.is_enabled self.proc_search.search_state.is_enabled
} }
pub fn get_current_search_query(&self) -> &String { pub fn get_current_search_query(&self) -> &String {
&self.search_state.search_state.current_search_query &self.proc_search.search_state.current_search_query
} }
pub fn update_query(&mut self) { pub fn update_query(&mut self) {
if self if self
.search_state .proc_search
.search_state .search_state
.current_search_query .current_search_query
.is_empty() .is_empty()
{ {
self.search_state.search_state.is_blank_search = true; self.proc_search.search_state.is_blank_search = true;
self.search_state.search_state.is_invalid_search = false; self.proc_search.search_state.is_invalid_search = false;
self.search_state.search_state.error_message = None; self.proc_search.search_state.error_message = None;
} else { } else {
match parse_query( match parse_query(
&self.search_state.search_state.current_search_query, &self.proc_search.search_state.current_search_query,
self.search_state.is_searching_whole_word, self.proc_search.is_searching_whole_word,
self.search_state.is_ignoring_case, self.proc_search.is_ignoring_case,
self.search_state.is_searching_with_regex, self.proc_search.is_searching_with_regex,
) { ) {
Ok(parsed_query) => { Ok(parsed_query) => {
self.search_state.search_state.query = Some(parsed_query); self.proc_search.search_state.query = Some(parsed_query);
self.search_state.search_state.is_blank_search = false; self.proc_search.search_state.is_blank_search = false;
self.search_state.search_state.is_invalid_search = false; self.proc_search.search_state.is_invalid_search = false;
self.search_state.search_state.error_message = None; self.proc_search.search_state.error_message = None;
} }
Err(err) => { Err(err) => {
self.search_state.search_state.is_blank_search = false; self.proc_search.search_state.is_blank_search = false;
self.search_state.search_state.is_invalid_search = true; self.proc_search.search_state.is_invalid_search = true;
self.search_state.search_state.error_message = Some(err.to_string()); self.proc_search.search_state.error_message = Some(err.to_string());
} }
} }
} }
@ -1014,31 +1014,32 @@ impl ProcWidget {
} }
pub fn clear_search(&mut self) { pub fn clear_search(&mut self) {
self.search_state.search_state.reset(); self.proc_search.search_state.reset();
} }
pub fn search_walk_forward(&mut self, start_position: usize) { pub fn search_walk_forward(&mut self, start_position: usize) {
self.search_state self.proc_search
.search_state .search_state
.grapheme_cursor .grapheme_cursor
.next_boundary( .next_boundary(
&self.search_state.search_state.current_search_query[start_position..], &self.proc_search.search_state.current_search_query[start_position..],
start_position, start_position,
) )
.unwrap(); .unwrap();
} }
pub fn search_walk_back(&mut self, start_position: usize) { pub fn search_walk_back(&mut self, start_position: usize) {
self.search_state self.proc_search
.search_state .search_state
.grapheme_cursor .grapheme_cursor
.prev_boundary( .prev_boundary(
&self.search_state.search_state.current_search_query[..start_position], &self.proc_search.search_state.current_search_query[..start_position],
0, 0,
) )
.unwrap(); .unwrap();
} }
/// Returns the number of columns *visible*.
pub fn num_shown_columns(&self) -> usize { pub fn num_shown_columns(&self) -> usize {
self.table_state self.table_state
.columns .columns
@ -1047,6 +1048,8 @@ impl ProcWidget {
.count() .count()
} }
/// Returns the number of columns *enabled*. Note this differs from *visible* - a column may be enabled but not
/// visible (e.g. off screen).
pub fn num_enabled_columns(&self) -> usize { pub fn num_enabled_columns(&self) -> usize {
self.table_state self.table_state
.columns .columns
@ -1055,6 +1058,7 @@ impl ProcWidget {
.count() .count()
} }
/// Sets the [`ProcWidget`]'s current sort index to whatever was in the sort table.
pub(crate) fn use_sort_table_value(&mut self) { pub(crate) fn use_sort_table_value(&mut self) {
if let SortState::Sortable(st) = &mut self.table_state.sort_state { if let SortState::Sortable(st) = &mut self.table_state.sort_state {
st.update_sort_index(self.sort_table_state.current_scroll_position); st.update_sort_index(self.sort_table_state.current_scroll_position);

View File

@ -440,7 +440,6 @@ mod test {
use crate::app::ScrollDirection::{self, Down, Up}; use crate::app::ScrollDirection::{self, Down, Up};
#[track_caller] #[track_caller]
fn test_get( fn test_get(
bar: usize, rows: usize, direction: ScrollDirection, selected: usize, force: bool, bar: usize, rows: usize, direction: ScrollDirection, selected: usize, force: bool,
expected_posn: usize, expected_bar: usize, expected_posn: usize, expected_bar: usize,

View File

@ -81,6 +81,7 @@ impl Painter {
) { ) {
let should_get_widget_bounds = app_state.should_get_widget_bounds(); let should_get_widget_bounds = app_state.should_get_widget_bounds();
if let Some(proc_widget_state) = app_state.proc_state.widget_states.get_mut(&widget_id) { if let Some(proc_widget_state) = app_state.proc_state.widget_states.get_mut(&widget_id) {
// TODO: [PROC] this might be too aggressive...
let recalculate_column_widths = let recalculate_column_widths =
should_get_widget_bounds || proc_widget_state.force_update; should_get_widget_bounds || proc_widget_state.force_update;
@ -191,8 +192,8 @@ impl Painter {
let start_position: usize = get_search_start_position( let start_position: usize = get_search_start_position(
num_columns - num_chars_for_text - 5, num_columns - num_chars_for_text - 5,
&proc_widget_state.search_state.search_state.cursor_direction, &proc_widget_state.proc_search.search_state.cursor_direction,
&mut proc_widget_state.search_state.search_state.cursor_bar, &mut proc_widget_state.proc_search.search_state.cursor_bar,
current_cursor_position, current_cursor_position,
app_state.is_force_redraw, app_state.is_force_redraw,
); );
@ -227,19 +228,19 @@ impl Painter {
})]; })];
// Text options shamelessly stolen from VS Code. // Text options shamelessly stolen from VS Code.
let case_style = if !proc_widget_state.search_state.is_ignoring_case { let case_style = if !proc_widget_state.proc_search.is_ignoring_case {
self.colours.currently_selected_text_style self.colours.currently_selected_text_style
} else { } else {
self.colours.text_style self.colours.text_style
}; };
let whole_word_style = if proc_widget_state.search_state.is_searching_whole_word { let whole_word_style = if proc_widget_state.proc_search.is_searching_whole_word {
self.colours.currently_selected_text_style self.colours.currently_selected_text_style
} else { } else {
self.colours.text_style self.colours.text_style
}; };
let regex_style = if proc_widget_state.search_state.is_searching_with_regex { let regex_style = if proc_widget_state.proc_search.is_searching_with_regex {
self.colours.currently_selected_text_style self.colours.currently_selected_text_style
} else { } else {
self.colours.text_style self.colours.text_style
@ -265,7 +266,7 @@ impl Painter {
]); ]);
search_text.push(Spans::from(Span::styled( search_text.push(Spans::from(Span::styled(
if let Some(err) = &proc_widget_state.search_state.search_state.error_message { if let Some(err) = &proc_widget_state.proc_search.search_state.error_message {
err.as_str() err.as_str()
} else { } else {
"" ""
@ -274,11 +275,8 @@ impl Painter {
))); )));
search_text.push(option_text); search_text.push(option_text);
let current_border_style = if proc_widget_state let current_border_style =
.search_state if proc_widget_state.proc_search.search_state.is_invalid_search {
.search_state
.is_invalid_search
{
self.colours.invalid_query_style self.colours.invalid_query_style
} else if is_on_widget { } else if is_on_widget {
self.colours.highlighted_border_style self.colours.highlighted_border_style

View File

@ -474,7 +474,7 @@ pub fn build_app(
let mapping = HashMap::new(); let mapping = HashMap::new();
for widget in search_case_enabled_widgets { for widget in search_case_enabled_widgets {
if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) { if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) {
proc_widget.search_state.is_ignoring_case = !widget.enabled; proc_widget.proc_search.is_ignoring_case = !widget.enabled;
} }
} }
flags.search_case_enabled_widgets_map = Some(mapping); flags.search_case_enabled_widgets_map = Some(mapping);
@ -488,7 +488,7 @@ pub fn build_app(
let mapping = HashMap::new(); let mapping = HashMap::new();
for widget in search_whole_word_enabled_widgets { for widget in search_whole_word_enabled_widgets {
if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) { if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) {
proc_widget.search_state.is_searching_whole_word = widget.enabled; proc_widget.proc_search.is_searching_whole_word = widget.enabled;
} }
} }
flags.search_whole_word_enabled_widgets_map = Some(mapping); flags.search_whole_word_enabled_widgets_map = Some(mapping);
@ -500,7 +500,7 @@ pub fn build_app(
let mapping = HashMap::new(); let mapping = HashMap::new();
for widget in search_regex_enabled_widgets { for widget in search_regex_enabled_widgets {
if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) { if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) {
proc_widget.search_state.is_searching_with_regex = widget.enabled; proc_widget.proc_search.is_searching_with_regex = widget.enabled;
} }
} }
flags.search_regex_enabled_widgets_map = Some(mapping); flags.search_regex_enabled_widgets_map = Some(mapping);

View File

@ -92,6 +92,7 @@ pub fn get_decimal_prefix(quantity: u64, unit: &str) -> (f64, String) {
} }
} }
#[inline]
pub fn sort_partial_fn<T: std::cmp::PartialOrd>(is_reverse: bool) -> fn(T, T) -> Ordering { pub fn sort_partial_fn<T: std::cmp::PartialOrd>(is_reverse: bool) -> fn(T, T) -> Ordering {
if is_reverse { if is_reverse {
partial_ordering_rev partial_ordering_rev
@ -101,15 +102,19 @@ pub fn sort_partial_fn<T: std::cmp::PartialOrd>(is_reverse: bool) -> fn(T, T) ->
} }
/// Returns an [`Ordering`] between two [`PartialOrd`]s. /// Returns an [`Ordering`] between two [`PartialOrd`]s.
#[inline]
pub fn partial_ordering<T: std::cmp::PartialOrd>(a: T, b: T) -> Ordering { pub fn partial_ordering<T: std::cmp::PartialOrd>(a: T, b: T) -> Ordering {
// TODO: Switch to `total_cmp` on 1.62 // TODO: Switch to `total_cmp` on 1.62
a.partial_cmp(&b).unwrap_or(Ordering::Equal) a.partial_cmp(&b).unwrap_or(Ordering::Equal)
} }
/// Returns a reversed [`Ordering`] between two [`PartialOrd`]s. /// Returns a reversed [`Ordering`] between two [`PartialOrd`]s.
///
/// This is simply a wrapper function around [`partial_ordering`] that reverses
/// the result.
#[inline]
pub fn partial_ordering_rev<T: std::cmp::PartialOrd>(a: T, b: T) -> Ordering { pub fn partial_ordering_rev<T: std::cmp::PartialOrd>(a: T, b: T) -> Ordering {
// TODO: Switch to `total_cmp` on 1.62 partial_ordering(a, b).reverse()
a.partial_cmp(&b).unwrap_or(Ordering::Equal).reverse()
} }
#[cfg(test)] #[cfg(test)]