use crate::widgets::*;
use crate::Layout;
pub struct Ptop {
cpu: CpuData,
memory: MemoryData,
disks: Vec<DiskMount>,
network: NetworkData,
pressure: PsiData,
processes: Vec<Process>,
}
impl Ptop {
pub fn view(&self) -> impl Widget {
Layout::rows([
Layout::columns([
self.cpu_panel(), self.memory_panel(), self.disk_panel(), ]).height(Percent(25)),
Layout::columns([
self.network_panel(), self.pressure_panel(), ]).height(Percent(25)),
self.process_panel().expanded(),
])
}
fn cpu_panel(&self) -> impl Widget {
Border::rounded("CPU")
.child(
Layout::rows([
CpuGrid::new(&self.cpu.cores)
.columns(2)
.show_percentages(true),
Text::new(format!(
"Load {} {} {}",
self.cpu.load_1,
self.cpu.load_5,
self.cpu.load_15
)),
])
)
}
fn memory_panel(&self) -> impl Widget {
Border::rounded("Memory")
.child(
MemoryBar::new()
.segment("Used", self.memory.used, Color::MAGENTA)
.segment("Swap", self.memory.swap, Color::YELLOW)
.segment("Cached", self.memory.cached, Color::CYAN)
.segment("Free", self.memory.free, Color::GREEN)
.show_labels(true)
)
}
fn disk_panel(&self) -> impl Widget {
Border::rounded("Disk")
.child(
Layout::rows(
self.disks.iter().map(|d| {
Meter::new(d.used_percent)
.label(&d.mount_point)
.width(Percent(100))
})
)
)
}
fn network_panel(&self) -> impl Widget {
Border::rounded("Network")
.child(
NetworkPanel::new(&self.network.interfaces)
.show_sparklines(true)
)
}
fn pressure_panel(&self) -> impl Widget {
Border::rounded("Pressure")
.child(
Layout::rows([
Meter::new(self.pressure.cpu).label("CPU"),
Meter::new(self.pressure.memory).label("MEM"),
Meter::new(self.pressure.io).label("I/O"),
])
)
}
fn process_panel(&self) -> impl Widget {
Border::rounded(format!("Processes ({})", self.processes.len()))
.child(
Table::new()
.headers(["PID", "S", "CPU%", "MEM%", "COMMAND"])
.rows(self.processes.iter().map(|p| {
[
p.pid.to_string(),
p.state.to_string(),
format!("{:.1}", p.cpu),
format!("{:.1}", p.mem),
p.command.clone(),
]
}))
.sortable(true)
.scrollable(true)
)
}
}
pub struct CpuData {
pub cores: Vec<f64>, pub load_1: f64,
pub load_5: f64,
pub load_15: f64,
}
pub struct MemoryData {
pub used: u64,
pub swap: u64,
pub cached: u64,
pub free: u64,
pub total: u64,
}
pub struct DiskMount {
pub mount_point: String,
pub used_percent: f64,
}
pub struct NetworkData {
pub interfaces: Vec<NetworkInterface>,
}
pub struct PsiData {
pub cpu: f64,
pub memory: f64,
pub io: f64,
}
pub struct Process {
pub pid: u32,
pub state: char,
pub cpu: f64,
pub mem: f64,
pub command: String,
}