diff --git a/src/app.rs b/src/app.rs index a71c4192..19169087 100644 --- a/src/app.rs +++ b/src/app.rs @@ -58,21 +58,20 @@ pub struct AppDeleteDialogState { pub is_on_yes: bool, // Defaults to "No" } -pub enum AppHelpCategory { - General, - Process, - Search, -} - -#[derive(Default)] pub struct AppHelpDialogState { pub is_showing_help: bool, pub scroll_state: ParagraphScrollState, - pub general_index: u16, - pub cpu_index: u16, - pub process_index: u16, - pub search_index: u16, - pub battery_index: u16, + pub index_shortcuts: Vec, +} + +impl Default for AppHelpDialogState { + fn default() -> Self { + AppHelpDialogState { + is_showing_help: false, + scroll_state: ParagraphScrollState::default(), + index_shortcuts: vec![0; constants::HELP_TEXT.len()], + } + } } /// AppConfigFields is meant to cover basic fields that would normally be set @@ -583,11 +582,16 @@ impl App { pub fn on_esc(&mut self) { self.reset_multi_tap_keys(); if self.is_in_dialog() { - self.help_dialog_state.is_showing_help = false; - self.delete_dialog_state.is_showing_dd = false; - self.delete_dialog_state.is_on_yes = false; - self.to_delete_process_list = None; - self.dd_err = None; + if self.help_dialog_state.is_showing_help { + self.help_dialog_state.is_showing_help = false; + self.help_dialog_state.scroll_state.current_scroll_index = 0; + } else { + self.delete_dialog_state.is_showing_dd = false; + self.delete_dialog_state.is_on_yes = false; + self.to_delete_process_list = None; + self.dd_err = None; + } + self.is_force_redraw = true; } else if self.is_filtering_or_searching() { match self.current_widget.widget_type { @@ -1441,11 +1445,11 @@ impl App { // more obvious that we are separating dialog logic and normal logic IMO. // This is even more so as most logic already checks for dialog state. match caught_char { - '1' => self.help_scroll_to_or_max(self.help_dialog_state.general_index), - '2' => self.help_scroll_to_or_max(self.help_dialog_state.cpu_index), - '3' => self.help_scroll_to_or_max(self.help_dialog_state.process_index), - '4' => self.help_scroll_to_or_max(self.help_dialog_state.search_index), - '5' => self.help_scroll_to_or_max(self.help_dialog_state.battery_index), + '1' => self.help_scroll_to_or_max(self.help_dialog_state.index_shortcuts[1]), + '2' => self.help_scroll_to_or_max(self.help_dialog_state.index_shortcuts[2]), + '3' => self.help_scroll_to_or_max(self.help_dialog_state.index_shortcuts[3]), + '4' => self.help_scroll_to_or_max(self.help_dialog_state.index_shortcuts[4]), + '5' => self.help_scroll_to_or_max(self.help_dialog_state.index_shortcuts[5]), 'j' | 'k' | 'g' | 'G' => self.handle_char(caught_char), _ => {} } diff --git a/src/canvas.rs b/src/canvas.rs index ad332655..a603faa3 100644 --- a/src/canvas.rs +++ b/src/canvas.rs @@ -161,81 +161,34 @@ impl Painter { self.is_mac_os = cfg!(target_os = "macos"); // Init help text: - // ToC - self.styled_help_text.extend( - HELP_CONTENTS_TEXT - .iter() - .map(|&text| Text::Styled(text.into(), self.colours.text_style)) - .collect::>(), - ); - - // General - self.styled_help_text.push(Text::Raw("\n\n".into())); - self.styled_help_text.push(Text::Styled( - GENERAL_HELP_TEXT[0].into(), - self.colours.table_header_style, - )); - self.styled_help_text.extend( - GENERAL_HELP_TEXT[1..] - .iter() - .map(|&text| Text::Styled(text.into(), self.colours.text_style)) - .collect::>(), - ); - - // CPU - self.styled_help_text.push(Text::Raw("\n\n".into())); - self.styled_help_text.push(Text::Styled( - CPU_HELP_TEXT[0].into(), - self.colours.table_header_style, - )); - self.styled_help_text.extend( - CPU_HELP_TEXT[1..] - .iter() - .map(|&text| Text::Styled(text.into(), self.colours.text_style)) - .collect::>(), - ); - - // Proc - self.styled_help_text.push(Text::Raw("\n\n".into())); - self.styled_help_text.push(Text::Styled( - PROCESS_HELP_TEXT[0].into(), - self.colours.table_header_style, - )); - self.styled_help_text.extend( - PROCESS_HELP_TEXT[1..] - .iter() - .map(|&text| Text::Styled(text.into(), self.colours.text_style)) - .collect::>(), - ); - - // Proc Search - self.styled_help_text.push(Text::Raw("\n\n".into())); - self.styled_help_text.push(Text::Styled( - SEARCH_HELP_TEXT[0].into(), - self.colours.table_header_style, - )); - self.styled_help_text.extend( - SEARCH_HELP_TEXT[1..] - .iter() - .map(|&text| Text::Styled(text.into(), self.colours.text_style)) - .collect::>(), - ); - - // Battery - self.styled_help_text.push(Text::Raw("\n\n".into())); - self.styled_help_text.push(Text::Styled( - BATTERY_HELP_TEXT[0].into(), - self.colours.table_header_style, - )); - self.styled_help_text.extend( - BATTERY_HELP_TEXT[1..] - .iter() - .map(|&text| Text::Styled(text.into(), self.colours.text_style)) - .collect::>(), - ); + (*HELP_TEXT).iter().enumerate().for_each(|(itx, section)| { + if itx == 0 { + self.styled_help_text.extend( + section + .iter() + .map(|&text| Text::Styled(text.into(), self.colours.text_style)) + .collect::>(), + ); + } else { + // Not required check but it runs only a few times... so whatever ig, prevents me from + // being dumb and leaving a help text section only one line long. + if section.len() > 1 { + self.styled_help_text.push(Text::Raw("\n\n".into())); + self.styled_help_text.push(Text::Styled( + section[0].into(), + self.colours.table_header_style, + )); + self.styled_help_text.extend( + section[1..] + .iter() + .map(|&text| Text::Styled(text.into(), self.colours.text_style)) + .collect::>(), + ); + } + } + }); } - // TODO: [FEATURE] Auto-resizing dialog sizes. pub fn draw_data( &mut self, terminal: &mut Terminal, app_state: &mut app::App, ) -> error::Result<()> { @@ -256,8 +209,6 @@ impl Painter { terminal.autoresize()?; terminal.draw(|mut f| { if app_state.help_dialog_state.is_showing_help { - // TODO: [RESIZE] Scrolling dialog boxes is ideal. This is currently VERY temporary! - // The width is currently not good and can wrap... causing this to not go so well! let gen_help_len = GENERAL_HELP_TEXT.len() as u16 + 3; let border_len = (max(0, f.size().height as i64 - gen_help_len as i64)) as u16 / 2; let vertical_dialog_chunk = Layout::default() diff --git a/src/canvas/dialogs/help_dialog.rs b/src/canvas/dialogs/help_dialog.rs index 70492ae9..c75aef10 100644 --- a/src/canvas/dialogs/help_dialog.rs +++ b/src/canvas/dialogs/help_dialog.rs @@ -32,75 +32,43 @@ impl HelpDialog for Painter { // 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; - }); + let mut prev_section_len = 0; - // 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; - }); + constants::HELP_TEXT + .iter() + .enumerate() + .for_each(|(itx, section)| { + let mut buffer = 0; - // 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; - }); + if itx == 0 { + section.iter().for_each(|text_line| { + 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; - }); + app_state.help_dialog_state.index_shortcuts[itx] = 0; + prev_section_len = section.len() as u16 + buffer; + overflow_buffer += buffer; + } else { + section.iter().for_each(|text_line| { + 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.index_shortcuts[itx] = + app_state.help_dialog_state.index_shortcuts[itx - 1] + + 1 + + prev_section_len; + prev_section_len = section.len() as u16 + buffer; + overflow_buffer += buffer; + } + }); app_state.help_dialog_state.scroll_state.max_scroll_index = (self.styled_help_text.len() as u16 - + (constants::NUM_CATEGORIES - 3) + + (constants::HELP_TEXT.len() as u16 - 3) + overflow_buffer) .saturating_sub(draw_loc.height); diff --git a/src/constants.rs b/src/constants.rs index dca06781..7db7f535 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -36,8 +36,6 @@ lazy_static! { } // Help text -pub const NUM_CATEGORIES: u16 = 6; - pub const HELP_CONTENTS_TEXT: [&str; 6] = [ "Press the corresponding numbers to jump to the section, or scroll:\n", "1 - General bindings\n", @@ -108,6 +106,17 @@ pub const BATTERY_HELP_TEXT: [&str; 3] = [ "Right Go to next battery", ]; +lazy_static! { + pub static ref HELP_TEXT: Vec> = vec![ + HELP_CONTENTS_TEXT.to_vec(), + GENERAL_HELP_TEXT.to_vec(), + CPU_HELP_TEXT.to_vec(), + PROCESS_HELP_TEXT.to_vec(), + SEARCH_HELP_TEXT.to_vec(), + BATTERY_HELP_TEXT.to_vec(), + ]; +} + // Config and flags pub const DEFAULT_UNIX_CONFIG_FILE_PATH: &str = ".config/bottom/bottom.toml"; pub const DEFAULT_WINDOWS_CONFIG_FILE_PATH: &str = "bottom/bottom.toml"; diff --git a/src/main.rs b/src/main.rs index 1940a544..65af8f79 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,7 +91,6 @@ fn get_matches() -> clap::ArgMatches<'static> { (@arg DEFAULT_WIDGET_COUNT: --default_widget_count +takes_value "Which number of the selected widget type to select, from left to right, top to bottom. Defaults to 1.") (@arg USE_OLD_NETWORK_LEGEND: --use_old_network_legend "Use the older (pre-0.4) network widget legend.") (@arg HIDE_TABLE_GAP: --hide_table_gap "Hides the spacing between the table headers and entries.") - //(@arg TURNED_OFF_CPUS: -t ... +takes_value "Hides CPU data points by default") // TODO: [FEATURE] Enable disabling cores in config/flags ) .get_matches() } diff --git a/src/options.rs b/src/options.rs index 5b52d17a..b879d9ca 100644 --- a/src/options.rs +++ b/src/options.rs @@ -42,7 +42,6 @@ pub struct ConfigFlags { pub default_widget_count: Option, pub use_old_network_legend: Option, pub hide_table_gap: Option, - //disabled_cpu_cores: Option>, // TODO: [FEATURE] Enable disabling cores in config/flags } #[derive(Default, Deserialize)]