diff options
Diffstat (limited to 'src/canvas/dialogs')
-rw-r--r-- | src/canvas/dialogs/filter_dialog.rs | 0 | ||||
-rw-r--r-- | src/canvas/dialogs/help_dialog.rs | 144 |
2 files changed, 116 insertions, 28 deletions
diff --git a/src/canvas/dialogs/filter_dialog.rs b/src/canvas/dialogs/filter_dialog.rs new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/canvas/dialogs/filter_dialog.rs diff --git a/src/canvas/dialogs/help_dialog.rs b/src/canvas/dialogs/help_dialog.rs index 8dbca876..70492ae9 100644 --- a/src/canvas/dialogs/help_dialog.rs +++ b/src/canvas/dialogs/help_dialog.rs @@ -1,4 +1,5 @@ use std::cmp::max; +use unicode_width::UnicodeWidthStr; use tui::{ backend::Backend, @@ -7,12 +8,9 @@ use tui::{ widgets::{Block, Borders, Paragraph}, }; -use crate::{ - app::{App, AppHelpCategory}, - canvas::Painter, -}; +use crate::{app::App, canvas::Painter, constants}; -const HELP_BASE: &str = " Help ── 1: General ─── 2: Processes ─── 3: Search ─── Esc to close "; +const HELP_BASE: &str = " Help ── Esc to close "; pub trait HelpDialog { fn draw_help_dialog<B: Backend>( @@ -28,31 +26,121 @@ impl HelpDialog for Painter { 0, draw_loc.width as i32 - HELP_BASE.chars().count() as i32 - 2, ); - let help_title = format!( - " Help ─{}─ 1: General ─── 2: Processes ─── 3: Search ─── Esc to close ", - "─".repeat(repeat_num as usize) - ); + let help_title = format!(" Help ─{}─ Esc to close ", "─".repeat(repeat_num as usize)); + + if app_state.is_force_redraw { + // We must also recalculate how many lines are wrapping to properly get scrolling to work on + // small terminal sizes... oh joy. + + // TODO: Make this more automated and easier to add. + + let mut overflow_buffer = 0; + let paragraph_width = draw_loc.width - 2; + constants::HELP_CONTENTS_TEXT.iter().for_each(|text_line| { + overflow_buffer += + UnicodeWidthStr::width(*text_line).saturating_sub(1) as u16 / paragraph_width; + }); + + // General + app_state.help_dialog_state.general_index = + constants::HELP_CONTENTS_TEXT.len() as u16 + 1 + overflow_buffer; + constants::GENERAL_HELP_TEXT.iter().for_each(|text_line| { + overflow_buffer += + UnicodeWidthStr::width(*text_line).saturating_sub(1) as u16 / paragraph_width; + }); + + // CPU + app_state.help_dialog_state.cpu_index = + (constants::HELP_CONTENTS_TEXT.len() + constants::GENERAL_HELP_TEXT.len()) as u16 + + 2 + + overflow_buffer; + constants::CPU_HELP_TEXT.iter().for_each(|text_line| { + overflow_buffer += + UnicodeWidthStr::width(*text_line).saturating_sub(1) as u16 / paragraph_width; + }); + + // Processes + app_state.help_dialog_state.process_index = (constants::HELP_CONTENTS_TEXT.len() + + constants::GENERAL_HELP_TEXT.len() + + constants::CPU_HELP_TEXT.len()) + as u16 + + 3 + + overflow_buffer; + constants::PROCESS_HELP_TEXT.iter().for_each(|text_line| { + overflow_buffer += + UnicodeWidthStr::width(*text_line).saturating_sub(1) as u16 / paragraph_width; + }); + + // Search + app_state.help_dialog_state.search_index = (constants::HELP_CONTENTS_TEXT.len() + + constants::GENERAL_HELP_TEXT.len() + + constants::CPU_HELP_TEXT.len() + + constants::PROCESS_HELP_TEXT.len()) + as u16 + + 4 + + overflow_buffer; + constants::SEARCH_HELP_TEXT.iter().for_each(|text_line| { + overflow_buffer += + UnicodeWidthStr::width(*text_line).saturating_sub(1) as u16 / paragraph_width; + }); + + // Battery + app_state.help_dialog_state.battery_index = (constants::HELP_CONTENTS_TEXT.len() + + constants::GENERAL_HELP_TEXT.len() + + constants::CPU_HELP_TEXT.len() + + constants::PROCESS_HELP_TEXT.len() + + constants::SEARCH_HELP_TEXT.len()) + as u16 + + 5 + + overflow_buffer; + constants::BATTERY_HELP_TEXT.iter().for_each(|text_line| { + overflow_buffer += + UnicodeWidthStr::width(*text_line).saturating_sub(1) as u16 / paragraph_width; + }); + + app_state.help_dialog_state.scroll_state.max_scroll_index = + (self.styled_help_text.len() as u16 + + (constants::NUM_CATEGORIES - 3) + + overflow_buffer) + .saturating_sub(draw_loc.height); + + // Fix if over-scrolled + if app_state + .help_dialog_state + .scroll_state + .current_scroll_index + >= app_state.help_dialog_state.scroll_state.max_scroll_index + { + app_state + .help_dialog_state + .scroll_state + .current_scroll_index = app_state + .help_dialog_state + .scroll_state + .max_scroll_index + .saturating_sub(1); + } + } f.render_widget( - Paragraph::new( - match app_state.help_dialog_state.current_category { - AppHelpCategory::General => &self.styled_general_help_text, - AppHelpCategory::Process => &self.styled_process_help_text, - AppHelpCategory::Search => &self.styled_search_help_text, - } - .iter(), - ) - .block( - Block::default() - .title(&help_title) - .title_style(self.colours.border_style) - .style(self.colours.border_style) - .borders(Borders::ALL) - .border_style(self.colours.border_style), - ) - .style(self.colours.text_style) - .alignment(Alignment::Left) - .wrap(true), + Paragraph::new(self.styled_help_text.iter()) + .block( + Block::default() + .title(&help_title) + .title_style(self.colours.border_style) + .style(self.colours.border_style) + .borders(Borders::ALL) + .border_style(self.colours.border_style), + ) + .style(self.colours.text_style) + .alignment(Alignment::Left) + .wrap(true) + .scroll( + app_state + .help_dialog_state + .scroll_state + .current_scroll_index, + ), draw_loc, ); } |