mirror of
https://github.com/ClementTsang/bottom.git
synced 2025-07-28 08:04:27 +02:00
refactor: simplify partial ordering fn, clean up code
This commit is contained in:
parent
1877ed5c88
commit
0831a56341
99
src/app.rs
99
src/app.rs
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
|
@ -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,17 +275,14 @@ 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
|
self.colours.invalid_query_style
|
||||||
.is_invalid_search
|
} else if is_on_widget {
|
||||||
{
|
self.colours.highlighted_border_style
|
||||||
self.colours.invalid_query_style
|
} else {
|
||||||
} else if is_on_widget {
|
self.colours.border_style
|
||||||
self.colours.highlighted_border_style
|
};
|
||||||
} else {
|
|
||||||
self.colours.border_style
|
|
||||||
};
|
|
||||||
|
|
||||||
let title = Span::styled(
|
let title = Span::styled(
|
||||||
if draw_border {
|
if draw_border {
|
||||||
|
@ -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);
|
||||||
|
@ -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)]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user