aboutsummaryrefslogtreecommitdiff
path: root/src/app
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/app
parentefe7c557690157a4e133cd60dd7e2ec1bf6124f7 (diff)
fix: keep auto tab labels compact
Diffstat (limited to 'src/app')
-rw-r--r--src/app/actions.rs9
-rw-r--r--src/app/api/layouts.rs5
-rw-r--r--src/app/api/plugins/context.rs6
-rw-r--r--src/app/creation.rs2
-rw-r--r--src/app/input/modal.rs25
-rw-r--r--src/app/input/sidebar.rs5
-rw-r--r--src/app/mod.rs2
7 files changed, 36 insertions, 18 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs
index 82aaa8f7..b033b372 100644
--- a/src/app/actions.rs
+++ b/src/app/actions.rs
@@ -219,8 +219,9 @@ pub fn notification_context(
let mut context = format!("{} · {}", workspace_label, ws_idx + 1);
if ws.tabs.len() > 1 {
if let Some(tab_idx) = ws.find_tab_index_for_pane(pane_id) {
- let tab = &ws.tabs[tab_idx];
- context.push_str(&format!(" · {}", tab.display_name()));
+ if let Some(label) = ws.tab_display_name(tab_idx) {
+ context.push_str(&format!(" · {label}"));
+ }
}
}
context
@@ -450,7 +451,9 @@ impl AppState {
fn navigator_tab_row(&self, ws_idx: usize, tab_idx: usize) -> NavigatorRow {
let ws = &self.workspaces[ws_idx];
let tab = &ws.tabs[tab_idx];
- let label = tab.display_name();
+ let label = ws
+ .tab_display_name(tab_idx)
+ .unwrap_or_else(|| (tab_idx + 1).to_string());
let (status, seen) = tab_aggregate_state(tab, &self.terminals);
let activity = tab_activity_summary(tab, &self.terminals);
let pane_count = tab.panes.len();
diff --git a/src/app/api/layouts.rs b/src/app/api/layouts.rs
index 32dec32a..2b83d027 100644
--- a/src/app/api/layouts.rs
+++ b/src/app/api/layouts.rs
@@ -677,7 +677,10 @@ mod tests {
panic!("expected layout apply response");
};
assert_eq!(app.state.workspaces[0].tabs.len(), 1);
- assert_eq!(app.state.workspaces[0].tabs[0].display_name(), "dev");
+ assert_eq!(
+ app.state.workspaces[0].tab_display_name(0).as_deref(),
+ Some("dev")
+ );
let LayoutNode::Split {
direction,
ratio,
diff --git a/src/app/api/plugins/context.rs b/src/app/api/plugins/context.rs
index 881020b8..cd7d1818 100644
--- a/src/app/api/plugins/context.rs
+++ b/src/app/api/plugins/context.rs
@@ -196,7 +196,7 @@ impl App {
ws_idx,
workspace,
self.public_tab_id(ws_idx, tab_idx),
- Some(tab.display_name()),
+ ws.tab_display_name(tab_idx),
focused_pane,
correlation_id,
))
@@ -257,7 +257,7 @@ impl App {
let workspace = self.workspace_info(ws_idx);
let tab_idx = ws.active_tab_index();
let tab_id = self.public_tab_id(ws_idx, tab_idx);
- let tab_label = ws.tabs.get(tab_idx).map(|tab| tab.display_name());
+ let tab_label = ws.tab_display_name(tab_idx);
let focused_pane = ws
.focused_pane_id()
.and_then(|pane_id| self.pane_info(ws_idx, pane_id));
@@ -283,7 +283,7 @@ impl App {
.find_tab_index_for_pane(pane_id)
.unwrap_or_else(|| ws.active_tab_index());
let tab_id = self.public_tab_id(ws_idx, tab_idx);
- let tab_label = ws.tabs.get(tab_idx).map(|tab| tab.display_name());
+ let tab_label = ws.tab_display_name(tab_idx);
let focused_pane = self.pane_info(ws_idx, pane_id);
self.plugin_context_from_parts(
ws_idx,
diff --git a/src/app/creation.rs b/src/app/creation.rs
index e53bce00..1d9b0f37 100644
--- a/src/app/creation.rs
+++ b/src/app/creation.rs
@@ -237,7 +237,7 @@ impl App {
tab_id: self.public_tab_id(ws_idx, tab_idx)?,
workspace_id: self.public_workspace_id(ws_idx),
number: tab.number,
- label: tab.display_name(),
+ label: ws.tab_display_name(tab_idx)?,
focused: self.state.active == Some(ws_idx) && ws.active_tab == tab_idx,
pane_count: tab.panes.len(),
agent_status: pane_agent_status(agg_state, seen),
diff --git a/src/app/input/modal.rs b/src/app/input/modal.rs
index cff760bf..a8ffef7e 100644
--- a/src/app/input/modal.rs
+++ b/src/app/input/modal.rs
@@ -355,7 +355,7 @@ fn next_new_tab_default_name(state: &AppState) -> String {
state
.active
.and_then(|i| state.workspaces.get(i))
- .map(|ws| ws.next_public_tab_number.to_string())
+ .map(|ws| (ws.tabs.len() + 1).to_string())
.unwrap_or_else(|| "1".to_string())
}
@@ -453,9 +453,14 @@ pub(super) fn apply_rename_action(state: &mut AppState, action: ModalAction) {
if let Some(ws) = state.workspaces.get_mut(ws_idx) {
let workspace_id = ws.id.clone();
let active_tab = ws.active_tab;
+ let keep_auto_name = ws
+ .tabs
+ .get(active_tab)
+ .is_some_and(|tab| tab.is_auto_named())
+ && ws
+ .tab_display_name(active_tab)
+ .is_some_and(|name| new_name == name);
if let Some(tab) = ws.active_tab_mut() {
- let keep_auto_name =
- tab.is_auto_named() && new_name == tab.number.to_string();
if !new_name.is_empty() && !keep_auto_name {
tab.set_custom_name(new_name);
let tab_id = ws
@@ -1296,7 +1301,7 @@ mod tests {
}
#[test]
- fn closing_first_auto_tab_keeps_remaining_auto_tab_number_and_next_prompt() {
+ fn closing_first_auto_tab_compacts_remaining_auto_tab_label_and_next_prompt() {
let mut state = state_with_workspaces(&["test"]);
open_new_tab_dialog(&mut state);
handle_rename_key(
@@ -1311,11 +1316,14 @@ mod tests {
state.workspaces[0].close_tab(0);
state.workspaces[0].switch_tab(0);
- assert_eq!(state.workspaces[0].tabs[0].display_name(), "2");
+ assert_eq!(
+ state.workspaces[0].tab_display_name(0).as_deref(),
+ Some("1")
+ );
assert!(state.workspaces[0].tabs[0].custom_name.is_none());
open_new_tab_dialog(&mut state);
- assert_eq!(state.name_input, "3");
+ assert_eq!(state.name_input, "2");
}
#[test]
@@ -1332,7 +1340,10 @@ mod tests {
assert_eq!(state.mode, Mode::Terminal);
assert!(state.workspaces[0].tabs[1].custom_name.is_none());
- assert_eq!(state.workspaces[0].tabs[1].display_name(), "2");
+ assert_eq!(
+ state.workspaces[0].tab_display_name(1).as_deref(),
+ Some("2")
+ );
}
#[test]
diff --git a/src/app/input/sidebar.rs b/src/app/input/sidebar.rs
index c4bd52d9..3ab5f8f5 100644
--- a/src/app/input/sidebar.rs
+++ b/src/app/input/sidebar.rs
@@ -1298,9 +1298,10 @@ mod tests {
let labels: Vec<_> = app.state.workspaces[0]
.tabs
.iter()
- .map(|tab| tab.display_name())
+ .enumerate()
+ .map(|(tab_idx, _)| app.state.workspaces[0].tab_display_name(tab_idx).unwrap())
.collect();
- assert_eq!(labels, vec!["foo", "3", "1"]);
+ assert_eq!(labels, vec!["foo", "2", "3"]);
assert_eq!(
app.state.workspaces[0].tabs[0].custom_name.as_deref(),
Some("foo")
diff --git a/src/app/mod.rs b/src/app/mod.rs
index d45e085b..1b90f157 100644
--- a/src/app/mod.rs
+++ b/src/app/mod.rs
@@ -2951,7 +2951,7 @@ mod tests {
assert_eq!(tab.tab_id, format!("{}:t3", app.state.workspaces[0].id));
assert_eq!(tab.number, 3);
- assert_eq!(tab.label, "3");
+ assert_eq!(tab.label, "2");
}
#[test]