refactor: remove typed builder from App struct (#1176)

Another one on the chopping block. This also moves out the app
widget logic to a separate struct.
This commit is contained in:
Clement Tsang 2023-05-28 00:46:13 -04:00 committed by GitHub
parent 9cea3e1a8d
commit 635e82a8a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 292 additions and 150 deletions

View file

@ -10,7 +10,6 @@ use filter::*;
use hashbrown::HashMap;
use layout_manager::*;
pub use states::*;
use typed_builder::*;
use unicode_segmentation::{GraphemeCursor, UnicodeSegmentation};
use crate::widgets::{ProcWidgetColumn, ProcWidgetMode};
@ -79,70 +78,6 @@ pub struct DataFilters {
pub net_filter: Option<Filter>,
}
#[derive(TypedBuilder)]
pub struct App {
#[builder(default = false, setter(skip))]
awaiting_second_char: bool,
#[builder(default, setter(skip))]
second_char: Option<char>,
// FIXME: The way we do deletes is really gross.
#[builder(default, setter(skip))]
pub dd_err: Option<String>,
#[builder(default, setter(skip))]
to_delete_process_list: Option<(String, Vec<Pid>)>,
#[builder(default, setter(skip))]
pub frozen_state: FrozenState,
#[builder(default = Instant::now(), setter(skip))]
last_key_press: Instant,
#[builder(default, setter(skip))]
pub converted_data: ConvertedData,
#[builder(default, setter(skip))]
pub data_collection: DataCollection,
#[builder(default, setter(skip))]
pub delete_dialog_state: AppDeleteDialogState,
#[builder(default, setter(skip))]
pub help_dialog_state: AppHelpDialogState,
#[builder(default = false)]
pub is_expanded: bool,
#[builder(default = false, setter(skip))]
pub is_force_redraw: bool,
#[builder(default = false, setter(skip))]
pub is_determining_widget_boundary: bool,
#[builder(default = false, setter(skip))]
pub basic_mode_use_percent: bool,
#[cfg(target_family = "unix")]
#[builder(default, setter(skip))]
pub user_table: data_harvester::processes::UserTable,
pub cpu_state: CpuState,
pub mem_state: MemState,
pub net_state: NetState,
pub proc_state: ProcState,
pub temp_state: TempState,
pub disk_state: DiskState,
pub battery_state: BatteryState,
pub basic_table_widget_state: Option<BasicTableWidgetState>,
pub app_config_fields: AppConfigFields,
pub widget_map: HashMap<u64, BottomWidget>,
pub current_widget: BottomWidget,
pub used_widgets: UsedWidgets,
pub filters: DataFilters,
}
cfg_if::cfg_if! {
if #[cfg(target_os = "linux")] {
/// The max signal we can send to a process on Linux.
@ -164,7 +99,63 @@ cfg_if::cfg_if! {
}
}
pub struct App {
awaiting_second_char: bool,
second_char: Option<char>,
pub dd_err: Option<String>, // FIXME: The way we do deletes is really gross.
to_delete_process_list: Option<(String, Vec<Pid>)>,
pub frozen_state: FrozenState,
last_key_press: Instant,
pub converted_data: ConvertedData,
pub data_collection: DataCollection,
pub delete_dialog_state: AppDeleteDialogState,
pub help_dialog_state: AppHelpDialogState,
pub is_expanded: bool,
pub is_force_redraw: bool,
pub is_determining_widget_boundary: bool,
pub basic_mode_use_percent: bool,
#[cfg(target_family = "unix")]
pub user_table: data_harvester::processes::UserTable,
pub states: AppWidgetStates,
pub app_config_fields: AppConfigFields,
pub widget_map: HashMap<u64, BottomWidget>,
pub current_widget: BottomWidget,
pub used_widgets: UsedWidgets,
pub filters: DataFilters,
}
impl App {
pub fn new(
app_config_fields: AppConfigFields, states: AppWidgetStates,
widget_map: HashMap<u64, BottomWidget>, current_widget: BottomWidget,
used_widgets: UsedWidgets, filters: DataFilters, is_expanded: bool,
) -> Self {
Self {
awaiting_second_char: false,
second_char: None,
dd_err: None,
to_delete_process_list: None,
frozen_state: FrozenState::default(),
last_key_press: Instant::now(),
converted_data: ConvertedData::default(),
data_collection: DataCollection::default(),
delete_dialog_state: AppDeleteDialogState::default(),
help_dialog_state: AppHelpDialogState::default(),
is_expanded,
is_force_redraw: false,
is_determining_widget_boundary: false,
basic_mode_use_percent: false,
#[cfg(target_family = "unix")]
user_table: data_harvester::processes::UserTable::default(),
states,
app_config_fields,
widget_map,
current_widget,
used_widgets,
filters,
}
}
pub fn reset(&mut self) {
// Reset multi
self.reset_multi_tap_keys();
@ -174,7 +165,8 @@ impl App {
self.delete_dialog_state.is_showing_dd = false;
// Close all searches and reset it
self.proc_state
self.states
.proc_state
.widget_states
.values_mut()
.for_each(|state| {
@ -224,6 +216,7 @@ impl App {
match self.current_widget.widget_type {
BottomWidgetType::Proc => {
if let Some(pws) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -237,6 +230,7 @@ impl App {
}
BottomWidgetType::ProcSearch => {
if let Some(pws) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id - 1)
{
@ -250,6 +244,7 @@ impl App {
}
BottomWidgetType::ProcSort => {
if let Some(pws) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id - 2)
{
@ -297,6 +292,7 @@ impl App {
if !self.ignore_normal_keybinds() {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -311,7 +307,7 @@ impl App {
match &self.current_widget.widget_type {
BottomWidgetType::Proc | BottomWidgetType::ProcSort => {
// Toggle on
if let Some(proc_widget_state) = self.proc_state.get_mut_widget_state(
if let Some(proc_widget_state) = self.states.proc_state.get_mut_widget_state(
self.current_widget.widget_id
- match &self.current_widget.widget_type {
BottomWidgetType::ProcSort => 2,
@ -336,7 +332,7 @@ impl App {
_ => 0,
};
if let Some(pws) = self.proc_state.get_mut_widget_state(widget_id) {
if let Some(pws) = self.states.proc_state.get_mut_widget_state(widget_id) {
pws.is_sort_open = !pws.is_sort_open;
pws.force_rerender = true;
@ -361,7 +357,7 @@ impl App {
_ => 0,
};
if let Some(pws) = self.proc_state.get_mut_widget_state(widget_id) {
if let Some(pws) = self.states.proc_state.get_mut_widget_state(widget_id) {
pws.table.toggle_order();
pws.force_data_update();
}
@ -377,6 +373,7 @@ impl App {
}
BottomWidgetType::Proc => {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -392,6 +389,7 @@ impl App {
pub fn toggle_ignore_case(&mut self) {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -406,6 +404,7 @@ impl App {
pub fn toggle_search_whole_word(&mut self) {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -420,6 +419,7 @@ impl App {
pub fn toggle_search_regex(&mut self) {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -433,6 +433,7 @@ impl App {
pub fn toggle_tree_mode(&mut self) {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id))
@ -482,6 +483,7 @@ impl App {
} else if !self.is_in_dialog() {
if let BottomWidgetType::ProcSort = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 2))
@ -498,6 +500,7 @@ impl App {
if let BottomWidgetType::ProcSearch = self.current_widget.widget_type {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -544,6 +547,7 @@ impl App {
if let BottomWidgetType::ProcSearch = self.current_widget.widget_type {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -583,7 +587,7 @@ impl App {
}
pub fn get_process_filter(&self, widget_id: u64) -> &Option<query::Query> {
if let Some(process_widget_state) = self.proc_state.widget_states.get(&widget_id) {
if let Some(process_widget_state) = self.states.proc_state.widget_states.get(&widget_id) {
&process_widget_state.proc_search.search_state.query
} else {
&None
@ -672,6 +676,7 @@ impl App {
BottomWidgetType::ProcSearch => {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id - 1)
{
@ -688,6 +693,7 @@ impl App {
BottomWidgetType::Battery => {
if !self.converted_data.battery_data.is_empty() {
if let Some(battery_widget_state) = self
.states
.battery_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -731,6 +737,7 @@ impl App {
BottomWidgetType::ProcSearch => {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id - 1)
{
@ -748,6 +755,7 @@ impl App {
if !self.converted_data.battery_data.is_empty() {
let battery_count = self.converted_data.battery_data.len();
if let Some(battery_widget_state) = self
.states
.battery_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -888,6 +896,7 @@ impl App {
if let BottomWidgetType::ProcSearch = self.current_widget.widget_type {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -917,6 +926,7 @@ impl App {
if let BottomWidgetType::ProcSearch = self.current_widget.widget_type {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -941,6 +951,7 @@ impl App {
pub fn clear_search(&mut self) {
if let BottomWidgetType::ProcSearch = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -953,6 +964,7 @@ impl App {
pub fn clear_previous_word(&mut self) {
if let BottomWidgetType::ProcSearch = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -1011,6 +1023,7 @@ impl App {
self.reset_multi_tap_keys();
if let Some(pws) = self
.states
.proc_state
.widget_states
.get(&self.current_widget.widget_id)
@ -1055,6 +1068,7 @@ impl App {
if let BottomWidgetType::ProcSearch = self.current_widget.widget_type {
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -1159,6 +1173,7 @@ impl App {
self.second_char = Some('d');
}
} else if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1190,6 +1205,7 @@ impl App {
'c' => {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1200,12 +1216,14 @@ impl App {
'm' => {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
proc_widget_state.select_column(ProcWidgetColumn::Mem);
}
} else if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1215,12 +1233,14 @@ impl App {
'p' => {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
proc_widget_state.select_column(ProcWidgetColumn::PidOrCount);
}
} else if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1230,6 +1250,7 @@ impl App {
'P' => {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1240,12 +1261,14 @@ impl App {
'n' => {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
proc_widget_state.select_column(ProcWidgetColumn::ProcNameOrCommand);
}
} else if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1264,12 +1287,14 @@ impl App {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
self.toggle_tree_mode()
} else if let Some(temp) = self
.states
.temp_state
.get_mut_widget_state(self.current_widget.widget_id)
{
temp.table.set_sort_index(1);
temp.force_data_update();
} else if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1284,6 +1309,7 @@ impl App {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
self.toggle_sort_menu()
} else if let Some(temp) = self
.states
.temp_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1294,6 +1320,7 @@ impl App {
}
'u' => {
if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1302,6 +1329,7 @@ impl App {
}
'r' => {
if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1310,6 +1338,7 @@ impl App {
}
'w' => {
if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1418,14 +1447,17 @@ impl App {
| BottomWidgetType::ProcSort
| BottomWidgetType::Disk
| BottomWidgetType::Battery
if self.basic_table_widget_state.is_some()
if self.states.basic_table_widget_state.is_some()
&& (*direction == WidgetDirection::Left
|| *direction == WidgetDirection::Right) =>
{
// Gotta do this for the sort widget
if let BottomWidgetType::ProcSort = new_widget.widget_type {
if let Some(proc_widget_state) =
self.proc_state.widget_states.get(&(new_widget_id - 2))
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get(&(new_widget_id - 2))
{
if proc_widget_state.is_sort_open {
self.current_widget = new_widget.clone();
@ -1445,7 +1477,7 @@ impl App {
}
if let Some(basic_table_widget_state) =
&mut self.basic_table_widget_state
&mut self.states.basic_table_widget_state
{
basic_table_widget_state.currently_displayed_widget_id =
self.current_widget.widget_id;
@ -1474,7 +1506,7 @@ impl App {
// Assuming we're in basic mode (BasicTables), then
// we want to move DOWN to the currently shown widget.
if let Some(basic_table_widget_state) =
&mut self.basic_table_widget_state
&mut self.states.basic_table_widget_state
{
// We also want to move towards Proc if we had set it to ProcSort.
if let BottomWidgetType::ProcSort =
@ -1512,6 +1544,7 @@ impl App {
match &new_widget.widget_type {
BottomWidgetType::CpuLegend => {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get(&(new_widget_id - *offset))
@ -1535,6 +1568,7 @@ impl App {
BottomWidgetType::ProcSearch
| BottomWidgetType::ProcSort => {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get(&(new_widget_id - *offset))
@ -1593,6 +1627,7 @@ impl App {
match &new_widget.widget_type {
BottomWidgetType::CpuLegend => {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get(&(new_widget_id - *offset))
@ -1613,6 +1648,7 @@ impl App {
BottomWidgetType::ProcSearch
| BottomWidgetType::ProcSort => {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get(&(new_widget_id - *offset))
@ -1671,6 +1707,7 @@ impl App {
match &self.current_widget.widget_type {
BottomWidgetType::CpuLegend => {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get(&(self.current_widget.widget_id - *offset))
@ -1682,6 +1719,7 @@ impl App {
}
BottomWidgetType::ProcSearch | BottomWidgetType::ProcSort => {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get(&(self.current_widget.widget_id - *offset))
@ -1738,7 +1776,7 @@ impl App {
if let Some(new_widget_id) = current_widget.down_neighbour {
if let Some(new_widget) = self.widget_map.get(&new_widget_id) {
if let Some(proc_widget_state) =
self.proc_state.get_widget_state(widget_id)
self.states.proc_state.get_widget_state(widget_id)
{
if proc_widget_state.is_search_enabled() {
self.current_widget = new_widget.clone();
@ -1758,6 +1796,7 @@ impl App {
if let BottomWidgetType::Proc = self.current_widget.widget_type {
if let Some(new_widget_id) = self.current_widget.left_neighbour {
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get(&self.current_widget.widget_id)
@ -1773,6 +1812,7 @@ impl App {
if let BottomWidgetType::Cpu = self.current_widget.widget_type {
if let Some(current_widget) = self.widget_map.get(&self.current_widget.widget_id) {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get(&self.current_widget.widget_id)
@ -1818,6 +1858,7 @@ impl App {
} else if let BottomWidgetType::Cpu = self.current_widget.widget_type {
if let Some(current_widget) = self.widget_map.get(&self.current_widget.widget_id) {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get(&self.current_widget.widget_id)
@ -1839,6 +1880,7 @@ impl App {
match self.current_widget.widget_type {
BottomWidgetType::Proc => {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1847,6 +1889,7 @@ impl App {
}
BottomWidgetType::ProcSort => {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id - 2)
{
@ -1855,6 +1898,7 @@ impl App {
}
BottomWidgetType::Temp => {
if let Some(temp_widget_state) = self
.states
.temp_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1863,6 +1907,7 @@ impl App {
}
BottomWidgetType::Disk => {
if let Some(disk_widget_state) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1871,6 +1916,7 @@ impl App {
}
BottomWidgetType::CpuLegend => {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.get_mut_widget_state(self.current_widget.widget_id - 1)
{
@ -1893,6 +1939,7 @@ impl App {
match self.current_widget.widget_type {
BottomWidgetType::Proc => {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1901,6 +1948,7 @@ impl App {
}
BottomWidgetType::ProcSort => {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id - 2)
{
@ -1909,6 +1957,7 @@ impl App {
}
BottomWidgetType::Temp => {
if let Some(temp_widget_state) = self
.states
.temp_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1917,6 +1966,7 @@ impl App {
}
BottomWidgetType::Disk => {
if let Some(disk_widget_state) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -1927,6 +1977,7 @@ impl App {
}
BottomWidgetType::CpuLegend => {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.get_mut_widget_state(self.current_widget.widget_id - 1)
{
@ -1969,6 +2020,7 @@ impl App {
fn change_process_sort_position(&mut self, num_to_change_by: i64) {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id - 2)
{
@ -1980,6 +2032,7 @@ impl App {
fn change_cpu_legend_position(&mut self, num_to_change_by: i64) {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))
@ -1991,6 +2044,7 @@ impl App {
/// Returns the new position.
fn change_process_position(&mut self, num_to_change_by: i64) -> Option<usize> {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -2002,6 +2056,7 @@ impl App {
fn change_temp_position(&mut self, num_to_change_by: i64) {
if let Some(temp_widget_state) = self
.states
.temp_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2012,6 +2067,7 @@ impl App {
fn change_disk_position(&mut self, num_to_change_by: i64) {
if let Some(disk_widget_state) = self
.states
.disk_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2097,6 +2153,7 @@ impl App {
fn toggle_collapsing_process_branch(&mut self) {
if let Some(pws) = self
.states
.proc_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2109,6 +2166,7 @@ impl App {
match self.current_widget.widget_type {
BottomWidgetType::Cpu => {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2117,7 +2175,7 @@ impl App {
+ self.app_config_fields.time_interval;
if new_time <= self.app_config_fields.retention_ms {
cpu_widget_state.current_display_time = new_time;
self.cpu_state.force_update = Some(self.current_widget.widget_id);
self.states.cpu_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
cpu_widget_state.autohide_timer = Some(Instant::now());
}
@ -2125,7 +2183,7 @@ impl App {
!= self.app_config_fields.retention_ms
{
cpu_widget_state.current_display_time = self.app_config_fields.retention_ms;
self.cpu_state.force_update = Some(self.current_widget.widget_id);
self.states.cpu_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
cpu_widget_state.autohide_timer = Some(Instant::now());
}
@ -2134,6 +2192,7 @@ impl App {
}
BottomWidgetType::Mem => {
if let Some(mem_widget_state) = self
.states
.mem_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2142,7 +2201,7 @@ impl App {
+ self.app_config_fields.time_interval;
if new_time <= self.app_config_fields.retention_ms {
mem_widget_state.current_display_time = new_time;
self.mem_state.force_update = Some(self.current_widget.widget_id);
self.states.mem_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
mem_widget_state.autohide_timer = Some(Instant::now());
}
@ -2150,7 +2209,7 @@ impl App {
!= self.app_config_fields.retention_ms
{
mem_widget_state.current_display_time = self.app_config_fields.retention_ms;
self.mem_state.force_update = Some(self.current_widget.widget_id);
self.states.mem_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
mem_widget_state.autohide_timer = Some(Instant::now());
}
@ -2159,6 +2218,7 @@ impl App {
}
BottomWidgetType::Net => {
if let Some(net_widget_state) = self
.states
.net_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2167,7 +2227,7 @@ impl App {
+ self.app_config_fields.time_interval;
if new_time <= self.app_config_fields.retention_ms {
net_widget_state.current_display_time = new_time;
self.net_state.force_update = Some(self.current_widget.widget_id);
self.states.net_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
net_widget_state.autohide_timer = Some(Instant::now());
}
@ -2175,7 +2235,7 @@ impl App {
!= self.app_config_fields.retention_ms
{
net_widget_state.current_display_time = self.app_config_fields.retention_ms;
self.net_state.force_update = Some(self.current_widget.widget_id);
self.states.net_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
net_widget_state.autohide_timer = Some(Instant::now());
}
@ -2190,6 +2250,7 @@ impl App {
match self.current_widget.widget_type {
BottomWidgetType::Cpu => {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2198,7 +2259,7 @@ impl App {
- self.app_config_fields.time_interval;
if new_time >= constants::STALE_MIN_MILLISECONDS {
cpu_widget_state.current_display_time = new_time;
self.cpu_state.force_update = Some(self.current_widget.widget_id);
self.states.cpu_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
cpu_widget_state.autohide_timer = Some(Instant::now());
}
@ -2206,7 +2267,7 @@ impl App {
!= constants::STALE_MIN_MILLISECONDS
{
cpu_widget_state.current_display_time = constants::STALE_MIN_MILLISECONDS;
self.cpu_state.force_update = Some(self.current_widget.widget_id);
self.states.cpu_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
cpu_widget_state.autohide_timer = Some(Instant::now());
}
@ -2215,6 +2276,7 @@ impl App {
}
BottomWidgetType::Mem => {
if let Some(mem_widget_state) = self
.states
.mem_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2223,7 +2285,7 @@ impl App {
- self.app_config_fields.time_interval;
if new_time >= constants::STALE_MIN_MILLISECONDS {
mem_widget_state.current_display_time = new_time;
self.mem_state.force_update = Some(self.current_widget.widget_id);
self.states.mem_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
mem_widget_state.autohide_timer = Some(Instant::now());
}
@ -2231,7 +2293,7 @@ impl App {
!= constants::STALE_MIN_MILLISECONDS
{
mem_widget_state.current_display_time = constants::STALE_MIN_MILLISECONDS;
self.mem_state.force_update = Some(self.current_widget.widget_id);
self.states.mem_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
mem_widget_state.autohide_timer = Some(Instant::now());
}
@ -2240,6 +2302,7 @@ impl App {
}
BottomWidgetType::Net => {
if let Some(net_widget_state) = self
.states
.net_state
.widget_states
.get_mut(&self.current_widget.widget_id)
@ -2248,7 +2311,7 @@ impl App {
- self.app_config_fields.time_interval;
if new_time >= constants::STALE_MIN_MILLISECONDS {
net_widget_state.current_display_time = new_time;
self.net_state.force_update = Some(self.current_widget.widget_id);
self.states.net_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
net_widget_state.autohide_timer = Some(Instant::now());
}
@ -2256,7 +2319,7 @@ impl App {
!= constants::STALE_MIN_MILLISECONDS
{
net_widget_state.current_display_time = constants::STALE_MIN_MILLISECONDS;
self.net_state.force_update = Some(self.current_widget.widget_id);
self.states.net_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
net_widget_state.autohide_timer = Some(Instant::now());
}
@ -2269,12 +2332,13 @@ impl App {
fn reset_cpu_zoom(&mut self) {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.widget_states
.get_mut(&self.current_widget.widget_id)
{
cpu_widget_state.current_display_time = self.app_config_fields.default_time_value;
self.cpu_state.force_update = Some(self.current_widget.widget_id);
self.states.cpu_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
cpu_widget_state.autohide_timer = Some(Instant::now());
}
@ -2283,12 +2347,13 @@ impl App {
fn reset_mem_zoom(&mut self) {
if let Some(mem_widget_state) = self
.states
.mem_state
.widget_states
.get_mut(&self.current_widget.widget_id)
{
mem_widget_state.current_display_time = self.app_config_fields.default_time_value;
self.mem_state.force_update = Some(self.current_widget.widget_id);
self.states.mem_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
mem_widget_state.autohide_timer = Some(Instant::now());
}
@ -2297,12 +2362,13 @@ impl App {
fn reset_net_zoom(&mut self) {
if let Some(net_widget_state) = self
.states
.net_state
.widget_states
.get_mut(&self.current_widget.widget_id)
{
net_widget_state.current_display_time = self.app_config_fields.default_time_value;
self.net_state.force_update = Some(self.current_widget.widget_id);
self.states.net_state.force_update = Some(self.current_widget.widget_id);
if self.app_config_fields.autohide_time {
net_widget_state.autohide_timer = Some(Instant::now());
}
@ -2333,7 +2399,7 @@ impl App {
// Short circuit if we're in basic table... we might have to handle the basic table arrow
// case here...
if let Some(bt) = &mut self.basic_table_widget_state {
if let Some(bt) = &mut self.states.basic_table_widget_state {
if let (
Some((left_tlc_x, left_tlc_y)),
Some((left_brc_x, left_brc_y)),
@ -2350,8 +2416,10 @@ impl App {
self.current_widget = new_widget.clone();
if let BottomWidgetType::Proc = &new_widget.widget_type {
if let Some(proc_widget_state) =
self.proc_state.get_widget_state(new_widget.widget_id)
if let Some(proc_widget_state) = self
.states
.proc_state
.get_widget_state(new_widget.widget_id)
{
if proc_widget_state.is_sort_open {
self.move_widget_selection(&WidgetDirection::Left);
@ -2372,8 +2440,10 @@ impl App {
self.current_widget = new_widget.clone();
if let BottomWidgetType::ProcSort = &new_widget.widget_type {
if let Some(proc_widget_state) =
self.proc_state.get_widget_state(new_widget.widget_id - 2)
if let Some(proc_widget_state) = self
.states
.proc_state
.get_widget_state(new_widget.widget_id - 2)
{
if proc_widget_state.is_sort_open {
self.move_widget_selection(&WidgetDirection::Right);
@ -2429,7 +2499,7 @@ impl App {
| BottomWidgetType::Disk
| BottomWidgetType::Battery => {
if let Some(basic_table_widget_state) =
&mut self.basic_table_widget_state
&mut self.states.basic_table_widget_state
{
basic_table_widget_state.currently_displayed_widget_id =
self.current_widget.widget_id;
@ -2475,6 +2545,7 @@ impl App {
match &self.current_widget.widget_type {
BottomWidgetType::Proc => {
if let Some(proc_widget_state) = self
.states
.proc_state
.get_widget_state(self.current_widget.widget_id)
{
@ -2502,6 +2573,7 @@ impl App {
BottomWidgetType::ProcSort => {
// TODO: [Feature] This could sort if you double click!
if let Some(proc_widget_state) = self
.states
.proc_state
.get_widget_state(self.current_widget.widget_id - 2)
{
@ -2516,6 +2588,7 @@ impl App {
}
BottomWidgetType::CpuLegend => {
if let Some(cpu_widget_state) = self
.states
.cpu_state
.get_widget_state(self.current_widget.widget_id - 1)
{
@ -2530,6 +2603,7 @@ impl App {
}
BottomWidgetType::Temp => {
if let Some(temp_widget_state) = self
.states
.temp_state
.get_widget_state(self.current_widget.widget_id)
{
@ -2544,6 +2618,7 @@ impl App {
}
BottomWidgetType::Disk => {
if let Some(disk_widget_state) = self
.states
.disk_state
.get_widget_state(self.current_widget.widget_id)
{
@ -2565,6 +2640,7 @@ impl App {
match &self.current_widget.widget_type {
BottomWidgetType::Proc => {
if let Some(state) = self
.states
.proc_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -2575,6 +2651,7 @@ impl App {
}
BottomWidgetType::Temp => {
if let Some(temp) = self
.states
.temp_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -2585,6 +2662,7 @@ impl App {
}
BottomWidgetType::Disk => {
if let Some(disk) = self
.states
.disk_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -2600,6 +2678,7 @@ impl App {
}
BottomWidgetType::Battery => {
if let Some(battery_widget_state) = self
.states
.battery_state
.get_mut_widget_state(self.current_widget.widget_id)
{
@ -2648,6 +2727,7 @@ impl App {
// In particular, encapsulate this entire logic and add some tests to make it less potentially error-prone.
let is_in_search_widget = self.is_in_search_widget();
if let Some(proc_widget_state) = self
.states
.proc_state
.widget_states
.get_mut(&(self.current_widget.widget_id - 1))

View file

@ -14,6 +14,17 @@ use crate::{
},
};
pub struct AppWidgetStates {
pub cpu_state: CpuState,
pub mem_state: MemState,
pub net_state: NetState,
pub proc_state: ProcState,
pub temp_state: TempState,
pub disk_state: DiskState,
pub battery_state: BatteryState,
pub basic_table_widget_state: Option<BasicTableWidgetState>,
}
#[derive(Debug)]
pub enum CursorDirection {
Left,

View file

@ -233,7 +233,7 @@ fn main() -> Result<()> {
if app.used_widgets.use_disk {
app.converted_data.ingest_disk_data(&app.data_collection);
for disk in app.disk_state.widget_states.values_mut() {
for disk in app.states.disk_state.widget_states.values_mut() {
disk.force_data_update();
}
}
@ -245,7 +245,7 @@ fn main() -> Result<()> {
app.app_config_fields.temperature_type,
);
for temp in app.temp_state.widget_states.values_mut() {
for temp in app.states.temp_state.widget_states.values_mut() {
temp.force_data_update();
}
}
@ -297,7 +297,7 @@ fn main() -> Result<()> {
// Processes
if app.used_widgets.use_proc {
for proc in app.proc_state.widget_states.values_mut() {
for proc in app.states.proc_state.widget_states.values_mut() {
proc.force_data_update();
}
}

View file

@ -264,7 +264,7 @@ impl Painter {
app_state.delete_dialog_state.button_positions = vec![];
// Reset battery dialog...
for battery_widget in app_state.battery_state.widget_states.values_mut() {
for battery_widget in app_state.states.battery_state.widget_states.values_mut() {
battery_widget.tab_click_locs = None;
}
}
@ -480,7 +480,7 @@ impl Painter {
}
let mut later_widget_id: Option<u64> = None;
if let Some(basic_table_widget_state) = &app_state.basic_table_widget_state {
if let Some(basic_table_widget_state) = &app_state.states.basic_table_widget_state {
let widget_id = basic_table_widget_state.currently_displayed_widget_id;
later_widget_id = Some(widget_id);
if vertical_chunks[3].width >= 2 {

View file

@ -32,6 +32,7 @@ impl Painter {
return Some(Text::from(vec![
Spans::from(""),
if app_state
.states
.proc_state
.widget_states
.get(&app_state.current_widget.widget_id)

View file

@ -140,7 +140,7 @@ impl Painter {
// actually too large - so, we assume all of them are one too big and check via < (see
// https://github.com/ClementTsang/bottom/pull/459 for details).
// - So in other words, to make it simple, we keep this to a standard and overshoot by one here.
if let Some(basic_table) = &mut app_state.basic_table_widget_state {
if let Some(basic_table) = &mut app_state.states.basic_table_widget_state {
basic_table.left_tlc =
Some((margined_draw_loc[0].x, margined_draw_loc[0].y + 1));
basic_table.left_brc = Some((

View file

@ -20,8 +20,11 @@ impl Painter {
widget_id: u64,
) {
let should_get_widget_bounds = app_state.should_get_widget_bounds();
if let Some(battery_widget_state) =
app_state.battery_state.widget_states.get_mut(&widget_id)
if let Some(battery_widget_state) = app_state
.states
.battery_state
.widget_states
.get_mut(&widget_id)
{
let is_on_widget = widget_id == app_state.current_widget.widget_id;
let border_style = if is_on_widget {

View file

@ -38,7 +38,9 @@ impl Painter {
}
}
self.draw_cpu_graph(f, app_state, draw_loc, widget_id);
if let Some(cpu_widget_state) = app_state.cpu_state.widget_states.get_mut(&widget_id) {
if let Some(cpu_widget_state) =
app_state.states.cpu_state.widget_states.get_mut(&widget_id)
{
cpu_widget_state.is_legend_hidden = true;
}
@ -180,7 +182,8 @@ impl Painter {
const Y_BOUNDS: [f64; 2] = [0.0, 100.5];
const Y_LABELS: [Cow<'static, str>; 2] = [Cow::Borrowed(" 0%"), Cow::Borrowed("100%")];
if let Some(cpu_widget_state) = app_state.cpu_state.widget_states.get_mut(&widget_id) {
if let Some(cpu_widget_state) = app_state.states.cpu_state.widget_states.get_mut(&widget_id)
{
let cpu_data = &app_state.converted_data.cpu_data;
let border_style = self.get_border_style(widget_id, app_state.current_widget.widget_id);
let x_bounds = [0, cpu_widget_state.current_display_time];
@ -237,7 +240,11 @@ impl Painter {
&self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64,
) {
let recalculate_column_widths = app_state.should_get_widget_bounds();
if let Some(cpu_widget_state) = app_state.cpu_state.widget_states.get_mut(&(widget_id - 1))
if let Some(cpu_widget_state) = app_state
.states
.cpu_state
.widget_states
.get_mut(&(widget_id - 1))
{
// TODO: This line (and the one above, see caller) is pretty dumb but I guess needed for now. Refactor if possible!
cpu_widget_state.is_legend_hidden = false;

View file

@ -11,7 +11,12 @@ impl Painter {
&self, f: &mut Frame<'_, B>, app_state: &mut app::App, draw_loc: Rect, widget_id: u64,
) {
let recalculate_column_widths = app_state.should_get_widget_bounds();
if let Some(disk_widget_state) = app_state.disk_state.widget_states.get_mut(&widget_id) {
if let Some(disk_widget_state) = app_state
.states
.disk_state
.widget_states
.get_mut(&widget_id)
{
let is_on_widget = app_state.current_widget.widget_id == widget_id;
let draw_info = DrawInfo {

View file

@ -20,7 +20,8 @@ impl Painter {
const Y_BOUNDS: [f64; 2] = [0.0, 100.5];
const Y_LABELS: [Cow<'static, str>; 2] = [Cow::Borrowed(" 0%"), Cow::Borrowed("100%")];
if let Some(mem_widget_state) = app_state.mem_state.widget_states.get_mut(&widget_id) {
if let Some(mem_widget_state) = app_state.states.mem_state.widget_states.get_mut(&widget_id)
{
let border_style = self.get_border_style(widget_id, app_state.current_widget.widget_id);
let x_bounds = [0, mem_widget_state.current_display_time];
let hide_x_labels = should_hide_x_label(

View file

@ -55,7 +55,9 @@ impl Painter {
&self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64,
hide_legend: bool,
) {
if let Some(network_widget_state) = app_state.net_state.widget_states.get_mut(&widget_id) {
if let Some(network_widget_state) =
app_state.states.net_state.widget_states.get_mut(&widget_id)
{
let network_data_rx = &app_state.converted_data.network_data_rx;
let network_data_tx = &app_state.converted_data.network_data_tx;
let time_start = -(network_widget_state.current_display_time as f64);

View file

@ -24,7 +24,7 @@ impl Painter {
&self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, draw_border: bool,
widget_id: u64,
) {
if let Some(proc_widget_state) = app_state.proc_state.widget_states.get(&widget_id) {
if let Some(proc_widget_state) = app_state.states.proc_state.widget_states.get(&widget_id) {
let search_height = if draw_border { 5 } else { 3 };
let is_sort_open = proc_widget_state.is_sort_open;
@ -58,7 +58,12 @@ impl Painter {
self.draw_processes_table(f, app_state, proc_draw_loc, widget_id);
}
if let Some(proc_widget_state) = app_state.proc_state.widget_states.get_mut(&widget_id) {
if let Some(proc_widget_state) = app_state
.states
.proc_state
.widget_states
.get_mut(&widget_id)
{
// Reset redraw marker.
if proc_widget_state.force_rerender {
proc_widget_state.force_rerender = false;
@ -72,7 +77,12 @@ impl Painter {
&self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64,
) {
let should_get_widget_bounds = app_state.should_get_widget_bounds();
if let Some(proc_widget_state) = app_state.proc_state.widget_states.get_mut(&widget_id) {
if let Some(proc_widget_state) = app_state
.states
.proc_state
.widget_states
.get_mut(&widget_id)
{
let recalculate_column_widths =
should_get_widget_bounds || proc_widget_state.force_rerender;
@ -145,8 +155,11 @@ impl Painter {
}
}
if let Some(proc_widget_state) =
app_state.proc_state.widget_states.get_mut(&(widget_id - 1))
if let Some(proc_widget_state) = app_state
.states
.proc_state
.widget_states
.get_mut(&(widget_id - 1))
{
let is_on_widget = widget_id == app_state.current_widget.widget_id;
let num_columns = usize::from(draw_loc.width);
@ -298,7 +311,12 @@ impl Painter {
&self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, widget_id: u64,
) {
let should_get_widget_bounds = app_state.should_get_widget_bounds();
if let Some(pws) = app_state.proc_state.widget_states.get_mut(&(widget_id - 2)) {
if let Some(pws) = app_state
.states
.proc_state
.widget_states
.get_mut(&(widget_id - 2))
{
let recalculate_column_widths = should_get_widget_bounds || pws.force_rerender;
let is_on_widget = widget_id == app_state.current_widget.widget_id;

View file

@ -11,7 +11,12 @@ impl Painter {
&self, f: &mut Frame<'_, B>, app_state: &mut app::App, draw_loc: Rect, widget_id: u64,
) {
let recalculate_column_widths = app_state.should_get_widget_bounds();
if let Some(temp_widget_state) = app_state.temp_state.widget_states.get_mut(&widget_id) {
if let Some(temp_widget_state) = app_state
.states
.temp_state
.widget_states
.get_mut(&widget_id)
{
let is_on_widget = app_state.current_widget.widget_id == widget_id;
let draw_info = DrawInfo {

View file

@ -342,7 +342,7 @@ pub fn update_data(app: &mut App) {
FrozenState::Frozen(data) => data,
};
for proc in app.proc_state.widget_states.values_mut() {
for proc in app.states.proc_state.widget_states.values_mut() {
if proc.force_update_data {
proc.ingest_data(data_source);
proc.force_update_data = false;
@ -350,23 +350,23 @@ pub fn update_data(app: &mut App) {
}
// FIXME: Make this CPU force update less terrible.
if app.cpu_state.force_update.is_some() {
if app.states.cpu_state.force_update.is_some() {
app.converted_data.ingest_cpu_data(data_source);
app.converted_data.load_avg_data = data_source.load_avg_harvest;
app.cpu_state.force_update = None;
app.states.cpu_state.force_update = None;
}
// FIXME: This is a bit of a temp hack to move data over.
{
let data = &app.converted_data.cpu_data;
for cpu in app.cpu_state.widget_states.values_mut() {
for cpu in app.states.cpu_state.widget_states.values_mut() {
cpu.update_table(data);
}
}
{
let data = &app.converted_data.temp_data;
for temp in app.temp_state.widget_states.values_mut() {
for temp in app.states.temp_state.widget_states.values_mut() {
if temp.force_update_data {
temp.ingest_data(data);
temp.force_update_data = false;
@ -375,7 +375,7 @@ pub fn update_data(app: &mut App) {
}
{
let data = &app.converted_data.disk_data;
for disk in app.disk_state.widget_states.values_mut() {
for disk in app.states.disk_state.widget_states.values_mut() {
if disk.force_update_data {
disk.ingest_data(data);
disk.force_update_data = false;
@ -384,7 +384,7 @@ pub fn update_data(app: &mut App) {
}
// TODO: [OPT] Prefer reassignment over new vectors?
if app.mem_state.force_update.is_some() {
if app.states.mem_state.force_update.is_some() {
app.converted_data.mem_data = convert_mem_data_points(data_source);
#[cfg(not(target_os = "windows"))]
{
@ -400,10 +400,10 @@ pub fn update_data(app: &mut App) {
{
app.converted_data.gpu_data = convert_gpu_data(data_source);
}
app.mem_state.force_update = None;
app.states.mem_state.force_update = None;
}
if app.net_state.force_update.is_some() {
if app.states.net_state.force_update.is_some() {
let (rx, tx) = get_rx_tx_data_points(
data_source,
&app.app_config_fields.network_scale_type,
@ -412,7 +412,7 @@ pub fn update_data(app: &mut App) {
);
app.converted_data.network_data_rx = rx;
app.converted_data.network_data_tx = tx;
app.net_state.force_update = None;
app.states.net_state.force_update = None;
}
}

View file

@ -428,27 +428,35 @@ pub fn build_app(
let net_filter =
get_ignore_list(&config.net_filter).context("Update 'net_filter' in your config file")?;
Ok(App::builder()
.app_config_fields(app_config_fields)
.cpu_state(CpuState::init(cpu_state_map))
.mem_state(MemState::init(mem_state_map))
.net_state(NetState::init(net_state_map))
.proc_state(ProcState::init(proc_state_map))
.disk_state(DiskState::init(disk_state_map))
.temp_state(TempState::init(temp_state_map))
.battery_state(BatteryState::init(battery_state_map))
.basic_table_widget_state(basic_table_widget_state)
.current_widget(widget_map.get(&initial_widget_id).unwrap().clone()) // TODO: [UNWRAP] - many of the unwraps are fine (like this one) but do a once-over and/or switch to expect?
.widget_map(widget_map)
.used_widgets(used_widgets)
.is_expanded(expanded_upon_startup && !use_basic_mode)
.filters(DataFilters {
disk_filter,
mount_filter,
temp_filter,
net_filter,
})
.build())
let states = AppWidgetStates {
cpu_state: CpuState::init(cpu_state_map),
mem_state: MemState::init(mem_state_map),
net_state: NetState::init(net_state_map),
proc_state: ProcState::init(proc_state_map),
temp_state: TempState::init(temp_state_map),
disk_state: DiskState::init(disk_state_map),
battery_state: BatteryState::init(battery_state_map),
basic_table_widget_state,
};
let current_widget = widget_map.get(&initial_widget_id).unwrap().clone();
let filters = DataFilters {
disk_filter,
mount_filter,
temp_filter,
net_filter,
};
let is_expanded = expanded_upon_startup && !use_basic_mode;
Ok(App::new(
app_config_fields,
states,
widget_map,
current_widget,
used_widgets,
filters,
is_expanded,
))
}
pub fn get_widget_layout(
@ -1048,10 +1056,11 @@ mod test {
if (default_app.app_config_fields == testing_app.app_config_fields)
&& default_app.is_expanded == testing_app.is_expanded
&& default_app
.states
.proc_state
.widget_states
.iter()
.zip(testing_app.proc_state.widget_states.iter())
.zip(testing_app.states.proc_state.widget_states.iter())
.all(|(a, b)| (a.1.test_equality(b.1)))
{
panic!("failed on {arg_name}");