diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-15 04:56:03 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-15 04:56:03 +0300 |
| commit | 4ffd99c2ec62fd3cbc9f9e0673d92c6a2a4f12b1 (patch) | |
| tree | 90941a31138eeb55090cb90e714c92ef4f1c848b /src/ui | |
| parent | efe7c557690157a4e133cd60dd7e2ec1bf6124f7 (diff) | |
fix: keep auto tab labels compact
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/mobile.rs | 27 | ||||
| -rw-r--r-- | src/ui/navigator.rs | 12 | ||||
| -rw-r--r-- | src/ui/tabs.rs | 25 |
3 files changed, 40 insertions, 24 deletions
diff --git a/src/ui/mobile.rs b/src/ui/mobile.rs index a9dc977f..d074b68f 100644 --- a/src/ui/mobile.rs +++ b/src/ui/mobile.rs @@ -330,13 +330,13 @@ fn render_header_status( } fn mobile_tab_status(ws: &crate::workspace::Workspace) -> String { - let tab_number = ws - .public_tab_number(ws.active_tab) - .unwrap_or(ws.active_tab + 1); + let tab_label = ws + .tab_display_name(ws.active_tab) + .unwrap_or_else(|| (ws.active_tab + 1).to_string()); if ws.tabs.len() <= 1 { - format!("tab {tab_number}") + format!("tab {tab_label}") } else { - format!("tab {tab_number} · {}/{}", ws.active_tab + 1, ws.tabs.len()) + format!("tab {tab_label} · {}/{}", ws.active_tab + 1, ws.tabs.len()) } } @@ -524,10 +524,13 @@ fn render_mobile_switcher_content( for (idx, tab) in ws.tabs.iter().enumerate() { let active = idx == ws.active_tab; let bg = mobile_item_bg(false, active, p); + let display_name = ws + .tab_display_name(idx) + .unwrap_or_else(|| (idx + 1).to_string()); let label = if tab.is_auto_named() { - format!("tab {}", tab.display_name()) + format!("tab {display_name}") } else { - format!("{} · {}", tab.number, tab.display_name()) + format!("{} · {display_name}", idx + 1) }; let title = Line::from(vec![ Span::styled(" ", Style::default().bg(bg)), @@ -976,18 +979,18 @@ mod tests { } #[test] - fn mobile_tab_status_uses_public_tab_number_and_position() { + fn mobile_tab_status_uses_compact_tab_label_and_position() { let mut workspace = crate::workspace::Workspace::test_new("mobile-tabs"); let removed_tab = workspace.test_add_tab(None); workspace.test_add_tab(None); assert!(workspace.close_tab(removed_tab)); workspace.active_tab = 1; - assert_eq!(mobile_tab_status(&workspace), "tab 3 · 2/2"); + assert_eq!(mobile_tab_status(&workspace), "tab 2 · 2/2"); } #[test] - fn mobile_switcher_uses_stable_public_tab_number_for_auto_tab_labels() { + fn mobile_switcher_uses_compact_tab_label_for_auto_tab_labels() { let mut app = crate::app::state::AppState::test_new(); let mut workspace = crate::workspace::Workspace::test_new("mobile-tabs"); let removed_tab = workspace.test_add_tab(None); @@ -1017,8 +1020,8 @@ mod tests { .map(|x| terminal.backend().buffer()[(x, 10)].symbol()) .collect::<String>(); - assert!(row.contains("tab 3"), "mobile tab row: {row:?}"); - assert!(!row.contains("tab 2"), "mobile tab row: {row:?}"); + assert!(row.contains("tab 2"), "mobile tab row: {row:?}"); + assert!(!row.contains("tab 3"), "mobile tab row: {row:?}"); } #[cfg(unix)] diff --git a/src/ui/navigator.rs b/src/ui/navigator.rs index b0414f98..882f5c10 100644 --- a/src/ui/navigator.rs +++ b/src/ui/navigator.rs @@ -354,7 +354,11 @@ fn tab_detail( }; let mut parts = vec![ ws.display_name_from(&app.terminals, terminal_runtimes), - format!("tab: {}", tab.display_name()), + format!( + "tab: {}", + ws.tab_display_name(tab_idx) + .unwrap_or_else(|| (tab_idx + 1).to_string()) + ), format!("{} panes", tab.panes.len()), ]; let rows = app.navigator_rows_from(terminal_runtimes); @@ -384,7 +388,11 @@ fn pane_detail( }; let mut parts = vec![ws.display_name_from(&app.terminals, terminal_runtimes)]; if ws.tabs.len() > 1 { - parts.push(format!("tab: {}", tab.display_name())); + parts.push(format!( + "tab: {}", + ws.tab_display_name(tab_idx) + .unwrap_or_else(|| (tab_idx + 1).to_string()) + )); } if let Some(pane_number) = ws.public_pane_number(pane_id) { parts.push(format!("pane {pane_number}")); diff --git a/src/ui/tabs.rs b/src/ui/tabs.rs index 0ce99b7b..f20e22f9 100644 --- a/src/ui/tabs.rs +++ b/src/ui/tabs.rs @@ -21,13 +21,15 @@ pub(crate) struct TabBarView { pub new_tab_hit_area: Rect, } -fn tab_width(tab: &crate::workspace::Tab) -> u16 { - (tab_chrome_label(tab).chars().count() as u16 + 4).max(MIN_TAB_WIDTH) +fn tab_width(ws: &crate::workspace::Workspace, tab_idx: usize) -> u16 { + (tab_chrome_label(ws, tab_idx).chars().count() as u16 + 4).max(MIN_TAB_WIDTH) } -fn tab_chrome_label(tab: &crate::workspace::Tab) -> String { - let name = tab.display_name(); - if tab.zoomed { +fn tab_chrome_label(ws: &crate::workspace::Workspace, tab_idx: usize) -> String { + let name = ws + .tab_display_name(tab_idx) + .unwrap_or_else(|| (tab_idx + 1).to_string()); + if ws.tabs.get(tab_idx).is_some_and(|tab| tab.zoomed) { format!("{name} Z") } else { name @@ -46,7 +48,7 @@ fn layout_tab_hit_areas(ws: &crate::workspace::Workspace, area: Rect, scroll: us if x >= right { break; } - let desired = tab_width(&ws.tabs[idx]); + let desired = tab_width(ws, idx); let remaining = right.saturating_sub(x); let width = desired.min(remaining).max(1); *rect = Rect::new(x, area.y, width, 1); @@ -333,7 +335,7 @@ pub(super) fn render_tab_bar(app: &AppState, frame: &mut Frame, area: Rect) { Style::default().fg(p.overlay1).bg(p.surface0) }; let width = rect.width as usize; - let name = tab_chrome_label(tab); + let name = tab_chrome_label(ws, idx); let text = format!(" {:width$}", name, width = width.saturating_sub(1)); frame.render_widget(Paragraph::new(text).style(style), rect); } @@ -427,8 +429,11 @@ mod tests { let row = buffer_row_text(terminal.backend().buffer(), app.view.tab_bar_rect, 0); assert!(row.contains(" 1 Z"), "tab row: {row:?}"); assert!(row.contains(" test Z"), "tab row: {row:?}"); - assert_eq!(app.workspaces[0].tabs[0].display_name(), "1"); - assert_eq!(app.workspaces[0].tabs[custom_tab].display_name(), "test"); + assert_eq!(app.workspaces[0].tab_display_name(0).as_deref(), Some("1")); + assert_eq!( + app.workspaces[0].tab_display_name(custom_tab).as_deref(), + Some("test") + ); } #[test] @@ -437,6 +442,6 @@ mod tests { ws.tabs[0].set_custom_name("abcdefgh".into()); ws.tabs[0].zoomed = true; - assert_eq!(tab_width(&ws.tabs[0]), 14); + assert_eq!(tab_width(&ws, 0), 14); } } |
