From 7ee85a82f794c44b3a0bb6a50e8075eff96bb4c8 Mon Sep 17 00:00:00 2001 From: ClementTsang Date: Wed, 22 Sep 2021 01:16:33 -0400 Subject: refactor: finish help menu --- src/app/data_farmer.rs | 3 - src/app/data_harvester/processes.rs | 1 - src/app/data_harvester/temperature.rs | 1 - src/app/event.rs | 109 +--------- src/app/event/multi_key.rs | 101 +++++++++ src/app/layout_manager.rs | 1 - src/app/widgets.rs | 77 ++++++- src/app/widgets/base/scrollable.rs | 47 ++--- src/app/widgets/base/sort_menu.rs | 6 +- src/app/widgets/base/sort_text_table.rs | 12 +- src/app/widgets/base/text_input.rs | 76 +++---- src/app/widgets/base/text_table.rs | 12 +- src/app/widgets/base/time_graph.rs | 42 ++-- src/app/widgets/bottom_widgets/basic_mem.rs | 11 +- src/app/widgets/bottom_widgets/battery.rs | 24 +-- src/app/widgets/bottom_widgets/carousel.rs | 12 +- src/app/widgets/bottom_widgets/cpu.rs | 16 +- src/app/widgets/bottom_widgets/disk.rs | 8 +- src/app/widgets/bottom_widgets/mem.rs | 8 +- src/app/widgets/bottom_widgets/net.rs | 25 +-- src/app/widgets/bottom_widgets/process.rs | 65 +++--- src/app/widgets/bottom_widgets/temp.rs | 11 +- src/app/widgets/dialogs.rs | 2 + src/app/widgets/dialogs/help.rs | 304 ++++++++++++++++++++++++++++ src/app/widgets/tui_stuff/block_builder.rs | 38 ++-- 25 files changed, 680 insertions(+), 332 deletions(-) create mode 100644 src/app/event/multi_key.rs create mode 100644 src/app/widgets/dialogs.rs create mode 100644 src/app/widgets/dialogs/help.rs (limited to 'src/app') diff --git a/src/app/data_farmer.rs b/src/app/data_farmer.rs index c2747289..dc6ee1ab 100644 --- a/src/app/data_farmer.rs +++ b/src/app/data_farmer.rs @@ -224,15 +224,12 @@ impl DataCollection { } fn eat_temp(&mut self, temperature_sensors: Vec) { - // TODO: [PO] To implement self.temp_harvest = temperature_sensors.to_vec(); } fn eat_disks( &mut self, disks: Vec, io: disks::IoHarvest, harvested_time: Instant, ) { - // TODO: [PO] To implement - let time_since_last_harvest = harvested_time .duration_since(self.current_instant) .as_secs_f64(); diff --git a/src/app/data_harvester/processes.rs b/src/app/data_harvester/processes.rs index 3d8d7d5c..151d3a55 100644 --- a/src/app/data_harvester/processes.rs +++ b/src/app/data_harvester/processes.rs @@ -27,7 +27,6 @@ use std::borrow::Cow; use crate::Pid; -// TODO: Add value so we know if it's sorted ascending or descending by default? #[derive(Clone, PartialEq, Eq, Hash, Debug)] pub enum ProcessSorting { CpuPercent, diff --git a/src/app/data_harvester/temperature.rs b/src/app/data_harvester/temperature.rs index 8f3b776e..3426a053 100644 --- a/src/app/data_harvester/temperature.rs +++ b/src/app/data_harvester/temperature.rs @@ -57,7 +57,6 @@ fn is_temp_filtered(filter: &Option, text: &str) -> bool { fn temp_vec_sort(temperature_vec: &mut Vec) { // By default, sort temperature, then by alphabetically! - // TODO: [TEMPS] Allow users to control this. // Note we sort in reverse here; we want greater temps to be higher priority. temperature_vec.sort_by(|a, b| match a.temperature.partial_cmp(&b.temperature) { diff --git a/src/app/event.rs b/src/app/event.rs index 9201e2c0..f727050d 100644 --- a/src/app/event.rs +++ b/src/app/event.rs @@ -1,6 +1,5 @@ -use std::time::{Duration, Instant}; - -const MAX_TIMEOUT: Duration = Duration::from_millis(400); +pub mod multi_key; +pub use multi_key::*; /// These are "signals" that are sent along with an [`WidgetEventResult`] to signify a potential additional action /// that the caller must do, along with the "core" result of either drawing or redrawing. @@ -32,9 +31,9 @@ pub enum EventResult { /// The results of a widget handling some event, like a mouse or key event, /// signifying what the program should then do next. #[derive(Debug)] -pub enum WidgetEventResult { - /// Kill the program. - Quit, +pub enum ComponentEventResult { + /// The event isn't handled by the widget, and should be propagated to the parent. + Unhandled, /// Trigger a redraw. Redraw, /// Don't trigger a redraw. @@ -50,101 +49,3 @@ pub enum SelectionAction { /// This event occurs if the widget did not handle the selection action; the caller must handle it. NotHandled, } - -/// The states a [`MultiKey`] can be in. -enum MultiKeyState { - /// Currently not waiting on any next input. - Idle, - /// Waiting for the next input, with a given trigger [`Instant`]. - Waiting { - /// When it was triggered. - trigger_instant: Instant, - - /// What part of the pattern it is at. - checked_index: usize, - }, -} - -/// The possible outcomes of calling [`MultiKey::input`]. -pub enum MultiKeyResult { - /// Returned when a character was *accepted*, but has not completed the sequence required. - Accepted, - /// Returned when a character is accepted and completes the sequence. - Completed, - /// Returned if a character breaks the sequence or if it has already timed out. - Rejected, -} - -/// A struct useful for managing multi-key keybinds. -pub struct MultiKey { - state: MultiKeyState, - pattern: Vec, -} - -impl MultiKey { - /// Creates a new [`MultiKey`] with a given pattern and timeout. - pub fn register(pattern: Vec) -> Self { - Self { - state: MultiKeyState::Idle, - pattern, - } - } - - /// Resets to an idle state. - fn reset(&mut self) { - self.state = MultiKeyState::Idle; - } - - /// Handles a char input and returns the current status of the [`MultiKey`] after, which is one of: - /// - Accepting the char and moving to the next state - /// - Completing the multi-key pattern - /// - Rejecting it - /// - /// Note that if a [`MultiKey`] only "times out" upon calling this - if it has timed out, it will first reset - /// before trying to check the char. - pub fn input(&mut self, c: char) -> MultiKeyResult { - match &mut self.state { - MultiKeyState::Idle => { - if let Some(first) = self.pattern.first() { - if *first == c { - self.state = MultiKeyState::Waiting { - trigger_instant: Instant::now(), - checked_index: 0, - }; - - return MultiKeyResult::Accepted; - } - } - - MultiKeyResult::Rejected - } - MultiKeyState::Waiting { - trigger_instant, - checked_index, - } => { - if trigger_instant.elapsed() > MAX_TIMEOUT { - // Just reset and recursively call (putting it into Idle). - self.reset(); - self.input(c) - } else if let Some(next) = self.pattern.get(*checked_index + 1) { - if *next == c { - *checked_index += 1; - - if *checked_index == self.pattern.len() - 1 { - self.reset(); - MultiKeyResult::Completed - } else { - MultiKeyResult::Accepted - } - } else { - self.reset(); - MultiKeyResult::Rejected - } - } else { - self.reset(); - MultiKeyResult::Rejected - } - } - } - } -} diff --git a/src/app/event/multi_key.rs b/src/app/event/multi_key.rs new file mode 100644 index 00000000..1ab2c1b7 --- /dev/null +++ b/src/app/event/multi_key.rs @@ -0,0 +1,101 @@ +use std::time::{Duration, Instant}; + +const MAX_TIMEOUT: Duration = Duration::from_millis(400); + +/// The states a [`MultiKey`] can be in. +enum MultiKeyState { + /// Currently not waiting on any next input. + Idle, + /// Waiting for the next input, with a given trigger [`Instant`]. + Waiting { + /// When it was triggered. + trigger_instant: Instant, + + /// What part of the pattern it is at. + checked_index: usize, + }, +} + +/// The possible outcomes of calling [`MultiKey::input`]. +pub enum MultiKeyResult { + /// Returned when a character was *accepted*, but has not completed the sequence required. + Accepted, + /// Returned when a character is accepted and completes the sequence. + Completed, + /// Returned if a character breaks the sequence or if it has already timed out. + Rejected, +} + +/// A struct useful for managing multi-key keybinds. +pub struct MultiKey { + state: MultiKeyState, + pattern: Vec, +} + +impl MultiKey { + /// Creates a new [`MultiKey`] with a given pattern and timeout. + pub fn register(pattern: Vec) -> Self { + Self { + state: MultiKeyState::Idle, + pattern, + } + } + + /// Resets to an idle state. + fn reset(&mut self) { + self.state = MultiKeyState::Idle; + } + + /// Handles a char input and returns the current status of the [`MultiKey`] after, which is one of: + /// - Accepting the char and moving to the next state + /// - Completing the multi-key pattern + /// - Rejecting it + /// + /// Note that if a [`MultiKey`] only "times out" upon calling this - if it has timed out, it will first reset + /// before trying to check the char. + pub fn input(&mut self, c: char) -> MultiKeyResult { + match &mut self.state { + MultiKeyState::Idle => { + if let Some(first) = self.pattern.first() { + if *first == c { + self.state = MultiKeyState::Waiting { + trigger_instant: Instant::now(), + checked_index: 0, + }; + + return MultiKeyResult::Accepted; + } + } + + MultiKeyResult::Rejected + } + MultiKeyState::Waiting { + trigger_instant, + checked_index, + } => { + if trigger_instant.elapsed() > MAX_TIMEOUT { + // Just reset and recursively call (putting it into Idle). + self.reset(); + self.input(c) + } else if let Some(next) = self.pattern.get(*checked_index + 1) { + if *next == c { + *checked_index += 1; + + if *checked_index == self.pattern.len() - 1 { + self.reset(); + MultiKeyResult::Completed + } else { + MultiKeyResult::Accepted + } + } else { + self.reset(); + MultiKeyResult::Rejected + } + } else { + self.reset(); + MultiKeyResult::Rejected + } + } + } + } +} diff --git a/src/app/layout_manager.rs b/src/app/layout_manager.rs index 61d17924..9f2c287b 100644 --- a/src/app/layout_manager.rs +++ b/src/app/layout_manager.rs @@ -1511,7 +1511,6 @@ pub fn move_widget_selection( } LayoutNode::Widget(_) => { // Halt! - // TODO: How does this handle carousel? current_id } } diff --git a/src/app/widgets.rs b/src/app/widgets.rs index ffc08cd6..f49a3890 100644 --- a/src/app/widgets.rs +++ b/src/app/widgets.rs @@ -7,11 +7,10 @@ use tui::{backend::Backend, layout::Rect, widgets::TableState, Frame}; use crate::{ app::{ - event::{SelectionAction, WidgetEventResult}, + event::{ComponentEventResult, SelectionAction}, layout_manager::BottomWidgetType, }, canvas::Painter, - constants, options::layout_options::LayoutRule, }; @@ -20,12 +19,15 @@ mod tui_stuff; pub mod base; pub use base::*; +pub mod dialogs; +pub use dialogs::*; + pub mod bottom_widgets; pub use bottom_widgets::*; use self::tui_stuff::BlockBuilder; -use super::data_farmer::DataCollection; +use super::{data_farmer::DataCollection, event::EventResult}; /// A trait for things that are drawn with state. #[enum_dispatch] @@ -33,16 +35,16 @@ use super::data_farmer::DataCollection; pub trait Component { /// Handles a [`KeyEvent`]. /// - /// Defaults to returning [`EventResult::NoRedraw`], indicating nothing should be done. - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { - WidgetEventResult::NoRedraw + /// Defaults to returning [`ComponentEventResult::Unhandled`], indicating the component does not handle this event. + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { + ComponentEventResult::Unhandled } /// Handles a [`MouseEvent`]. /// - /// Defaults to returning [`EventResult::Continue`], indicating nothing should be done. - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { - WidgetEventResult::NoRedraw + /// Defaults to returning [`ComponentEventResult::Unhandled`], indicating the component does not handle this event. + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { + ComponentEventResult::Unhandled } /// Returns a [`Component`]'s bounding box. Note that these are defined in *global*, *absolute* @@ -180,6 +182,41 @@ pub enum TmpBottomWidget { Empty, } +/// The states a dialog can be in. Consists of either: +/// - [`DialogState::Hidden`] - the dialog is currently not showing. +/// - [`DialogState::Shown`] - the dialog is showing. +#[derive(Debug)] +pub enum DialogState { + Hidden, + Shown(D), +} + +impl Default for DialogState +where + D: Default + Component, +{ + fn default() -> Self { + DialogState::Hidden + } +} + +impl DialogState +where + D: Default + Component, +{ + pub fn is_showing(&self) -> bool { + matches!(self, DialogState::Shown(_)) + } + + pub fn hide(&mut self) { + *self = DialogState::Hidden; + } + + pub fn show(&mut self) { + *self = DialogState::Shown(D::default()); + } +} + // ----- Old stuff below ----- #[derive(Debug)] @@ -250,7 +287,27 @@ impl Default for AppHelpDialogState { AppHelpDialogState { is_showing_help: false, scroll_state: ParagraphScrollState::default(), - index_shortcuts: vec![0; constants::HELP_TEXT.len()], + index_shortcuts: vec![], + } + } +} + +impl AppHelpDialogState { + pub fn increment(&mut self) -> EventResult { + if self.scroll_state.current_scroll_index < self.scroll_state.max_scroll_index { + self.scroll_state.current_scroll_index += 1; + EventResult::Redraw + } else { + EventResult::NoRedraw + } + } + + pub fn decrement(&mut self) -> EventResult { + if self.scroll_state.current_scroll_index > 0 { + self.scroll_state.current_scroll_index -= 1; + EventResult::Redraw + } else { + EventResult::NoRedraw } } } diff --git a/src/app/widgets/base/scrollable.rs b/src/app/widgets/base/scrollable.rs index ba4faa5f..b8652a9f 100644 --- a/src/app/widgets/base/scrollable.rs +++ b/src/app/widgets/base/scrollable.rs @@ -4,7 +4,7 @@ use crossterm::event::{KeyEvent, KeyModifiers, MouseButton, MouseEvent, MouseEve use tui::{layout::Rect, widgets::TableState}; use crate::app::{ - event::{MultiKey, MultiKeyResult, WidgetEventResult}, + event::{ComponentEventResult, MultiKey, MultiKeyResult}, Component, }; @@ -138,54 +138,54 @@ impl Scrollable { } } - fn skip_to_first(&mut self) -> WidgetEventResult { + fn skip_to_first(&mut self) -> ComponentEventResult { if self.current_index != 0 { self.set_index(0); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } else { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } } - fn skip_to_last(&mut self) -> WidgetEventResult { + fn skip_to_last(&mut self) -> ComponentEventResult { let last_index = self.num_items - 1; if self.current_index != last_index { self.set_index(last_index); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } else { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } } /// Moves *downward* by *incrementing* the current index. - fn move_down(&mut self, change_by: usize) -> WidgetEventResult { + fn move_down(&mut self, change_by: usize) -> ComponentEventResult { if self.num_items == 0 { - return WidgetEventResult::NoRedraw; + return ComponentEventResult::NoRedraw; } let new_index = self.current_index + change_by; if new_index >= self.num_items || self.current_index == new_index { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { self.set_index(new_index); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } /// Moves *upward* by *decrementing* the current index. - fn move_up(&mut self, change_by: usize) -> WidgetEventResult { + fn move_up(&mut self, change_by: usize) -> ComponentEventResult { if self.num_items == 0 { - return WidgetEventResult::NoRedraw; + return ComponentEventResult::NoRedraw; } let new_index = self.current_index.saturating_sub(change_by); if self.current_index == new_index { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { self.set_index(new_index); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } @@ -207,7 +207,7 @@ impl Scrollable { } impl Component for Scrollable { - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { use crossterm::event::KeyCode::{Char, Down, Up}; if event.modifiers == KeyModifiers::NONE || event.modifiers == KeyModifiers::SHIFT { @@ -218,18 +218,19 @@ impl Component for Scrollable { Char('k') => self.move_up(1), Char('g') => match self.gg_manager.input('g') { MultiKeyResult::Completed => self.skip_to_first(), - MultiKeyResult::Accepted => WidgetEventResult::NoRedraw, - MultiKeyResult::Rejected => WidgetEventResult::NoRedraw, + MultiKeyResult::Accepted | MultiKeyResult::Rejected => { + ComponentEventResult::NoRedraw + } }, Char('G') => self.skip_to_last(), - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { match event.kind { MouseEventKind::Down(MouseButton::Left) => { if self.does_bounds_intersect_mouse(&event) { @@ -256,11 +257,11 @@ impl Component for Scrollable { } } - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } MouseEventKind::ScrollDown => self.move_down(1), MouseEventKind::ScrollUp => self.move_up(1), - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } diff --git a/src/app/widgets/base/sort_menu.rs b/src/app/widgets/base/sort_menu.rs index b893a418..548bbf77 100644 --- a/src/app/widgets/base/sort_menu.rs +++ b/src/app/widgets/base/sort_menu.rs @@ -3,7 +3,7 @@ use tui::{backend::Backend, layout::Rect, Frame}; use crate::{ app::{ - event::WidgetEventResult, text_table::SimpleColumn, widgets::tui_stuff::BlockBuilder, + event::ComponentEventResult, text_table::SimpleColumn, widgets::tui_stuff::BlockBuilder, Component, TextTable, }, canvas::Painter, @@ -69,11 +69,11 @@ impl Component for SortMenu { self.bounds = new_bounds; } - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { self.table.handle_key_event(event) } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { self.table.handle_mouse_event(event) } } diff --git a/src/app/widgets/base/sort_text_table.rs b/src/app/widgets/base/sort_text_table.rs index 64766041..f1f3b0e4 100644 --- a/src/app/widgets/base/sort_text_table.rs +++ b/src/app/widgets/base/sort_text_table.rs @@ -5,7 +5,7 @@ use tui::{backend::Backend, layout::Rect, Frame}; use crate::{ app::{ - event::{ReturnSignal, WidgetEventResult}, + event::{ReturnSignal, ComponentEventResult}, widgets::tui_stuff::BlockBuilder, Component, TextTable, }, @@ -391,12 +391,12 @@ impl Component for SortableTextTable where S: SortableColumn, { - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { for (index, column) in self.table.columns.iter().enumerate() { if let Some((shortcut, _)) = *column.shortcut() { if shortcut == event { self.set_sort_index(index); - return WidgetEventResult::Signal(ReturnSignal::Update); + return ComponentEventResult::Signal(ReturnSignal::Update); } } } @@ -404,10 +404,10 @@ where self.table.scrollable.handle_key_event(event) } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { if let MouseEventKind::Down(MouseButton::Left) = event.kind { if !self.does_bounds_intersect_mouse(&event) { - return WidgetEventResult::NoRedraw; + return ComponentEventResult::NoRedraw; } // Note these are representing RELATIVE coordinates! They *need* the above intersection check for validity! @@ -419,7 +419,7 @@ where if let Some((start, end)) = column.get_x_bounds() { if x >= start && x <= end { self.set_sort_index(index); - return WidgetEventResult::Signal(ReturnSignal::Update); + return ComponentEventResult::Signal(ReturnSignal::Update); } } } diff --git a/src/app/widgets/base/text_input.rs b/src/app/widgets/base/text_input.rs index f3480c0e..47a5cb7b 100644 --- a/src/app/widgets/base/text_input.rs +++ b/src/app/widgets/base/text_input.rs @@ -13,8 +13,8 @@ use unicode_width::UnicodeWidthStr; use crate::{ app::{ event::{ + ComponentEventResult::{self}, ReturnSignal, - WidgetEventResult::{self}, }, Component, }, @@ -85,19 +85,19 @@ impl TextInput { } } - fn clear_text(&mut self) -> WidgetEventResult { + fn clear_text(&mut self) -> ComponentEventResult { if self.text.is_empty() { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { self.text = String::default(); self.cursor = GraphemeCursor::new(0, 0, true); self.window_index = Default::default(); self.cursor_direction = CursorDirection::Left; - WidgetEventResult::Signal(ReturnSignal::Update) + ComponentEventResult::Signal(ReturnSignal::Update) } } - fn move_word_forward(&mut self) -> WidgetEventResult { + fn move_word_forward(&mut self) -> ComponentEventResult { let current_index = self.cursor.cur_cursor(); if current_index < self.text.len() { @@ -105,30 +105,30 @@ impl TextInput { if index > 0 { self.cursor.set_cursor(index + current_index); self.cursor_direction = CursorDirection::Right; - return WidgetEventResult::Redraw; + return ComponentEventResult::Redraw; } } self.cursor.set_cursor(self.text.len()); } - WidgetEventResult::Redraw + ComponentEventResult::Redraw } - fn move_word_back(&mut self) -> WidgetEventResult { + fn move_word_back(&mut self) -> ComponentEventResult { let current_index = self.cursor.cur_cursor(); for (index, _word) in self.text[..current_index].unicode_word_indices().rev() { if index < current_index { self.cursor.set_cursor(index); self.cursor_direction = CursorDirection::Left; - return WidgetEventResult::Redraw; + return ComponentEventResult::Redraw; } } - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } - fn clear_word_from_cursor(&mut self) -> WidgetEventResult { + fn clear_word_from_cursor(&mut self) -> ComponentEventResult { // Fairly simple logic - create the word index iterator, skip the word that intersects with the current // cursor location, draw the rest, update the string. let current_index = self.cursor.cur_cursor(); @@ -147,16 +147,16 @@ impl TextInput { } if start_delete_index == current_index { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { self.text.drain(start_delete_index..current_index); self.cursor = GraphemeCursor::new(start_delete_index, self.text.len(), true); self.cursor_direction = CursorDirection::Left; - WidgetEventResult::Signal(ReturnSignal::Update) + ComponentEventResult::Signal(ReturnSignal::Update) } } - fn clear_previous_grapheme(&mut self) -> WidgetEventResult { + fn clear_previous_grapheme(&mut self) -> ComponentEventResult { let current_index = self.cursor.cur_cursor(); if current_index > 0 { @@ -166,13 +166,13 @@ impl TextInput { self.cursor = GraphemeCursor::new(new_index, self.text.len(), true); self.cursor_direction = CursorDirection::Left; - WidgetEventResult::Signal(ReturnSignal::Update) + ComponentEventResult::Signal(ReturnSignal::Update) } else { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } } - fn clear_current_grapheme(&mut self) -> WidgetEventResult { + fn clear_current_grapheme(&mut self) -> ComponentEventResult { let current_index = self.cursor.cur_cursor(); if current_index < self.text.len() { @@ -182,19 +182,19 @@ impl TextInput { self.cursor = GraphemeCursor::new(current_index, self.text.len(), true); self.cursor_direction = CursorDirection::Left; - WidgetEventResult::Signal(ReturnSignal::Update) + ComponentEventResult::Signal(ReturnSignal::Update) } else { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } } - fn insert_character(&mut self, c: char) -> WidgetEventResult { + fn insert_character(&mut self, c: char) -> ComponentEventResult { let current_index = self.cursor.cur_cursor(); self.text.insert(current_index, c); self.cursor = GraphemeCursor::new(current_index, self.text.len(), true); self.move_forward(); - WidgetEventResult::Signal(ReturnSignal::Update) + ComponentEventResult::Signal(ReturnSignal::Update) } /// Updates the window indexes and returns the start index. @@ -296,29 +296,29 @@ impl Component for TextInput { self.bounds = new_bounds; } - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { if event.modifiers.is_empty() { match event.code { KeyCode::Left => { let original_cursor = self.cursor.cur_cursor(); if self.move_back() == original_cursor { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } KeyCode::Right => { let original_cursor = self.cursor.cur_cursor(); if self.move_forward() == original_cursor { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } KeyCode::Backspace => self.clear_previous_grapheme(), KeyCode::Delete => self.clear_current_grapheme(), KeyCode::Char(c) => self.insert_character(c), - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } else if let KeyModifiers::CONTROL = event.modifiers { match event.code { @@ -326,46 +326,46 @@ impl Component for TextInput { let prev_index = self.cursor.cur_cursor(); self.cursor.set_cursor(0); if self.cursor.cur_cursor() == prev_index { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } KeyCode::Char('e') => { let prev_index = self.cursor.cur_cursor(); self.cursor.set_cursor(self.text.len()); if self.cursor.cur_cursor() == prev_index { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } KeyCode::Char('u') => self.clear_text(), KeyCode::Char('w') => self.clear_word_from_cursor(), KeyCode::Char('h') => self.clear_previous_grapheme(), - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } else if let KeyModifiers::ALT = event.modifiers { match event.code { KeyCode::Char('b') => self.move_word_back(), KeyCode::Char('f') => self.move_word_forward(), - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { // We are assuming this is within bounds... let x = event.column; let widget_x = self.bounds.x + 2; if x >= widget_x { - // TODO: do this - WidgetEventResult::Redraw + // TODO: Do this at some point after refactor + ComponentEventResult::Redraw } else { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } } } diff --git a/src/app/widgets/base/text_table.rs b/src/app/widgets/base/text_table.rs index 0814555c..e6d42001 100644 --- a/src/app/widgets/base/text_table.rs +++ b/src/app/widgets/base/text_table.rs @@ -15,7 +15,7 @@ use tui::{ use unicode_segmentation::UnicodeSegmentation; use crate::{ - app::{event::WidgetEventResult, widgets::tui_stuff::BlockBuilder, Component, Scrollable}, + app::{event::ComponentEventResult, widgets::tui_stuff::BlockBuilder, Component, Scrollable}, canvas::Painter, constants::TABLE_GAP_HEIGHT_LIMIT, }; @@ -130,7 +130,7 @@ where pub show_gap: bool, /// The bounding box of the [`TextTable`]. - pub bounds: Rect, // TODO: Consider moving bounds to something else??? + pub bounds: Rect, // TODO: Consider moving bounds to something else? /// The bounds including the border, if there is one. pub border_bounds: Rect, @@ -492,19 +492,19 @@ impl Component for TextTable where C: TableColumn, { - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { if self.selectable { self.scrollable.handle_key_event(event) } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { if self.selectable { self.scrollable.handle_mouse_event(event) } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } diff --git a/src/app/widgets/base/time_graph.rs b/src/app/widgets/base/time_graph.rs index 94e5f847..81ca9e15 100644 --- a/src/app/widgets/base/time_graph.rs +++ b/src/app/widgets/base/time_graph.rs @@ -15,7 +15,7 @@ use tui::{ use crate::{ app::{ - event::WidgetEventResult, + event::ComponentEventResult, widgets::tui_stuff::{ custom_legend_chart::{Axis, Dataset}, TimeChart, @@ -160,62 +160,62 @@ impl TimeGraph { } /// Handles a char `c`. - fn handle_char(&mut self, c: char) -> WidgetEventResult { + fn handle_char(&mut self, c: char) -> ComponentEventResult { match c { '-' => self.zoom_out(), '+' => self.zoom_in(), '=' => self.reset_zoom(), - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::NoRedraw, } } - fn zoom_in(&mut self) -> WidgetEventResult { + fn zoom_in(&mut self) -> ComponentEventResult { let new_time = self.current_display_time.saturating_sub(self.time_interval); if self.current_display_time == new_time { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else if new_time >= self.min_duration { self.current_display_time = new_time; self.autohide_timer.start_display_timer(); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } else if new_time != self.min_duration { self.current_display_time = self.min_duration; self.autohide_timer.start_display_timer(); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } else { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } } - fn zoom_out(&mut self) -> WidgetEventResult { + fn zoom_out(&mut self) -> ComponentEventResult { let new_time = self.current_display_time + self.time_interval; if self.current_display_time == new_time { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else if new_time <= self.max_duration { self.current_display_time = new_time; self.autohide_timer.start_display_timer(); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } else if new_time != self.max_duration { self.current_display_time = self.max_duration; self.autohide_timer.start_display_timer(); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } else { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } } - fn reset_zoom(&mut self) -> WidgetEventResult { + fn reset_zoom(&mut self) -> ComponentEventResult { if self.current_display_time == self.default_time_value { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { self.current_display_time = self.default_time_value; self.autohide_timer.start_display_timer(); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } @@ -307,24 +307,24 @@ impl TimeGraph { } impl Component for TimeGraph { - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { use crossterm::event::KeyCode::Char; if event.modifiers == KeyModifiers::NONE || event.modifiers == KeyModifiers::SHIFT { match event.code { Char(c) => self.handle_char(c), - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { match event.kind { MouseEventKind::ScrollDown => self.zoom_out(), MouseEventKind::ScrollUp => self.zoom_in(), - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } diff --git a/src/app/widgets/bottom_widgets/basic_mem.rs b/src/app/widgets/bottom_widgets/basic_mem.rs index d70d0e04..3658ee7c 100644 --- a/src/app/widgets/bottom_widgets/basic_mem.rs +++ b/src/app/widgets/bottom_widgets/basic_mem.rs @@ -8,7 +8,8 @@ use tui::{ use crate::{ app::{ - event::WidgetEventResult, widgets::tui_stuff::PipeGauge, Component, DataCollection, Widget, + event::ComponentEventResult, widgets::tui_stuff::PipeGauge, Component, DataCollection, + Widget, }, canvas::Painter, constants::SIDE_BORDERS, @@ -54,13 +55,13 @@ impl Component for BasicMem { self.bounds = new_bounds; } - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { match event.code { - KeyCode::Char('%') if event.modifiers.is_empty() => { + KeyCode::Char('%') => { self.use_percent = !self.use_percent; - WidgetEventResult::Redraw + ComponentEventResult::Redraw } - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } } diff --git a/src/app/widgets/bottom_widgets/battery.rs b/src/app/widgets/bottom_widgets/battery.rs index 1d0c9c8b..8c1d0721 100644 --- a/src/app/widgets/bottom_widgets/battery.rs +++ b/src/app/widgets/bottom_widgets/battery.rs @@ -14,7 +14,7 @@ use tui::{ use crate::{ app::{ - data_farmer::DataCollection, does_bound_intersect_coordinate, event::WidgetEventResult, + data_farmer::DataCollection, does_bound_intersect_coordinate, event::ComponentEventResult, widgets::tui_stuff::PipeGauge, Component, Widget, }, canvas::Painter, @@ -114,44 +114,44 @@ impl Component for BatteryTable { self.bounds = new_bounds; } - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { if event.modifiers.is_empty() { match event.code { KeyCode::Left => { let current_index = self.selected_index; self.decrement_index(); if current_index == self.selected_index { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } KeyCode::Right => { let current_index = self.selected_index; self.increment_index(); if current_index == self.selected_index { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { for (itx, bound) in self.tab_bounds.iter().enumerate() { if does_bound_intersect_coordinate(event.column, event.row, *bound) && itx < self.battery_data.len() { self.selected_index = itx; - return WidgetEventResult::Redraw; + return ComponentEventResult::Redraw; } } - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } @@ -183,7 +183,7 @@ impl Widget for BatteryTable { .block() .selected(selected) .borders(self.block_border) - .expanded(expanded) + .show_esc(expanded) .build(painter, area); let inner_area = block.inner(area); diff --git a/src/app/widgets/bottom_widgets/carousel.rs b/src/app/widgets/bottom_widgets/carousel.rs index 9c8356fb..92d3614c 100644 --- a/src/app/widgets/bottom_widgets/carousel.rs +++ b/src/app/widgets/bottom_widgets/carousel.rs @@ -12,7 +12,7 @@ use tui::{ use crate::{ app::{ - does_bound_intersect_coordinate, event::WidgetEventResult, Component, SelectableType, + does_bound_intersect_coordinate, event::ComponentEventResult, Component, SelectableType, Widget, }, canvas::Painter, @@ -164,7 +164,7 @@ impl Component for Carousel { self.bounds = new_bounds; } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { match event.kind { crossterm::event::MouseEventKind::Down(crossterm::event::MouseButton::Left) => { let x = event.column; @@ -172,15 +172,15 @@ impl Component for Carousel { if does_bound_intersect_coordinate(x, y, self.left_button_bounds) { self.decrement_index(); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } else if does_bound_intersect_coordinate(x, y, self.right_button_bounds) { self.increment_index(); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } } diff --git a/src/app/widgets/bottom_widgets/cpu.rs b/src/app/widgets/bottom_widgets/cpu.rs index 9397a7e1..6e5e18a5 100644 --- a/src/app/widgets/bottom_widgets/cpu.rs +++ b/src/app/widgets/bottom_widgets/cpu.rs @@ -9,7 +9,7 @@ use tui::{ use crate::{ app::{ - event::{SelectionAction, WidgetEventResult}, + event::{ComponentEventResult, SelectionAction}, text_table::SimpleColumn, time_graph::TimeGraphData, AppConfigFields, AppScrollWidgetState, CanvasTableWidthState, Component, DataCollection, @@ -118,21 +118,21 @@ impl CpuGraph { } impl Component for CpuGraph { - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { match self.selected { CpuGraphSelection::Graph => self.graph.handle_key_event(event), CpuGraphSelection::Legend => self.legend.handle_key_event(event), } } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { if self.graph.does_border_intersect_mouse(&event) { if let CpuGraphSelection::Graph = self.selected { self.graph.handle_mouse_event(event) } else { self.selected = CpuGraphSelection::Graph; self.graph.handle_mouse_event(event); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } else if self.legend.does_border_intersect_mouse(&event) { if let CpuGraphSelection::Legend = self.selected { @@ -140,10 +140,10 @@ impl Component for CpuGraph { } else { self.selected = CpuGraphSelection::Legend; self.legend.handle_mouse_event(event); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } @@ -193,7 +193,7 @@ impl Widget for CpuGraph { let legend_block = self .block() .selected(selected && matches!(&self.selected, CpuGraphSelection::Legend)) - .expanded(expanded) + .show_esc(expanded) .hide_title(true); let legend_data = self @@ -279,7 +279,7 @@ impl Widget for CpuGraph { let graph_block = self .block() .selected(selected && matches!(&self.selected, CpuGraphSelection::Graph)) - .expanded(expanded) + .show_esc(expanded) .build(painter, graph_block_area); self.graph.draw_tui_chart( diff --git a/src/app/widgets/bottom_widgets/disk.rs b/src/app/widgets/bottom_widgets/disk.rs index 1f5383da..74b63f86 100644 --- a/src/app/widgets/bottom_widgets/disk.rs +++ b/src/app/widgets/bottom_widgets/disk.rs @@ -5,7 +5,7 @@ use tui::{backend::Backend, layout::Rect, widgets::Borders, Frame}; use crate::{ app::{ - data_farmer::DataCollection, event::WidgetEventResult, + data_farmer::DataCollection, event::ComponentEventResult, sort_text_table::SimpleSortableColumn, text_table::TextTableData, AppScrollWidgetState, CanvasTableWidthState, Component, TextTable, Widget, }, @@ -105,11 +105,11 @@ impl DiskTable { } impl Component for DiskTable { - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { self.table.handle_key_event(event) } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { self.table.handle_mouse_event(event) } @@ -135,7 +135,7 @@ impl Widget for DiskTable { .block() .selected(selected) .borders(self.block_border) - .expanded(expanded); + .show_esc(expanded); self.table.draw_tui_table( painter, diff --git a/src/app/widgets/bottom_widgets/mem.rs b/src/app/widgets/bottom_widgets/mem.rs index 11880421..465e3ab9 100644 --- a/src/app/widgets/bottom_widgets/mem.rs +++ b/src/app/widgets/bottom_widgets/mem.rs @@ -4,7 +4,7 @@ use crossterm::event::{KeyEvent, MouseEvent}; use tui::{backend::Backend, layout::Rect}; use crate::{ - app::{event::WidgetEventResult, time_graph::TimeGraphData, DataCollection}, + app::{event::ComponentEventResult, time_graph::TimeGraphData, DataCollection}, app::{Component, TimeGraph, Widget}, data_conversion::{convert_mem_data_points, convert_mem_labels, convert_swap_data_points}, options::layout_options::LayoutRule, @@ -63,11 +63,11 @@ impl MemGraph { } impl Component for MemGraph { - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { self.graph.handle_key_event(event) } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { self.graph.handle_mouse_event(event) } @@ -92,7 +92,7 @@ impl Widget for MemGraph { let block = self .block() .selected(selected) - .expanded(expanded) + .show_esc(expanded) .build(painter, area); let mut chart_data = Vec::with_capacity(2); diff --git a/src/app/widgets/bottom_widgets/net.rs b/src/app/widgets/bottom_widgets/net.rs index b02b957f..1449aa6a 100644 --- a/src/app/widgets/bottom_widgets/net.rs +++ b/src/app/widgets/bottom_widgets/net.rs @@ -1,5 +1,6 @@ use std::{borrow::Cow, collections::HashMap, time::Instant}; +use crossterm::event::{KeyEvent, MouseEvent}; use tui::{ backend::Backend, layout::{Constraint, Direction, Layout, Rect}, @@ -8,9 +9,9 @@ use tui::{ use crate::{ app::{ - data_farmer::DataCollection, text_table::SimpleColumn, time_graph::TimeGraphData, - widgets::tui_stuff::BlockBuilder, AppConfigFields, AxisScaling, Component, TextTable, - TimeGraph, Widget, + data_farmer::DataCollection, event::ComponentEventResult, text_table::SimpleColumn, + time_graph::TimeGraphData, widgets::tui_stuff::BlockBuilder, AppConfigFields, AxisScaling, + Component, TextTable, TimeGraph, Widget, }, canvas::Painter, data_conversion::convert_network_data_points, @@ -497,15 +498,11 @@ impl Component for NetGraph { self.bounds = new_bounds; } - fn handle_key_event( - &mut self, event: crossterm::event::KeyEvent, - ) -> crate::app::event::WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { self.graph.handle_key_event(event) } - fn handle_mouse_event( - &mut self, event: crossterm::event::MouseEvent, - ) -> crate::app::event::WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { self.graph.handle_mouse_event(event) } } @@ -522,7 +519,7 @@ impl Widget for NetGraph { let block = self .block() .selected(selected) - .expanded(expanded) + .show_esc(expanded) .build(painter, area); self.set_draw_cache(); @@ -644,15 +641,11 @@ impl Component for OldNetGraph { self.bounds = new_bounds; } - fn handle_key_event( - &mut self, event: crossterm::event::KeyEvent, - ) -> crate::app::event::WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { self.net_graph.handle_key_event(event) } - fn handle_mouse_event( - &mut self, event: crossterm::event::MouseEvent, - ) -> crate::app::event::WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { self.net_graph.handle_mouse_event(event) } } diff --git a/src/app/widgets/bottom_widgets/process.rs b/src/app/widgets/bottom_widgets/process.rs index eeff0b54..ba1dcf2e 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, SelectionAction, WidgetEventResult}, + event::{ComponentEventResult, MultiKey, MultiKeyResult, ReturnSignal, SelectionAction}, query::*, text_table::DesiredColumnWidth, widgets::tui_stuff::BlockBuilder, @@ -869,27 +869,27 @@ impl ProcessManager { self } - fn open_search(&mut self) -> WidgetEventResult { + fn open_search(&mut self) -> ComponentEventResult { if let ProcessManagerSelection::Search = self.selected { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { self.show_search = true; self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Search; - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } - fn open_sort(&mut self) -> WidgetEventResult { + fn open_sort(&mut self) -> ComponentEventResult { if let ProcessManagerSelection::Sort = self.selected { - WidgetEventResult::NoRedraw + ComponentEventResult::NoRedraw } else { 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 + ComponentEventResult::Redraw } } @@ -917,7 +917,7 @@ impl ProcessManager { ) } - fn toggle_command(&mut self) -> WidgetEventResult { + fn toggle_command(&mut self) -> ComponentEventResult { if self.is_using_command() { self.process_table .set_column(ProcessSortColumn::new(ProcessSortType::Name), 1); @@ -929,7 +929,7 @@ impl ProcessManager { // Invalidate row cache. self.process_table.invalidate_cached_columns(); - WidgetEventResult::Signal(ReturnSignal::Update) + ComponentEventResult::Signal(ReturnSignal::Update) } fn is_grouped(&self) -> bool { @@ -939,7 +939,7 @@ impl ProcessManager { ) } - fn toggle_grouped(&mut self) -> WidgetEventResult { + fn toggle_grouped(&mut self) -> ComponentEventResult { if self.is_grouped() { self.process_table .set_column(ProcessSortColumn::new(ProcessSortType::Pid), 0); @@ -965,7 +965,7 @@ impl ProcessManager { // Invalidate row cache. self.process_table.invalidate_cached_columns(); - WidgetEventResult::Signal(ReturnSignal::Update) + ComponentEventResult::Signal(ReturnSignal::Update) } fn hide_sort(&mut self) { @@ -994,7 +994,7 @@ impl Component for ProcessManager { self.bounds = new_bounds; } - fn handle_key_event(&mut self, event: KeyEvent) -> WidgetEventResult { + fn handle_key_event(&mut self, event: KeyEvent) -> ComponentEventResult { // "Global" handling: if let KeyCode::Esc = event.code { @@ -1002,19 +1002,19 @@ impl Component for ProcessManager { ProcessManagerSelection::Processes => { if self.show_sort { self.hide_sort(); - return WidgetEventResult::Redraw; + return ComponentEventResult::Redraw; } else if self.show_search { self.hide_search(); - return WidgetEventResult::Redraw; + return ComponentEventResult::Redraw; } } ProcessManagerSelection::Sort if self.show_sort => { self.hide_sort(); - return WidgetEventResult::Redraw; + return ComponentEventResult::Redraw; } ProcessManagerSelection::Search if self.show_search => { self.hide_search(); - return WidgetEventResult::Redraw; + return ComponentEventResult::Redraw; } _ => {} } @@ -1039,7 +1039,7 @@ impl Component for ProcessManager { // Kill the selected process(es) } MultiKeyResult::Accepted | MultiKeyResult::Rejected => { - return WidgetEventResult::NoRedraw; + return ComponentEventResult::NoRedraw; } } } @@ -1057,7 +1057,7 @@ impl Component for ProcessManager { } KeyCode::Char('t') | KeyCode::F(5) => { self.in_tree_mode = !self.in_tree_mode; - return WidgetEventResult::Redraw; + return ComponentEventResult::Redraw; } KeyCode::Char('s') | KeyCode::F(6) => { return self.open_sort(); @@ -1086,7 +1086,7 @@ impl Component for ProcessManager { KeyCode::Enter => { self.process_table .set_sort_index(self.sort_menu.current_index()); - return WidgetEventResult::Signal(ReturnSignal::Update); + return ComponentEventResult::Signal(ReturnSignal::Update); } KeyCode::Char('/') => { return self.open_search(); @@ -1115,7 +1115,7 @@ impl Component for ProcessManager { } let handle_output = self.search_input.handle_key_event(event); - if let WidgetEventResult::Signal(ReturnSignal::Update) = handle_output { + if let ComponentEventResult::Signal(ReturnSignal::Update) = handle_output { self.process_filter = Some(parse_query( self.search_input.query(), self.is_searching_whole_word(), @@ -1129,7 +1129,7 @@ impl Component for ProcessManager { } } - fn handle_mouse_event(&mut self, event: MouseEvent) -> WidgetEventResult { + fn handle_mouse_event(&mut self, event: MouseEvent) -> ComponentEventResult { match &event.kind { MouseEventKind::Down(MouseButton::Left) => { if self.process_table.does_border_intersect_mouse(&event) { @@ -1139,11 +1139,10 @@ impl Component for ProcessManager { self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Processes; match self.process_table.handle_mouse_event(event) { - WidgetEventResult::Quit => WidgetEventResult::Quit, - WidgetEventResult::Redraw | WidgetEventResult::NoRedraw => { - WidgetEventResult::Redraw - } - WidgetEventResult::Signal(s) => WidgetEventResult::Signal(s), + ComponentEventResult::Unhandled + | ComponentEventResult::Redraw + | ComponentEventResult::NoRedraw => ComponentEventResult::Redraw, + ComponentEventResult::Signal(s) => ComponentEventResult::Signal(s), } } } else if self.sort_menu.does_border_intersect_mouse(&event) { @@ -1153,7 +1152,7 @@ impl Component for ProcessManager { self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Sort; self.sort_menu.handle_mouse_event(event); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } else if does_bound_intersect_coordinate( event.column, @@ -1166,10 +1165,10 @@ impl Component for ProcessManager { self.prev_selected = self.selected; self.selected = ProcessManagerSelection::Search; self.search_input.handle_mouse_event(event); - WidgetEventResult::Redraw + ComponentEventResult::Redraw } } else { - WidgetEventResult::NoRedraw + ComponentEventResult::Unhandled } } MouseEventKind::ScrollDown | MouseEventKind::ScrollUp => match self.selected { @@ -1177,7 +1176,7 @@ impl Component for ProcessManager { ProcessManagerSelection::Sort => self.sort_menu.handle_mouse_event(event), ProcessManagerSelection::Search => self.search_input.handle_mouse_event(event), }, - _ => WidgetEventResult::NoRedraw, + _ => ComponentEventResult::Unhandled, } } } @@ -1195,9 +1194,9 @@ impl Widget for ProcessManager { let search_constraints: [Constraint; 2] = [ Constraint::Min(0), if self.block_border.contains(Borders::TOP) { - Constraint::Length(4) + Constraint::Length(5) } else { - Constraint::Length(2) + Constraint::Length(3) }, ]; const INTERNAL_SEARCH_CONSTRAINTS: [Constraint; 2] = [Constraint::Length(1); 2]; @@ -1277,7 +1276,7 @@ impl Widget for ProcessManager { .block() .selected(process_selected) .borders(self.block_border) - .expanded(expanded && !self.show_sort && !self.show_search); + .show_esc(expanded && !self.show_sort && !self.show_search); self.process_table.draw_tui_table( painter, diff --git a/src/app/widgets/bottom_widgets/temp.rs b/src/app/widgets/bottom_widgets/temp.rs index 9d5ef4f9..be8623f6 100644 --- a/src/app/widgets/bottom_widgets/temp.rs +++ b/src/app/widgets/bottom_widgets/temp.rs @@ -6,8 +6,9 @@ use tui::{backend::Backend, layout::Rect, widgets::Borders, Frame}; use crate::{ app::{ data_farmer::DataCollection, data_harvester::temperature::TemperatureType, - event::WidgetEventResult, sort_text_table::SimpleSortableColumn, text_table::TextTableData, - AppScrollWidgetState, CanvasTableWidthState, Component, TextTable, Widget, + event::ComponentEventResult, sort_text_table::SimpleSortableColumn, + text_table::TextTableData, AppScrollWidgetState, CanvasTableWidthState, Component, + TextTable, Widget, }, canvas::Painter, data_conversion::conver