diff options
Diffstat (limited to 'src/app/widgets/process_table/proc_widget_column.rs')
-rw-r--r-- | src/app/widgets/process_table/proc_widget_column.rs | 122 |
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()); + } + } + } + } + } +} |