summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorClement Tsang <34804052+ClementTsang@users.noreply.github.com>2020-09-06 23:03:03 -0400
committerGitHub <noreply@github.com>2020-09-06 23:03:03 -0400
commiteb8295c430c246423804148dcc9249da03d5dd9c (patch)
tree203c4c5628546fd7ccd3c68c90c00ce5d70c7278 /src/lib.rs
parent0d8572c6923c687c19a7cdbcc7128ba703e4e06d (diff)
feature: Adds tree view (#223)
Adds a tree process view to bottom. Currently uses a pretty jank method of column width setting, should get fixed in #225.
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs162
1 files changed, 95 insertions, 67 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 2c15c73d..ee6f2cfc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -47,6 +47,12 @@ pub mod options;
pub mod clap;
+#[cfg(target_family = "windows")]
+pub type Pid = usize;
+
+#[cfg(target_family = "unix")]
+pub type Pid = libc::pid_t;
+
pub enum BottomEvent<I, J> {
KeyInput(I),
MouseInput(J),
@@ -111,6 +117,7 @@ pub fn handle_key_event_or_break(
KeyCode::F(1) => app.toggle_ignore_case(),
KeyCode::F(2) => app.toggle_search_whole_word(),
KeyCode::F(3) => app.toggle_search_regex(),
+ KeyCode::F(5) => app.toggle_tree_mode(),
KeyCode::F(6) => app.toggle_sort(),
_ => {}
}
@@ -458,88 +465,109 @@ pub fn update_all_process_lists(app: &mut App) {
}
}
-pub fn update_final_process_list(app: &mut App, widget_id: u64) {
- let (is_invalid_or_blank, is_using_command) = match app.proc_state.widget_states.get(&widget_id)
- {
- Some(process_state) => (
+fn update_final_process_list(app: &mut App, widget_id: u64) {
+ let process_states = match app.proc_state.widget_states.get(&widget_id) {
+ Some(process_state) => Some((
process_state
.process_search_state
.search_state
.is_invalid_or_blank_search(),
process_state.is_using_command,
- ),
- None => (false, false),
+ process_state.is_grouped,
+ process_state.is_tree_mode,
+ )),
+ None => None,
};
- let is_grouped = app.is_grouped(widget_id);
-
- if !app.is_frozen {
- app.canvas_data.single_process_data = convert_process_data(&app.data_collection);
- }
- if is_grouped {
- app.canvas_data.process_data = group_process_data(
- &app.canvas_data.single_process_data,
- if is_using_command {
- ProcessNamingType::Path
+ if let Some((is_invalid_or_blank, is_using_command, is_grouped, is_tree)) = process_states {
+ if !app.is_frozen {
+ app.canvas_data.single_process_data = convert_process_data(&app.data_collection);
+ }
+
+ let process_filter = app.get_process_filter(widget_id);
+ let filtered_process_data: Vec<ConvertedProcessData> = if is_tree {
+ app.canvas_data
+ .single_process_data
+ .iter()
+ .map(|process| {
+ let mut process_clone = process.clone();
+ if !is_invalid_or_blank {
+ if let Some(process_filter) = process_filter {
+ process_clone.is_disabled_entry =
+ !process_filter.check(&process_clone, is_using_command);
+ }
+ }
+ process_clone
+ })
+ .collect::<Vec<_>>()
+ } else {
+ app.canvas_data
+ .single_process_data
+ .iter()
+ .filter(|process| {
+ if !is_invalid_or_blank {
+ if let Some(process_filter) = process_filter {
+ process_filter.check(&process, is_using_command)
+ } else {
+ true
+ }
+ } else {
+ true
+ }
+ })
+ .cloned()
+ .collect::<Vec<_>>()
+ };
+
+ if let Some(proc_widget_state) = app.proc_state.get_mut_widget_state(widget_id) {
+ let mut finalized_process_data = if is_tree {
+ tree_process_data(
+ &filtered_process_data,
+ is_using_command,
+ &proc_widget_state.process_sorting_type,
+ proc_widget_state.is_process_sort_descending,
+ )
+ } else if is_grouped {
+ group_process_data(&filtered_process_data, is_using_command)
} else {
- ProcessNamingType::Name
- },
- );
- } else {
- app.canvas_data.process_data = app.canvas_data.single_process_data.clone();
- }
+ filtered_process_data
+ };
- let process_filter = app.get_process_filter(widget_id);
- let filtered_process_data: Vec<ConvertedProcessData> = app
- .canvas_data
- .process_data
- .iter()
- .filter(|process| {
- if !is_invalid_or_blank {
- if let Some(process_filter) = process_filter {
- process_filter.check(&process, is_using_command)
- } else {
- true
- }
- } else {
- true
+ // Note tree mode is sorted well before this, as it's special.
+ if !is_tree {
+ sort_process_data(&mut finalized_process_data, proc_widget_state);
}
- })
- .cloned()
- .collect::<Vec<_>>();
- // Quick fix for tab updating the table headers
- if let Some(proc_widget_state) = app.proc_state.get_mut_widget_state(widget_id) {
- let mut resulting_processes = filtered_process_data;
- sort_process_data(&mut resulting_processes, proc_widget_state);
+ if proc_widget_state.scroll_state.current_scroll_position
+ >= finalized_process_data.len()
+ {
+ proc_widget_state.scroll_state.current_scroll_position =
+ finalized_process_data.len().saturating_sub(1);
+ proc_widget_state.scroll_state.previous_scroll_position = 0;
+ proc_widget_state.scroll_state.scroll_direction = app::ScrollDirection::Down;
+ }
- if proc_widget_state.scroll_state.current_scroll_position >= resulting_processes.len() {
- proc_widget_state.scroll_state.current_scroll_position =
- resulting_processes.len().saturating_sub(1);
- proc_widget_state.scroll_state.previous_scroll_position = 0;
- proc_widget_state.scroll_state.scroll_direction = app::ScrollDirection::Down;
+ app.canvas_data
+ .finalized_process_data_map
+ .insert(widget_id, finalized_process_data);
}
-
- app.canvas_data
- .finalized_process_data_map
- .insert(widget_id, resulting_processes);
}
}
-pub fn sort_process_data(
+fn sort_process_data(
to_sort_vec: &mut Vec<ConvertedProcessData>, proc_widget_state: &app::ProcWidgetState,
) {
to_sort_vec.sort_by(|a, b| {
utils::gen_util::get_ordering(&a.name.to_lowercase(), &b.name.to_lowercase(), false)
});
- match proc_widget_state.process_sorting_type {
+ match &proc_widget_state.process_sorting_type {
ProcessSorting::CpuPercent => {
to_sort_vec.sort_by(|a, b| {
utils::gen_util::get_ordering(
a.cpu_percent_usage,
b.cpu_percent_usage,
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}
@@ -548,7 +576,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
a.mem_usage_bytes,
b.mem_usage_bytes,
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}
@@ -557,18 +585,18 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
a.mem_percent_usage,
b.mem_percent_usage,
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}
ProcessSorting::ProcessName => {
// Don't repeat if false... it sorts by name by default anyways.
- if proc_widget_state.process_sorting_reverse {
+ if proc_widget_state.is_process_sort_descending {
to_sort_vec.sort_by(|a, b| {
utils::gen_util::get_ordering(
&a.name.to_lowercase(),
&b.name.to_lowercase(),
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
})
}
@@ -577,7 +605,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
&a.command.to_lowercase(),
&b.command.to_lowercase(),
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
}),
ProcessSorting::Pid => {
@@ -586,7 +614,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
a.pid,
b.pid,
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}
@@ -596,7 +624,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
a.rps_f64,
b.rps_f64,
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}
@@ -605,7 +633,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
a.wps_f64,
b.wps_f64,
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}
@@ -614,7 +642,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
a.tr_f64,
b.tr_f64,
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}
@@ -623,7 +651,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
a.tw_f64,
b.tw_f64,
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}
@@ -631,7 +659,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
&a.process_state.to_lowercase(),
&b.process_state.to_lowercase(),
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
}),
ProcessSorting::Count => {
@@ -640,7 +668,7 @@ pub fn sort_process_data(
utils::gen_util::get_ordering(
a.group_pids.len(),
b.group_pids.len(),
- proc_widget_state.process_sorting_reverse,
+ proc_widget_state.is_process_sort_descending,
)
});
}