Skip to main content

ferrix_app/
ferrix.rs

1/* ferrix.rs
2 *
3 * Copyright 2025-2026 Michail Krasnov <mskrasnov07@ya.ru>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: GPL-3.0-or-later
19 */
20
21//! Data from `ferrix-lib`
22
23use 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}