aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-16 18:38:20 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-16 18:38:20 +0300
commitd998753efe506a04c80306795efc72bff60bb0ec (patch)
tree16fcb1f650ae830fff2e4a64c567b9d44843ff6e /src/ui
parent5ffaf4f32b299bd904c9dbfc02e77252cbfb0220 (diff)
fix: handle cjk branch truncation
refs #644
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/sidebar.rs31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/ui/sidebar.rs b/src/ui/sidebar.rs
index 0704f4a2..0447b119 100644
--- a/src/ui/sidebar.rs
+++ b/src/ui/sidebar.rs
@@ -973,11 +973,7 @@ fn render_workspace_list(
})
.unwrap_or(0);
let max_branch_len = (card.rect.width as usize).saturating_sub(5 + reserved);
- let branch_display = if branch.len() > max_branch_len {
- format!("{}…", &branch[..max_branch_len.saturating_sub(1)])
- } else {
- branch
- };
+ let branch_display = truncate_text(&branch, max_branch_len);
let branch_color = if selected || is_active {
p.mauve
} else {
@@ -1434,6 +1430,31 @@ mod tests {
);
}
+ #[test]
+ fn workspace_list_truncates_cjk_branch_without_panic() {
+ let mut app = crate::app::state::AppState::test_new();
+ let mut ws = Workspace::test_new("repo");
+ ws.cached_git_branch = Some("feature/中文-分支-644".into());
+ app.workspaces = vec![ws];
+ app.active = Some(0);
+ app.selected = 0;
+ app.mode = Mode::Terminal;
+ app.view.workspace_card_areas = vec![crate::app::state::WorkspaceCardArea {
+ ws_idx: 0,
+ rect: Rect::new(0, 1, 15, 2),
+ indented: false,
+ }];
+
+ let mut terminal = Terminal::new(TestBackend::new(15, 6)).expect("test terminal");
+ let runtimes = crate::terminal::TerminalRuntimeRegistry::new();
+
+ terminal
+ .draw(|frame| {
+ render_workspace_list(&app, &runtimes, frame, Rect::new(0, 0, 15, 6), false)
+ })
+ .expect("workspace list should render");
+ }
+
fn workspace_with_worktree_space(
name: &str,
key: Option<&str>,