From f2447364b923eaab55f6de4f73c1f79511c6b5eb Mon Sep 17 00:00:00 2001 From: maxomatic458 <104733404+maxomatic458@users.noreply.github.com> Date: Sat, 3 Feb 2024 00:59:12 +0100 Subject: [PATCH] fix description line not truncating in columnar menu (#739) * add builder functions * fix description wrap * fmt * fix --- src/menu/columnar_menu.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/menu/columnar_menu.rs b/src/menu/columnar_menu.rs index dea2ab2..6eac27a 100644 --- a/src/menu/columnar_menu.rs +++ b/src/menu/columnar_menu.rs @@ -6,6 +6,7 @@ use crate::{ Completer, Suggestion, }; use nu_ansi_term::ansi::RESET; +use unicode_width::UnicodeWidthStr; /// Default values used as reference for the menu. These values are set during /// the initial declaration of the menu and are always kept as reference for the @@ -308,12 +309,16 @@ impl ColumnarMenu { .unwrap_or(self.settings.color.text_style) .prefix(); + let left_text_size = self.longest_suggestion + self.default_details.col_padding; + let right_text_size = self.get_width().saturating_sub(left_text_size); + + let max_remaining = left_text_size.saturating_sub(match_str.width()); + let max_match = max_remaining.saturating_sub(remaining_str.width()); + if index == self.index() { if let Some(description) = &suggestion.description { - let left_text_size = self.longest_suggestion + self.default_details.col_padding; - let right_text_size = self.get_width().saturating_sub(left_text_size); format!( - "{}{}{}{}{}{}{:max$}{}{}{}{}{}{}", + "{}{}{}{}{}{:max_match$}{:max_remaining$}{}{}{}{}{}{}", suggestion_style_prefix, self.settings.color.selected_match_style.prefix(), match_str, @@ -331,7 +336,6 @@ impl ColumnarMenu { .replace('\n', " "), RESET, self.end_of_line(column), - max = left_text_size, ) } else { format!( @@ -350,10 +354,8 @@ impl ColumnarMenu { ) } } else if let Some(description) = &suggestion.description { - let left_text_size = self.longest_suggestion + self.default_details.col_padding; - let right_text_size = self.get_width().saturating_sub(left_text_size); format!( - "{}{}{}{}{}{:max$}{}{}{}{}{}", + "{}{}{}{}{:max_match$}{:max_remaining$}{}{}{}{}{}", suggestion_style_prefix, self.settings.color.match_style.prefix(), match_str, @@ -369,7 +371,6 @@ impl ColumnarMenu { .replace('\n', " "), RESET, self.end_of_line(column), - max = left_text_size, ) } else { format!(