use sysinfo::System;
#[cfg(all(target_os = "linux", feature = "nvidia"))]
use nvml_wrapper::Nvml;
use crate::i18n::{Translations, get_translations};
use crate::metrics::{
cpu, disks, memory, network, processes,
CpuState, DiskState, MemState, NetState, ProcessEntry,
};
#[cfg(target_os = "linux")]
use crate::metrics::{gpu as gpu_metrics, GpuEntry};
pub struct App {
pub sys: System,
pub cpu: CpuState,
pub mem: MemState,
pub net: NetState,
pub disks: Vec<DiskState>,
pub processes: Vec<ProcessEntry>,
#[cfg(target_os = "linux")]
pub gpus: Vec<GpuEntry>,
pub tick_rate_ms: u64,
pub selected_tab: usize,
pub process_scroll: usize,
pub disk_scroll: usize,
#[cfg(target_os = "linux")]
pub gpu_scroll: usize,
#[cfg(all(target_os = "linux", feature = "nvidia"))]
pub(crate) nvml: Option<Nvml>,
pub t: Translations,
}
impl App {
pub fn new(lang_code: &str) -> Self {
let mut sys = System::new_all();
sys.refresh_all();
let cpu_count = sys.cpus().len().max(1);
App {
cpu: CpuState::new(cpu_count),
mem: MemState::new(&sys),
net: NetState::new(),
disks: Vec::new(),
processes: Vec::new(),
#[cfg(target_os = "linux")]
gpus: Vec::new(),
sys,
tick_rate_ms: 1000,
selected_tab: 0,
process_scroll: 0,
disk_scroll: 0,
#[cfg(target_os = "linux")]
gpu_scroll: 0,
#[cfg(all(target_os = "linux", feature = "nvidia"))]
nvml: Nvml::init().ok(),
t: get_translations(lang_code),
}
}
pub fn on_tick(&mut self) {
self.sys.refresh_all();
cpu::refresh(&mut self.cpu, &self.sys);
memory::refresh(&mut self.mem, &self.sys);
network::refresh(&mut self.net);
disks::refresh(&mut self.disks);
processes::refresh(&mut self.processes, &self.sys);
#[cfg(target_os = "linux")]
self.refresh_gpus();
}
#[cfg(target_os = "linux")]
fn refresh_gpus(&mut self) {
#[cfg(feature = "nvidia")]
{
if gpu_metrics::nvidia::refresh(&mut self.gpus, &mut self.nvml) {
return;
}
}
gpu_metrics::amd::refresh(&mut self.gpus);
}
}