aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-15 04:56:03 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-15 04:56:03 +0300
commit4ffd99c2ec62fd3cbc9f9e0673d92c6a2a4f12b1 (patch)
tree90941a31138eeb55090cb90e714c92ef4f1c848b /src/ui
parentefe7c557690157a4e133cd60dd7e2ec1bf6124f7 (diff)
fix: keep auto tab labels compact
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/mobile.rs27
-rw-r--r--src/ui/navigator.rs12
-rw-r--r--src/ui/tabs.rs25
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);
}
}