summaryrefslogtreecommitdiffstats
path: root/src/app/widgets/process_table/proc_widget_column.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/widgets/process_table/proc_widget_column.rs')
-rw-r--r--src/app/widgets/process_table/proc_widget_column.rs122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/app/widgets/process_table/proc_widget_column.rs b/src/app/widgets/process_table/proc_widget_column.rs
new file mode 100644
index 00000000..5578598d
--- /dev/null
+++ b/src/app/widgets/process_table/proc_widget_column.rs
@@ -0,0 +1,122 @@
+use crate::{
+ components::data_table::{ColumnHeader, SortsRow},
+ utils::gen_util::sort_partial_fn,
+};
+
+use std::{borrow::Cow, cmp::Reverse};
+
+use super::ProcWidgetData;
+
+#[derive(Debug, PartialEq, Eq, Copy, Clone)]
+pub enum ProcColumn {
+ CpuPercent,
+ MemoryVal,
+ MemoryPercent,
+ Pid,
+ Count,
+ Name,
+ Command,
+ ReadPerSecond,
+ WritePerSecond,
+ TotalRead,
+ TotalWrite,
+ State,
+ User,
+}
+
+impl ColumnHeader for ProcColumn {
+ fn text(&self) -> Cow<'static, str> {
+ match self {
+ ProcColumn::CpuPercent => "CPU%",
+ ProcColumn::MemoryVal => "Mem",
+ ProcColumn::MemoryPercent => "Mem%",
+ ProcColumn::Pid => "PID",
+ ProcColumn::Count => "Count",
+ ProcColumn::Name => "Name",
+ ProcColumn::Command => "Command",
+ ProcColumn::ReadPerSecond => "R/s",
+ ProcColumn::WritePerSecond => "W/s",
+ ProcColumn::TotalRead => "T.Read",
+ ProcColumn::TotalWrite => "T.Write",
+ ProcColumn::State => "State",
+ ProcColumn::User => "User",
+ }
+ .into()
+ }
+
+ fn header(&self) -> Cow<'static, str> {
+ match self {
+ ProcColumn::CpuPercent => "CPU%(c)",
+ ProcColumn::MemoryVal => "Mem(m)",
+ ProcColumn::MemoryPercent => "Mem%(m)",
+ ProcColumn::Pid => "PID(p)",
+ ProcColumn::Count => "Count",
+ ProcColumn::Name => "Name(n)",
+ ProcColumn::Command => "Command(n)",
+ ProcColumn::ReadPerSecond => "R/s",
+ ProcColumn::WritePerSecond => "W/s",
+ ProcColumn::TotalRead => "T.Read",
+ ProcColumn::TotalWrite => "T.Write",
+ ProcColumn::State => "State",
+ ProcColumn::User => "User",
+ }
+ .into()
+ }
+}
+
+impl SortsRow<ProcWidgetData> for ProcColumn {
+ fn sort_data(&self, data: &mut [ProcWidgetData], descending: bool) {
+ match self {
+ ProcColumn::CpuPercent => {
+ data.sort_by(|a, b| {
+ sort_partial_fn(descending)(a.cpu_usage_percent, b.cpu_usage_percent)
+ });
+ }
+ ProcColumn::MemoryVal | ProcColumn::MemoryPercent => {
+ data.sort_by(|a, b| sort_partial_fn(descending)(&a.mem_usage, &b.mem_usage));
+ }
+ ProcColumn::Pid => {
+ data.sort_by(|a, b| sort_partial_fn(descending)(a.pid, b.pid));
+ }
+ ProcColumn::Count => {
+ data.sort_by(|a, b| sort_partial_fn(descending)(a.num_similar, b.num_similar));
+ }
+ ProcColumn::Name | ProcColumn::Command => {
+ if descending {
+ data.sort_by_cached_key(|pd| Reverse(pd.id.to_lowercase()));
+ } else {
+ data.sort_by_cached_key(|pd| pd.id.to_lowercase());
+ }
+ }
+ ProcColumn::ReadPerSecond => {
+ data.sort_by(|a, b| sort_partial_fn(descending)(a.rps, b.rps));
+ }
+ ProcColumn::WritePerSecond => {
+ data.sort_by(|a, b| sort_partial_fn(descending)(a.wps, b.wps));
+ }
+ ProcColumn::TotalRead => {
+ data.sort_by(|a, b| sort_partial_fn(descending)(a.total_read, b.total_read));
+ }
+ ProcColumn::TotalWrite => {
+ data.sort_by(|a, b| sort_partial_fn(descending)(a.total_write, b.total_write));
+ }
+ ProcColumn::State => {
+ if descending {
+ data.sort_by_cached_key(|pd| Reverse(pd.process_state.to_lowercase()));
+ } else {
+ data.sort_by_cached_key(|pd| pd.process_state.to_lowercase());
+ }
+ }
+ ProcColumn::User => {
+ #[cfg(target_family = "unix")]
+ {
+ if descending {
+ data.sort_by_cached_key(|pd| Reverse(pd.user.to_lowercase()));
+ } else {
+ data.sort_by_cached_key(|pd| pd.user.to_lowercase());
+ }
+ }
+ }
+ }
+ }
+}