diff options
Diffstat (limited to 'src/app/widgets/bottom_widgets/process.rs')
-rw-r--r-- | src/app/widgets/bottom_widgets/process.rs | 83 |
1 files changed, 80 insertions, 3 deletions
diff --git a/src/app/widgets/bottom_widgets/process.rs b/src/app/widgets/bottom_widgets/process.rs index 87177b22..eeff0b54 100644 --- a/src/app/widgets/bottom_widgets/process.rs +++ b/src/app/widgets/bottom_widgets/process.rs @@ -15,7 +15,7 @@ use tui::{ use crate::{ app::{ data_harvester::processes::ProcessHarvest, - event::{MultiKey, MultiKeyResult, ReturnSignal, WidgetEventResult}, + event::{MultiKey, MultiKeyResult, ReturnSignal, SelectionAction, WidgetEventResult}, query::*, text_table::DesiredColumnWidth, widgets::tui_stuff::BlockBuilder, @@ -575,6 +575,7 @@ impl ProcState { } /// The currently selected part of a [`ProcessManager`] +#[derive(PartialEq, Eq, Clone, Copy)] enum ProcessManagerSelection { Processes, Sort, @@ -775,6 +776,7 @@ pub struct ProcessManager { dd_multi: MultiKey, selected: ProcessManagerSelection, + prev_selected: ProcessManagerSelection, in_tree_mode: bool, show_sort: bool, @@ -819,6 +821,7 @@ impl ProcessManager { search_block_bounds: Rect::default(), dd_multi: MultiKey::register(vec!['d', 'd']), // TODO: Maybe use something static... selected: ProcessManagerSelection::Processes, + prev_selected: ProcessManagerSelection::Processes, in_tree_mode: false, show_sort: false, show_search: false, @@ -871,6 +874,7 @@ impl ProcessManager { WidgetEventResult::NoRedraw } else { self.show_search = true; + self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Search; WidgetEventResult::Redraw } @@ -883,6 +887,7 @@ impl ProcessManager { self.sort_menu .set_index(self.process_table.current_sorting_column_index()); self.show_sort = true; + self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Sort; WidgetEventResult::Redraw } @@ -966,6 +971,7 @@ impl ProcessManager { fn hide_sort(&mut self) { self.show_sort = false; if let ProcessManagerSelection::Sort = self.selected { + self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Processes; } } @@ -973,6 +979,7 @@ impl ProcessManager { fn hide_search(&mut self) { self.show_search = false; if let ProcessManagerSelection::Search = self.selected { + self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Processes; } } @@ -1129,6 +1136,7 @@ impl Component for ProcessManager { if let ProcessManagerSelection::Processes = self.selected { self.process_table.handle_mouse_event(event) } else { + self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Processes; match self.process_table.handle_mouse_event(event) { WidgetEventResult::Quit => WidgetEventResult::Quit, @@ -1142,6 +1150,7 @@ impl Component for ProcessManager { if let ProcessManagerSelection::Sort = self.selected { self.sort_menu.handle_mouse_event(event) } else { + self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Sort; self.sort_menu.handle_mouse_event(event); WidgetEventResult::Redraw @@ -1154,6 +1163,7 @@ impl Component for ProcessManager { if let ProcessManagerSelection::Search = self.selected { self.search_input.handle_mouse_event(event) } else { + self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Search; self.search_input.handle_mouse_event(event); WidgetEventResult::Redraw @@ -1261,9 +1271,11 @@ impl Widget for ProcessManager { area }; + let process_selected = + selected && matches!(self.selected, ProcessManagerSelection::Processes); let process_block = self .block() - .selected(selected && matches!(self.selected, ProcessManagerSelection::Processes)) + .selected(process_selected) .borders(self.block_border) .expanded(expanded && !self.show_sort && !self.show_search); @@ -1273,7 +1285,7 @@ impl Widget for ProcessManager { &self.display_data, process_block, area, - selected, + process_selected, self.show_scroll_index, ); } @@ -1485,4 +1497,69 @@ impl Widget for ProcessManager { fn height(&self) -> LayoutRule { self.height } + + fn handle_widget_selection_left(&mut self) -> SelectionAction { + if self.show_sort { + if let ProcessManagerSelection::Processes = self.selected { + self.prev_selected = self.selected; + self.selected = ProcessManagerSelection::Sort; + SelectionAction::Handled + } else { + SelectionAction::NotHandled + } + } else { + SelectionAction::NotHandled + } + } + + fn handle_widget_selection_right(&mut self) -> SelectionAction { + if self.show_sort { + if let ProcessManagerSelection::Sort = self.selected { + self.prev_selected = self.selected; + self.selected = ProcessManagerSelection::Processes; + SelectionAction::Handled + } else { + SelectionAction::NotHandled + } + } else { + SelectionAction::NotHandled + } + } + + fn handle_widget_selection_up(&mut self) -> SelectionAction { + if self.show_search { + if let ProcessManagerSelection::Search = self.selected { + let prev = self.prev_selected; + self.prev_selected = self.selected; + if self.show_sort && prev == ProcessManagerSelection::Sort { + self.selected = ProcessManagerSelection::Sort; + } else { + self.selected = ProcessManagerSelection::Processes; + } + SelectionAction::Handled + } else { + SelectionAction::NotHandled + } + } else { + SelectionAction::NotHandled + } + } + + fn handle_widget_selection_down(&mut self) -> SelectionAction { + if self.show_search { + if let ProcessManagerSelection::Processes = self.selected { + self.prev_selected = self.selected; + self.selected = ProcessManagerSelection::Search; + SelectionAction::Handled + } else if self.show_sort && self.selected == ProcessManagerSelection::Sort { + self.prev_selected = self.selected; + self.selected = ProcessManagerSelection::Search; + SelectionAction::Handled + } else { + SelectionAction::NotHandled + } + } else { + SelectionAction::NotHandled + } + } } |