diff options
Diffstat (limited to 'vendor/dialoguer/src/theme.rs')
-rw-r--r-- | vendor/dialoguer/src/theme.rs | 976 |
1 files changed, 0 insertions, 976 deletions
diff --git a/vendor/dialoguer/src/theme.rs b/vendor/dialoguer/src/theme.rs deleted file mode 100644 index 1fbde92..0000000 --- a/vendor/dialoguer/src/theme.rs +++ /dev/null @@ -1,976 +0,0 @@ -//! Customizes the rendering of the elements. -use std::{fmt, io}; - -use console::{measure_text_width, style, Style, StyledObject, Term}; -#[cfg(feature = "fuzzy-select")] -use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher}; - -/// Implements a theme for dialoguer. -pub trait Theme { - /// Formats a prompt. - #[inline] - fn format_prompt(&self, f: &mut dyn fmt::Write, prompt: &str) -> fmt::Result { - write!(f, "{}:", prompt) - } - - /// Formats out an error. - #[inline] - fn format_error(&self, f: &mut dyn fmt::Write, err: &str) -> fmt::Result { - write!(f, "error: {}", err) - } - - /// Formats a confirm prompt. - fn format_confirm_prompt( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - default: Option<bool>, - ) -> fmt::Result { - if !prompt.is_empty() { - write!(f, "{} ", &prompt)?; - } - match default { - None => write!(f, "[y/n] ")?, - Some(true) => write!(f, "[Y/n] ")?, - Some(false) => write!(f, "[y/N] ")?, - } - Ok(()) - } - - /// Formats a confirm prompt after selection. - fn format_confirm_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - selection: Option<bool>, - ) -> fmt::Result { - let selection = selection.map(|b| if b { "yes" } else { "no" }); - - match selection { - Some(selection) if prompt.is_empty() => { - write!(f, "{}", selection) - } - Some(selection) => { - write!(f, "{} {}", &prompt, selection) - } - None if prompt.is_empty() => Ok(()), - None => { - write!(f, "{}", &prompt) - } - } - } - - /// Formats an input prompt. - fn format_input_prompt( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - default: Option<&str>, - ) -> fmt::Result { - match default { - Some(default) if prompt.is_empty() => write!(f, "[{}]: ", default), - Some(default) => write!(f, "{} [{}]: ", prompt, default), - None => write!(f, "{}: ", prompt), - } - } - - /// Formats an input prompt after selection. - #[inline] - fn format_input_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - sel: &str, - ) -> fmt::Result { - write!(f, "{}: {}", prompt, sel) - } - - /// Formats a password prompt. - #[inline] - #[cfg(feature = "password")] - fn format_password_prompt(&self, f: &mut dyn fmt::Write, prompt: &str) -> fmt::Result { - self.format_input_prompt(f, prompt, None) - } - - /// Formats a password prompt after selection. - #[inline] - #[cfg(feature = "password")] - fn format_password_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - ) -> fmt::Result { - self.format_input_prompt_selection(f, prompt, "[hidden]") - } - - /// Formats a select prompt. - #[inline] - fn format_select_prompt(&self, f: &mut dyn fmt::Write, prompt: &str) -> fmt::Result { - self.format_prompt(f, prompt) - } - - /// Formats a select prompt after selection. - #[inline] - fn format_select_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - sel: &str, - ) -> fmt::Result { - self.format_input_prompt_selection(f, prompt, sel) - } - - /// Formats a multi select prompt. - #[inline] - fn format_multi_select_prompt(&self, f: &mut dyn fmt::Write, prompt: &str) -> fmt::Result { - self.format_prompt(f, prompt) - } - - /// Formats a sort prompt. - #[inline] - fn format_sort_prompt(&self, f: &mut dyn fmt::Write, prompt: &str) -> fmt::Result { - self.format_prompt(f, prompt) - } - - /// Formats a multi_select prompt after selection. - fn format_multi_select_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - selections: &[&str], - ) -> fmt::Result { - write!(f, "{}: ", prompt)?; - for (idx, sel) in selections.iter().enumerate() { - write!(f, "{}{}", if idx == 0 { "" } else { ", " }, sel)?; - } - Ok(()) - } - - /// Formats a sort prompt after selection. - #[inline] - fn format_sort_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - selections: &[&str], - ) -> fmt::Result { - self.format_multi_select_prompt_selection(f, prompt, selections) - } - - /// Formats a select prompt item. - fn format_select_prompt_item( - &self, - f: &mut dyn fmt::Write, - text: &str, - active: bool, - ) -> fmt::Result { - write!(f, "{} {}", if active { ">" } else { " " }, text) - } - - /// Formats a multi select prompt item. - fn format_multi_select_prompt_item( - &self, - f: &mut dyn fmt::Write, - text: &str, - checked: bool, - active: bool, - ) -> fmt::Result { - write!( - f, - "{} {}", - match (checked, active) { - (true, true) => "> [x]", - (true, false) => " [x]", - (false, true) => "> [ ]", - (false, false) => " [ ]", - }, - text - ) - } - - /// Formats a sort prompt item. - fn format_sort_prompt_item( - &self, - f: &mut dyn fmt::Write, - text: &str, - picked: bool, - active: bool, - ) -> fmt::Result { - write!( - f, - "{} {}", - match (picked, active) { - (true, true) => "> [x]", - (false, true) => "> [ ]", - (_, false) => " [ ]", - }, - text - ) - } - - /// Formats a fuzzy select prompt item. - #[cfg(feature = "fuzzy-select")] - fn format_fuzzy_select_prompt_item( - &self, - f: &mut dyn fmt::Write, - text: &str, - active: bool, - highlight_matches: bool, - matcher: &SkimMatcherV2, - search_term: &str, - ) -> fmt::Result { - write!(f, "{} ", if active { ">" } else { " " })?; - - if highlight_matches { - if let Some((_score, indices)) = matcher.fuzzy_indices(text, &search_term) { - for (idx, c) in text.chars().into_iter().enumerate() { - if indices.contains(&idx) { - write!(f, "{}", style(c).for_stderr().bold())?; - } else { - write!(f, "{}", c)?; - } - } - - return Ok(()); - } - } - - write!(f, "{}", text) - } - - /// Formats a fuzzy select prompt. - #[cfg(feature = "fuzzy-select")] - fn format_fuzzy_select_prompt( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - search_term: &str, - cursor_pos: usize, - ) -> fmt::Result { - if !prompt.is_empty() { - write!(f, "{} ", prompt,)?; - } - - if cursor_pos < search_term.len() { - let st_head = search_term[0..cursor_pos].to_string(); - let st_tail = search_term[cursor_pos..search_term.len()].to_string(); - let st_cursor = "|".to_string(); - write!(f, "{}{}{}", st_head, st_cursor, st_tail) - } else { - let cursor = "|".to_string(); - write!(f, "{}{}", search_term.to_string(), cursor) - } - } -} - -/// The default theme. -pub struct SimpleTheme; - -impl Theme for SimpleTheme {} - -/// A colorful theme -pub struct ColorfulTheme { - /// The style for default values - pub defaults_style: Style, - /// The style for prompt - pub prompt_style: Style, - /// Prompt prefix value and style - pub prompt_prefix: StyledObject<String>, - /// Prompt suffix value and style - pub prompt_suffix: StyledObject<String>, - /// Prompt on success prefix value and style - pub success_prefix: StyledObject<String>, - /// Prompt on success suffix value and style - pub success_suffix: StyledObject<String>, - /// Error prefix value and style - pub error_prefix: StyledObject<String>, - /// The style for error message - pub error_style: Style, - /// The style for hints - pub hint_style: Style, - /// The style for values on prompt success - pub values_style: Style, - /// The style for active items - pub active_item_style: Style, - /// The style for inactive items - pub inactive_item_style: Style, - /// Active item in select prefix value and style - pub active_item_prefix: StyledObject<String>, - /// Inctive item in select prefix value and style - pub inactive_item_prefix: StyledObject<String>, - /// Checked item in multi select prefix value and style - pub checked_item_prefix: StyledObject<String>, - /// Unchecked item in multi select prefix value and style - pub unchecked_item_prefix: StyledObject<String>, - /// Picked item in sort prefix value and style - pub picked_item_prefix: StyledObject<String>, - /// Unpicked item in sort prefix value and style - pub unpicked_item_prefix: StyledObject<String>, - /// Formats the cursor for a fuzzy select prompt - #[cfg(feature = "fuzzy-select")] - pub fuzzy_cursor_style: Style, - // Formats the highlighting if matched characters - #[cfg(feature = "fuzzy-select")] - pub fuzzy_match_highlight_style: Style, - /// Show the selections from certain prompts inline - pub inline_selections: bool, -} - -impl Default for ColorfulTheme { - fn default() -> ColorfulTheme { - ColorfulTheme { - defaults_style: Style::new().for_stderr().cyan(), - prompt_style: Style::new().for_stderr().bold(), - prompt_prefix: style("?".to_string()).for_stderr().yellow(), - prompt_suffix: style("›".to_string()).for_stderr().black().bright(), - success_prefix: style("✔".to_string()).for_stderr().green(), - success_suffix: style("·".to_string()).for_stderr().black().bright(), - error_prefix: style("✘".to_string()).for_stderr().red(), - error_style: Style::new().for_stderr().red(), - hint_style: Style::new().for_stderr().black().bright(), - values_style: Style::new().for_stderr().green(), - active_item_style: Style::new().for_stderr().cyan(), - inactive_item_style: Style::new().for_stderr(), - active_item_prefix: style("❯".to_string()).for_stderr().green(), - inactive_item_prefix: style(" ".to_string()).for_stderr(), - checked_item_prefix: style("✔".to_string()).for_stderr().green(), - unchecked_item_prefix: style("✔".to_string()).for_stderr().black(), - picked_item_prefix: style("❯".to_string()).for_stderr().green(), - unpicked_item_prefix: style(" ".to_string()).for_stderr(), - #[cfg(feature = "fuzzy-select")] - fuzzy_cursor_style: Style::new().for_stderr().black().on_white(), - #[cfg(feature = "fuzzy-select")] - fuzzy_match_highlight_style: Style::new().for_stderr().bold(), - inline_selections: true, - } - } -} - -impl Theme for ColorfulTheme { - /// Formats a prompt. - fn format_prompt(&self, f: &mut dyn fmt::Write, prompt: &str) -> fmt::Result { - if !prompt.is_empty() { - write!( - f, - "{} {} ", - &self.prompt_prefix, - self.prompt_style.apply_to(prompt) - )?; - } - - write!(f, "{}", &self.prompt_suffix) - } - - /// Formats an error - fn format_error(&self, f: &mut dyn fmt::Write, err: &str) -> fmt::Result { - write!( - f, - "{} {}", - &self.error_prefix, - self.error_style.apply_to(err) - ) - } - - /// Formats an input prompt. - fn format_input_prompt( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - default: Option<&str>, - ) -> fmt::Result { - if !prompt.is_empty() { - write!( - f, - "{} {} ", - &self.prompt_prefix, - self.prompt_style.apply_to(prompt) - )?; - } - - match default { - Some(default) => write!( - f, - "{} {} ", - self.hint_style.apply_to(&format!("({})", default)), - &self.prompt_suffix - ), - None => write!(f, "{} ", &self.prompt_suffix), - } - } - - /// Formats a confirm prompt. - fn format_confirm_prompt( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - default: Option<bool>, - ) -> fmt::Result { - if !prompt.is_empty() { - write!( - f, - "{} {} ", - &self.prompt_prefix, - self.prompt_style.apply_to(prompt) - )?; - } - - match default { - None => write!( - f, - "{} {}", - self.hint_style.apply_to("(y/n)"), - &self.prompt_suffix - ), - Some(true) => write!( - f, - "{} {} {}", - self.hint_style.apply_to("(y/n)"), - &self.prompt_suffix, - self.defaults_style.apply_to("yes") - ), - Some(false) => write!( - f, - "{} {} {}", - self.hint_style.apply_to("(y/n)"), - &self.prompt_suffix, - self.defaults_style.apply_to("no") - ), - } - } - - /// Formats a confirm prompt after selection. - fn format_confirm_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - selection: Option<bool>, - ) -> fmt::Result { - if !prompt.is_empty() { - write!( - f, - "{} {} ", - &self.success_prefix, - self.prompt_style.apply_to(prompt) - )?; - } - let selection = selection.map(|b| if b { "yes" } else { "no" }); - - match selection { - Some(selection) => { - write!( - f, - "{} {}", - &self.success_suffix, - self.values_style.apply_to(selection) - ) - } - None => { - write!(f, "{}", &self.success_suffix) - } - } - } - - /// Formats an input prompt after selection. - fn format_input_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - sel: &str, - ) -> fmt::Result { - if !prompt.is_empty() { - write!( - f, - "{} {} ", - &self.success_prefix, - self.prompt_style.apply_to(prompt) - )?; - } - - write!( - f, - "{} {}", - &self.success_suffix, - self.values_style.apply_to(sel) - ) - } - - /// Formats a password prompt after selection. - #[cfg(feature = "password")] - fn format_password_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - ) -> fmt::Result { - self.format_input_prompt_selection(f, prompt, "********") - } - - /// Formats a multi select prompt after selection. - fn format_multi_select_prompt_selection( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - selections: &[&str], - ) -> fmt::Result { - if !prompt.is_empty() { - write!( - f, - "{} {} ", - &self.success_prefix, - self.prompt_style.apply_to(prompt) - )?; - } - - write!(f, "{} ", &self.success_suffix)?; - - if self.inline_selections { - for (idx, sel) in selections.iter().enumerate() { - write!( - f, - "{}{}", - if idx == 0 { "" } else { ", " }, - self.values_style.apply_to(sel) - )?; - } - } - - Ok(()) - } - - /// Formats a select prompt item. - fn format_select_prompt_item( - &self, - f: &mut dyn fmt::Write, - text: &str, - active: bool, - ) -> fmt::Result { - let details = if active { - ( - &self.active_item_prefix, - self.active_item_style.apply_to(text), - ) - } else { - ( - &self.inactive_item_prefix, - self.inactive_item_style.apply_to(text), - ) - }; - - write!(f, "{} {}", details.0, details.1) - } - - /// Formats a multi select prompt item. - fn format_multi_select_prompt_item( - &self, - f: &mut dyn fmt::Write, - text: &str, - checked: bool, - active: bool, - ) -> fmt::Result { - let details = match (checked, active) { - (true, true) => ( - &self.checked_item_prefix, - self.active_item_style.apply_to(text), - ), - (true, false) => ( - &self.checked_item_prefix, - self.inactive_item_style.apply_to(text), - ), - (false, true) => ( - &self.unchecked_item_prefix, - self.active_item_style.apply_to(text), - ), - (false, false) => ( - &self.unchecked_item_prefix, - self.inactive_item_style.apply_to(text), - ), - }; - - write!(f, "{} {}", details.0, details.1) - } - - /// Formats a sort prompt item. - fn format_sort_prompt_item( - &self, - f: &mut dyn fmt::Write, - text: &str, - picked: bool, - active: bool, - ) -> fmt::Result { - let details = match (picked, active) { - (true, true) => ( - &self.picked_item_prefix, - self.active_item_style.apply_to(text), - ), - (false, true) => ( - &self.unpicked_item_prefix, - self.active_item_style.apply_to(text), - ), - (_, false) => ( - &self.unpicked_item_prefix, - self.inactive_item_style.apply_to(text), - ), - }; - - write!(f, "{} {}", details.0, details.1) - } - - /// Formats a fuzzy select prompt item. - #[cfg(feature = "fuzzy-select")] - fn format_fuzzy_select_prompt_item( - &self, - f: &mut dyn fmt::Write, - text: &str, - active: bool, - highlight_matches: bool, - matcher: &SkimMatcherV2, - search_term: &str, - ) -> fmt::Result { - write!( - f, - "{} ", - if active { - &self.active_item_prefix - } else { - &self.inactive_item_prefix - } - )?; - - if highlight_matches { - if let Some((_score, indices)) = matcher.fuzzy_indices(text, &search_term) { - for (idx, c) in text.chars().into_iter().enumerate() { - if indices.contains(&idx) { - if active { - write!( - f, - "{}", - self.active_item_style - .apply_to(self.fuzzy_match_highlight_style.apply_to(c)) - )?; - } else { - write!(f, "{}", self.fuzzy_match_highlight_style.apply_to(c))?; - } - } else { - if active { - write!(f, "{}", self.active_item_style.apply_to(c))?; - } else { - write!(f, "{}", c)?; - } - } - } - - return Ok(()); - } - } - - write!(f, "{}", text) - } - - /// Formats a fuzzy-selectprompt after selection. - #[cfg(feature = "fuzzy-select")] - fn format_fuzzy_select_prompt( - &self, - f: &mut dyn fmt::Write, - prompt: &str, - search_term: &str, - cursor_pos: usize, - ) -> fmt::Result { - if !prompt.is_empty() { - write!( - f, - "{} {} ", - &self.prompt_prefix, - self.prompt_style.apply_to(prompt) - )?; - } - - if cursor_pos < search_term.len() { - let st_head = search_term[0..cursor_pos].to_string(); - let st_tail = search_term[cursor_pos + 1..search_term.len()].to_string(); - let st_cursor = self - .fuzzy_cursor_style - .apply_to(search_term.to_string().chars().nth(cursor_pos).unwrap()); - write!( - f, - "{} {}{}{}", - &self.prompt_suffix, st_head, st_cursor, st_tail - ) - } else { - let cursor = self.fuzzy_cursor_style.apply_to(" "); - write!( - f, - "{} {}{}", - &self.prompt_suffix, - search_term.to_string(), - cursor - ) - } - } -} - -/// Helper struct to conveniently render a theme of a term. -pub(crate) struct TermThemeRenderer<'a> { - term: &'a Term, - theme: &'a dyn Theme, - height: usize, - prompt_height: usize, - prompts_reset_height: bool, -} - -impl<'a> TermThemeRenderer<'a> { - pub fn new(term: &'a Term, theme: &'a dyn Theme) -> TermThemeRenderer<'a> { - TermThemeRenderer { - term, - theme, - height: 0, - prompt_height: 0, - prompts_reset_height: true, - } - } - - #[cfg(feature = "password")] - pub fn set_prompts_reset_height(&mut self, val: bool) { - self.prompts_reset_height = val; - } - - #[cfg(feature = "password")] - pub fn term(&self) -> &Term { - self.term - } - - pub fn add_line(&mut self) { - self.height += 1; - } - - fn write_formatted_str< - F: FnOnce(&mut TermThemeRenderer, &mut dyn fmt::Write) -> fmt::Result, - >( - &mut self, - f: F, - ) -> io::Result<usize> { - let mut buf = String::new(); - f(self, &mut buf).map_err(|err| io::Error::new(io::ErrorKind::Other, err))?; - self.height += buf.chars().filter(|&x| x == '\n').count(); - self.term.write_str(&buf)?; - Ok(measure_text_width(&buf)) - } - - fn write_formatted_line< - F: FnOnce(&mut TermThemeRenderer, &mut dyn fmt::Write) -> fmt::Result, - >( - &mut self, - f: F, - ) -> io::Result<()> { - let mut buf = String::new(); - f(self, &mut buf).map_err(|err| io::Error::new(io::ErrorKind::Other, err))?; - self.height += buf.chars().filter(|&x| x == '\n').count() + 1; - self.term.write_line(&buf) - } - - fn write_formatted_prompt< - F: FnOnce(&mut TermThemeRenderer, &mut dyn fmt::Write) -> fmt::Result, - >( - &mut self, - f: F, - ) -> io::Result<()> { - self.write_formatted_line(f)?; - if self.prompts_reset_height { - self.prompt_height = self.height; - self.height = 0; - } - Ok(()) - } - - fn write_paging_info(buf: &mut dyn fmt::Write, paging_info: (usize, usize)) -> fmt::Result { - write!(buf, " [Page {}/{}] ", paging_info.0, paging_info.1) - } - - pub fn error(&mut self, err: &str) -> io::Result<()> { - self.write_formatted_line(|this, buf| this.theme.format_error(buf, err)) - } - - pub fn confirm_prompt(&mut self, prompt: &str, default: Option<bool>) -> io::Result<usize> { - self.write_formatted_str(|this, buf| this.theme.format_confirm_prompt(buf, prompt, default)) - } - - pub fn confirm_prompt_selection(&mut self, prompt: &str, sel: Option<bool>) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme.format_confirm_prompt_selection(buf, prompt, sel) - }) - } - - #[cfg(feature = "fuzzy-select")] - pub fn fuzzy_select_prompt( - &mut self, - prompt: &str, - search_term: &str, - cursor_pos: usize, - ) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme - .format_fuzzy_select_prompt(buf, prompt, search_term, cursor_pos) - }) - } - - pub fn input_prompt(&mut self, prompt: &str, default: Option<&str>) -> io::Result<usize> { - self.write_formatted_str(|this, buf| this.theme.format_input_prompt(buf, prompt, default)) - } - - pub fn input_prompt_selection(&mut self, prompt: &str, sel: &str) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme.format_input_prompt_selection(buf, prompt, sel) - }) - } - - #[cfg(feature = "password")] - pub fn password_prompt(&mut self, prompt: &str) -> io::Result<usize> { - self.write_formatted_str(|this, buf| { - write!(buf, "\r")?; - this.theme.format_password_prompt(buf, prompt) - }) - } - - #[cfg(feature = "password")] - pub fn password_prompt_selection(&mut self, prompt: &str) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme.format_password_prompt_selection(buf, prompt) - }) - } - - pub fn select_prompt( - &mut self, - prompt: &str, - paging_info: Option<(usize, usize)>, - ) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme.format_select_prompt(buf, prompt)?; - - if let Some(paging_info) = paging_info { - TermThemeRenderer::write_paging_info(buf, paging_info)?; - } - - Ok(()) - }) - } - - pub fn select_prompt_selection(&mut self, prompt: &str, sel: &str) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme.format_select_prompt_selection(buf, prompt, sel) - }) - } - - pub fn select_prompt_item(&mut self, text: &str, active: bool) -> io::Result<()> { - self.write_formatted_line(|this, buf| { - this.theme.format_select_prompt_item(buf, text, active) - }) - } - - #[cfg(feature = "fuzzy-select")] - pub fn fuzzy_select_prompt_item( - &mut self, - text: &str, - active: bool, - highlight: bool, - matcher: &SkimMatcherV2, - search_term: &str, - ) -> io::Result<()> { - self.write_formatted_line(|this, buf| { - this.theme.format_fuzzy_select_prompt_item( - buf, - text, - active, - highlight, - matcher, - search_term, - ) - }) - } - - pub fn multi_select_prompt( - &mut self, - prompt: &str, - paging_info: Option<(usize, usize)>, - ) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme.format_multi_select_prompt(buf, prompt)?; - - if let Some(paging_info) = paging_info { - TermThemeRenderer::write_paging_info(buf, paging_info)?; - } - - Ok(()) - }) - } - - pub fn multi_select_prompt_selection(&mut self, prompt: &str, sel: &[&str]) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme - .format_multi_select_prompt_selection(buf, prompt, sel) - }) - } - - pub fn multi_select_prompt_item( - &mut self, - text: &str, - checked: bool, - active: bool, - ) -> io::Result<()> { - self.write_formatted_line(|this, buf| { - this.theme - .format_multi_select_prompt_item(buf, text, checked, active) - }) - } - - pub fn sort_prompt( - &mut self, - prompt: &str, - paging_info: Option<(usize, usize)>, - ) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme.format_sort_prompt(buf, prompt)?; - - if let Some(paging_info) = paging_info { - TermThemeRenderer::write_paging_info(buf, paging_info)?; - } - - Ok(()) - }) - } - - pub fn sort_prompt_selection(&mut self, prompt: &str, sel: &[&str]) -> io::Result<()> { - self.write_formatted_prompt(|this, buf| { - this.theme.format_sort_prompt_selection(buf, prompt, sel) - }) - } - - pub fn sort_prompt_item(&mut self, text: &str, picked: bool, active: bool) -> io::Result<()> { - self.write_formatted_line(|this, buf| { - this.theme - .format_sort_prompt_item(buf, text, picked, active) - }) - } - - pub fn clear(&mut self) -> io::Result<()> { - self.term - .clear_last_lines(self.height + self.prompt_height)?; - self.height = 0; - self.prompt_height = 0; - Ok(()) - } - - pub fn clear_preserve_prompt(&mut self, size_vec: &[usize]) -> io::Result<()> { - let mut new_height = self.height; - let prefix_width = 2; - //Check each item size, increment on finding an overflow - for size in size_vec { - if *size > self.term.size().1 as usize { - new_height += (((*size as f64 + prefix_width as f64) / self.term.size().1 as f64) - .ceil()) as usize - - 1; - } - } - - self.term.clear_last_lines(new_height)?; - self.height = 0; - Ok(()) - } -} |