diff options
Diffstat (limited to 'src/ui/sidebar.rs')
| -rw-r--r-- | src/ui/sidebar.rs | 34 |
1 files changed, 10 insertions, 24 deletions
diff --git a/src/ui/sidebar.rs b/src/ui/sidebar.rs index ffb93f22..a7b0ca92 100644 --- a/src/ui/sidebar.rs +++ b/src/ui/sidebar.rs @@ -8,6 +8,7 @@ use ratatui::{ use super::scrollbar::{render_scrollbar, should_show_scrollbar}; use super::status::{agent_icon, state_dot, state_label, state_label_color}; +use super::text::{display_width, display_width_u16, truncate_end}; use crate::app::state::{AgentPanelSort, Palette}; use crate::app::{AppState, Mode}; use crate::detect::AgentState; @@ -82,7 +83,7 @@ pub(crate) fn agent_panel_toggle_rect(area: Rect, sort: AgentPanelSort) -> Rect } let label = agent_panel_sort_label(sort); - let width = label.chars().count() as u16; + let width = display_width_u16(label); Rect::new( area.x + area.width.saturating_sub(width), area.y + 1, @@ -162,30 +163,15 @@ pub(super) fn agent_panel_status_key(state: AgentState, seen: bool) -> &'static } } -fn truncate_text(text: &str, max_width: usize) -> String { - let len = text.chars().count(); - if len <= max_width { - return text.to_string(); - } - if max_width == 0 { - return String::new(); - } - if max_width == 1 { - return "…".to_string(); - } - let prefix: String = text.chars().take(max_width.saturating_sub(1)).collect(); - format!("{prefix}…") -} - fn format_agent_panel_primary_label(entry: &AgentPanelEntry, max_width: usize) -> String { let Some(tab_label) = entry.primary_tab_label.as_deref() else { - return truncate_text(&entry.primary_label, max_width); + return truncate_end(&entry.primary_label, max_width); }; let separator = " · "; - let separator_width = separator.chars().count(); + let separator_width = display_width(separator); if max_width <= separator_width + 2 { - return truncate_text( + return truncate_end( &format!("{}{}{}", entry.primary_label, separator, tab_label), max_width, ); @@ -199,8 +185,8 @@ fn format_agent_panel_primary_label(entry: &AgentPanelEntry, max_width: usize) - .max(1); let mut tab_budget = available.saturating_sub(workspace_budget); - let workspace_len = entry.primary_label.chars().count(); - let tab_len = tab_label.chars().count(); + let workspace_len = display_width(&entry.primary_label); + let tab_len = display_width(tab_label); if workspace_len < workspace_budget { let spare = workspace_budget - workspace_len; @@ -215,9 +201,9 @@ fn format_agent_panel_primary_label(entry: &AgentPanelEntry, max_width: usize) - format!( "{}{}{}", - truncate_text(&entry.primary_label, workspace_budget), + truncate_end(&entry.primary_label, workspace_budget), separator, - truncate_text(tab_label, tab_budget) + truncate_end(tab_label, tab_budget) ) } @@ -956,7 +942,7 @@ fn render_workspace_list( }) .unwrap_or(0); let max_branch_len = (card.rect.width as usize).saturating_sub(5 + reserved); - let branch_display = truncate_text(&branch, max_branch_len); + let branch_display = truncate_end(&branch, max_branch_len); let branch_color = if selected || is_active { p.mauve } else { |
