use sysinfo::{System, Disks};
use std::time::{Duration, Instant};
use eframe::egui;
use crate::panels::cpu;
use crate::panels::memory;
use crate::panels::swap;
use crate::panels::disk;
use crate::panels::info;
use crate::panels::process;
pub struct SysApp {
pub sys: System,
pub refresh_interval: Duration,
pub last_refresh: Instant,
pub show_os: bool,
pub show_cpu: bool,
pub show_mem: bool,
pub show_swap: bool,
pub show_uptime: bool,
pub show_disk: bool,
pub show_procs: bool,
pub top_procs: usize,
pub disks: Disks,
}
impl eframe::App for SysApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
if self.last_refresh.elapsed() >= self.refresh_interval {
self.sys.refresh_all();
self.last_refresh = Instant::now();
}
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("System Resource Manager");
ui.separator();
egui::ScrollArea::vertical().show(ui, |ui| {
if self.show_os {
info::show_os_info(&self.sys, ui);
}
if self.show_cpu {
egui::CollapsingHeader::new("CPU Info")
.default_open(true)
.show(ui, |ui| {
cpu::show_cpu_info(&self.sys, ui);
});
}
if self.show_mem {
memory::show_memory_info(&self.sys, ui);
}
if self.show_swap {
swap::show_swap_info(&self.sys, ui);
}
if self.show_uptime {
info::show_uptime(&self.sys, ui);
}
if self.show_disk {
egui::CollapsingHeader::new("Disk Info")
.default_open(true)
.show(ui, |ui| {
disk::show_disk_info(&self.disks, ui);
});
}
if self.show_procs {
egui::CollapsingHeader::new("Process Info")
.default_open(true)
.show(ui, |ui| {
process::show_process_info(&self.sys, self.top_procs, ui)
});
}
let elapsed = self.last_refresh.elapsed().as_secs();
let visuals = ctx.style().visuals.clone();
let theme_mode = if visuals.dark_mode { "Dark" } else { "Light" };
ui.horizontal(|ui| {
ui.label(format!("Last updated: {}s ago", elapsed));
ui.label(format!("Refresh interval: {}s", self.refresh_interval.as_secs()));
ui.label(format!("Theme: {}", theme_mode));
if ui.button("Toggle Theme").clicked() {
if visuals.dark_mode {
ctx.set_visuals(egui::Visuals::light());
} else {
ctx.set_visuals(egui::Visuals::dark());
}
let mut style = (*ctx.style()).clone();
style.visuals.override_text_color = Some(if ctx.style().visuals.dark_mode {
egui::Color32::WHITE
} else {
egui::Color32::BLACK
});
ctx.set_style(style);
}
});
});
});
ctx.request_repaint();
}
}