pub mod data_harvester;
use data_harvester::{processes, temperature};
use std::time::Instant;
pub mod data_farmer;
use data_farmer::*;
use crate::{canvas, constants, utils::error::Result};
mod process_killer;
#[derive(Debug, Clone, Copy)]
pub enum WidgetPosition {
Cpu,
Mem,
Disk,
Temp,
Network,
Process,
ProcessSearch,
}
#[derive(Debug)]
pub enum ScrollDirection {
// UP means scrolling up --- this usually DECREMENTS
UP,
// DOWN means scrolling down --- this usually INCREMENTS
DOWN,
}
lazy_static! {
static ref BASE_REGEX: std::result::Result<regex::Regex, regex::Error> =
regex::Regex::new(".*");
}
/// AppScrollWidgetState deals with fields for a scrollable app's current state.
#[derive(Default)]
pub struct AppScrollWidgetState {
pub current_scroll_position: u64,
pub previous_scroll_position: u64,
}
pub struct AppScrollState {
pub scroll_direction: ScrollDirection,
pub process_scroll_state: AppScrollWidgetState,
pub disk_scroll_state: AppScrollWidgetState,
pub temp_scroll_state: AppScrollWidgetState,
pub cpu_scroll_state: AppScrollWidgetState,
}
impl Default for AppScrollState {
fn default() -> Self {
AppScrollState {
scroll_direction: ScrollDirection::DOWN,
process_scroll_state: AppScrollWidgetState::default(),
disk_scroll_state: AppScrollWidgetState::default(),
temp_scroll_state: AppScrollWidgetState::default(),
cpu_scroll_state: AppScrollWidgetState::default(),
}
}
}
/// AppSearchState only deals with the search's current settings and state.
pub struct AppSearchState {
current_search_query: String,
searching_pid: bool,
ignore_case: bool,
current_regex: std::result::Result<regex::Regex, regex::Error>,
current_cursor_position: usize,
match_word: bool,
use_regex: bool,
}
impl Default for AppSearchState {
fn default() -> Self {
AppSearchState {
current_search_query: String::default(),
searching_pid: false,
ignore_case: true,
current_regex: BASE_REGEX.clone(),
current_cursor_position: 0,
match_word: false,
use_regex: false,
}
}
}
impl AppSearchState {
pub fn toggle_ignore_case(&mut self) {
self.ignore_case = !self.ignore_case;
}
pub fn toggle_search_whole_word(&mut self) {
self.match_word = !self.match_word;
}
pub fn toggle_search_regex(&mut self) {
self.use_regex = !self.use_regex;
}
pub fn toggle_search_with_pid(&mut self) {
self.searching_pid = !self.searching_pid;
}
pub fn is_ignoring_case(&self) -> bool {
self.ignore_case
}
pub fn is_searching_whole_word(&self) -> bool {
self.match_word
}
pub fn is_searching_with_regex(&self) -> bool {
self.use_regex
}
pub fn is_searching_with_pid(&self) -> bool {
self.searching_pid
}
}
#[derive(Default)]
pub struct AppDeleteDialogState {
pub is_showing_dd: bool,
pub is_on_yes: bool, // Defaults to "No"
}
pub enum AppHelpCategory {
General,
Process,
Search,
}
pub struct AppHelpDialogState {
pub is_showing_help: bool,
pub current_category: AppHelpCategory,
}
impl Default for AppHelpDialogState {
fn default() -> Self {
AppHelpDialogState {
is_showing_help: false,
current_category: AppHelpCategory::General,
}
}
}
/// AppConfigFields is meant to cover basic fields that would normally be set
/// by config files or launch options. Don't need to be mutable (set and forget).
pub struct AppConfigFields {
pub update_rate_in_milliseconds: u64,
pub temperature_type: temperature::TemperatureType,
pub use_dot: bool,
pub left_legend: bool,
pub show_average_cpu: bool,
pub use_current_cpu_total: bool,
}
pub struct App {
pub process_sorting_type: processes::ProcessSorting,
pub process_sorting_reverse: bool,
pub update_process_gui: bool,
pub app_scroll_positions: AppScrollState,
pub current_widget_selected: WidgetPosition,
pub data: data_harvester::Data,
awaiting_second_char: bool,
second_char: Option<char>,
pub dd_err: Option<String>,
to_delete_process_list: Option<(String, Vec<u32>)>,
pub is_frozen: bool,
last_key_press: Instant,
pub canvas_data: canvas::DisplayableData,
enable_grouping: bool,
enable_searching: bool,
pub data_collection: DataCollection,
pub search_state: AppSearchState,
pub delete_dialog_state: AppDeleteDialogState,
pub help_dialog_state: AppHelpDialogState,
pub app_config_fields: AppConfigFields,
pub is_expanded: bool,
}
impl App {
pub fn new(
show_average_cpu: bool, temperature_type: temperature::TemperatureType,
update_rate_in_milliseconds: u64, use_dot: bool, left_legend: bool,
use_current_cpu_total: bool, current_widget_selected: WidgetPosition,
) -> App {
App {
process_sorting_type: processes::ProcessSorting::CPU,