1use crate::{
24 SETTINGS_PATH, dmi::DMIData, load_state::LoadState, messages::Message, pages::Page,
25 settings::FXSettings, sidebar::sidebar, utils::get_home, widgets::line_charts::LineChart,
26};
27use ferrix_lib::{
28 battery::BatInfo,
29 cpu::{Processors, Stat},
30 cpu_freq::CpuFreq,
31 drm::Video,
32 init::{SystemdServices, BootTimestamps},
33 net::Networks,
34 parts::Mounts,
35 ram::{RAM, Swaps},
36 soft::InstalledPackages,
37 sys::{Groups, KModules, Kernel, OsRelease, Users},
38 vulnerabilities::Vulnerabilities,
39};
40use std::collections::HashSet;
41
42#[derive(Debug)]
43pub struct Ferrix {
44 pub current_page: Page,
45 pub settings: FXSettings,
46 pub data: FerrixData,
47 pub scrolled_area_id: Option<&'static str>,
48}
49
50impl Default for Ferrix {
51 fn default() -> Self {
52 let args = std::env::args().nth(1);
53 let page = match &args {
54 Some(a) => Page::from(a as &str),
55 None => Page::default(),
56 };
57 let settings =
58 FXSettings::read(get_home().join(".config").join(SETTINGS_PATH)).unwrap_or_default();
59
60 Self {
61 current_page: page,
62 settings: settings.clone(),
63 data: FerrixData::new(&settings),
64 scrolled_area_id: None,
65 }
66 }
67}
68
69impl Ferrix {
70 pub fn theme(&self) -> iced::Theme {
71 self.settings.style.to_theme()
72 }
73
74 pub fn title(&self) -> String {
75 "Ferrix System Monitor".to_string()
76 }
77
78 pub fn update(&mut self, message: Message) -> iced::Task<Message> {
79 message.update(self)
80 }
81
82 pub fn view<'a>(&'a self) -> iced::Element<'a, Message> {
83 iced::widget::row![sidebar(self.current_page), self.current_page.page(&self)]
84 .spacing(5)
85 .padding(5)
86 .into()
87 }
88}
89
90#[derive(Debug)]
91pub struct FerrixData {
92 pub is_polkit: bool,
93
94 pub proc_data: LoadState<Processors>,
95 pub selected_proc: usize,
96 pub prev_proc_stat: LoadState<Stat>,
97 pub curr_proc_stat: LoadState<Stat>,
98 pub cpu_usage_chart: LineChart,
99 pub show_cpus_chart: HashSet<usize>,
100 pub show_chart_elements: usize,
101 pub show_charts_legend: bool,
102 pub cpu_freq: LoadState<CpuFreq>,
103 pub cpu_vulnerabilities: LoadState<Vulnerabilities>,
104
105 pub ram_data: LoadState<RAM>,
106 pub swap_data: LoadState<Swaps>,
107 pub show_mem_chart: HashSet<usize>,
108 pub show_ram_chart: bool,
109 pub ram_usage_chart: LineChart,
110
111 pub storages: LoadState<Mounts>,
112 pub networks: LoadState<Networks>,
113 pub dmi_data: LoadState<DMIData>,
114 pub bat_data: LoadState<BatInfo>,
115 pub drm_data: LoadState<Video>,
116 pub osrel_data: LoadState<OsRelease>,
117
118 pub kernel_data: LoadState<Kernel>,
119 pub kmods_data: LoadState<KModules>,
120
121 pub users_list: LoadState<Users>,
122 pub groups_list: LoadState<Groups>,
123 pub sysd_services_list: LoadState<SystemdServices>,
124 pub boot_time: LoadState<BootTimestamps>,
125 pub installed_pkgs_list: LoadState<InstalledPackages>,
126 pub system: LoadState<crate::System>,
127}
128
129impl Default for FerrixData {
130 fn default() -> Self {
131 Self {
132 is_polkit: false,
133
134 cpu_usage_chart: LineChart::new(),
135 selected_proc: 0,
136 show_cpus_chart: HashSet::new(),
137 show_chart_elements: 100,
138 ram_usage_chart: LineChart::new(),
139 show_mem_chart: HashSet::new(),
140 show_ram_chart: true,
141 show_charts_legend: true,
142
143 proc_data: LoadState::default(),
144 prev_proc_stat: LoadState::default(),
145 curr_proc_stat: LoadState::default(),
146 cpu_freq: LoadState::default(),
147 cpu_vulnerabilities: LoadState::default(),
148
149 ram_data: LoadState::default(),
150 swap_data: LoadState::default(),
151 storages: LoadState::default(),
152 networks: LoadState::default(),
153 dmi_data: LoadState::default(),
154 bat_data: LoadState::default(),
155 drm_data: LoadState::default(),
156 osrel_data: LoadState::default(),
157 kernel_data: LoadState::default(),
158 kmods_data: LoadState::default(),
159 users_list: LoadState::default(),
160 groups_list: LoadState::default(),
161 sysd_services_list: LoadState::default(),
162 boot_time: LoadState::default(),
163 installed_pkgs_list: LoadState::default(),
164 system: LoadState::default(),
165 }
166 }
167}
168
169impl FerrixData {
170 pub fn new(settings: &FXSettings) -> Self {
171 let style = &settings.style;
172 let thickness = settings.chart_line_thickness;
173
174 let mut cpu_usage_chart = LineChart::new();
175 cpu_usage_chart.set_style(&style.to_theme());
176 cpu_usage_chart.set_line_thickness(thickness);
177
178 let mut ram_usage_chart = LineChart::new();
179 ram_usage_chart.set_style(&style.to_theme());
180 ram_usage_chart.set_line_thickness(thickness);
181
182 Self {
183 cpu_usage_chart,
184 ram_usage_chart,
185 ..Default::default()
186 }
187 }
188}