use std::{borrow::Cow, collections::HashMap};
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers, MouseButton, MouseEvent, MouseEventKind};
use float_ord::FloatOrd;
use itertools::{Either, Itertools};
use once_cell::unsync::Lazy;
use tui::{
backend::Backend,
layout::{Constraint, Direction, Layout, Rect},
text::{Span, Spans},
widgets::{Borders, Paragraph},
Frame,
};
use crate::{
app::{
data_harvester::processes::ProcessHarvest,
event::{ComponentEventResult, MultiKey, MultiKeyResult, ReturnSignal, SelectionAction},
query::*,
text_table::DesiredColumnWidth,
widgets::tui_stuff::BlockBuilder,
AppConfigFields, DataCollection,
},
canvas::Painter,
data_conversion::get_string_with_bytes,
options::{layout_options::LayoutRule, ProcessDefaults},
utils::error::BottomError,
};
use crate::app::{
does_bound_intersect_coordinate,
sort_text_table::{SimpleSortableColumn, SortStatus, SortableColumn},
text_table::TextTableData,
Component, SortMenu, SortableTextTable, TextInput, Widget,
};
/// The currently selected part of a [`ProcessManager`]
#[derive(PartialEq, Eq, Clone, Copy)]
enum ProcessManagerSelection {
Processes,
Sort,
Search,
}
#[derive(Default)]
/// The state of the search modifiers.
struct SearchModifiers {
enable_case_sensitive: bool,
enable_whole_word: bool,
enable_regex: bool,
}
impl SearchModifiers {
fn toggle_case_sensitive(&mut self) {
self.enable_case_sensitive = !self.enable_case_sensitive;
}
fn toggle_whole_word(&mut self) {
self.enable_whole_word = !self.enable_whole_word;
}
fn toggle_regex(&mut self) {
self.enable_regex = !self.enable_regex;
}
}
enum FlexColumn {
Flex(f64),
Hard(Option<u16>),
}
pub enum ProcessSortType {
Pid,
Count,
Name,
Command,
Cpu,
Mem,
MemPercent,
Rps,
Wps,
TotalRead,
TotalWrite,
User,
State,
}
impl ProcessSortType {
fn to_str(&self) -> &'static str {
match self {
ProcessSortType::Pid => "PID",
ProcessSortType::Count => "Count",
ProcessSortType::Name => "Name",
ProcessSortType::Command => "Command",
ProcessSortType::Cpu => "CPU%",
ProcessSortType::Mem => "Mem",
ProcessSortType::MemPercent => "Mem%",
ProcessSortType::Rps => "R/s",
ProcessSortType::Wps => "W/s",
ProcessSortType::TotalRead => "T.Read",
ProcessSortType::TotalWrite => "T.Write",
ProcessSortType::User => "User",
ProcessSortType::State => "State",
}
}
fn shortcut(&self) -> Option<KeyEvent> {
match self