diff options
| author | Vladyslav Kovalov <60650036+kovalov@users.noreply.github.com> | 2026-07-09 01:15:05 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-09 01:15:05 +0300 |
| commit | 010afe53055c338ee22d8598938aef32ee237d6f (patch) | |
| tree | b2d070263856d37226a19cb7e891f219270c14cc /src/app/api | |
| parent | c3df61b564a8de3337b8be075a5d16f64d32850e (diff) | |
fix: refresh tab bar after plugin-driven tab rename (#1179)
refs #1111
Co-authored-by: Vlad Kovalov <kovalov@users.noreply.github.com>
Diffstat (limited to 'src/app/api')
| -rw-r--r-- | src/app/api/tabs.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/app/api/tabs.rs b/src/app/api/tabs.rs index 46487cfa..6ae9d26e 100644 --- a/src/app/api/tabs.rs +++ b/src/app/api/tabs.rs @@ -155,6 +155,13 @@ impl App { }; tab.set_custom_name(params.label.clone()); crate::logging::tab_renamed(&workspace_id, &tab_id); + if self.state.active == Some(ws_idx) { + // Reflow the tab bar so the new label width takes effect immediately. + // The tab bar renders into cached hit areas; without this refresh the + // old geometry lingers until the next refresh (e.g. a tab switch), + // leaving the visible label stale. Mirrors handle_tab_move. + self.state.refresh_tab_bar_view(); + } self.schedule_session_save(); self.emit_event(EventEnvelope { event: EventKind::TabRenamed, @@ -342,6 +349,37 @@ mod tests { })); } + #[test] + fn api_tab_rename_reflows_active_tab_bar() { + let event_hub = crate::api::EventHub::default(); + let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); + let mut app = App::new(&Config::default(), true, None, api_rx, event_hub); + let workspace = Workspace::test_new("tabs"); + app.state.workspaces = vec![workspace]; + app.state.active = Some(0); + app.state.selected = 0; + app.state.view.tab_bar_rect = ratatui::layout::Rect::new(0, 0, 60, 1); + app.state.refresh_tab_bar_view(); + + let tab_id = app.public_tab_id(0, 0).unwrap(); + let width_before = app.state.view.tab_hit_areas[0].width; + + app.handle_tab_rename( + "req".into(), + TabRenameParams { + tab_id, + label: "a much longer custom tab label".into(), + }, + ); + + let width_after = app.state.view.tab_hit_areas[0].width; + assert!( + width_after > width_before, + "tab bar should reflow to the new label width immediately: \ + before={width_before}, after={width_after}" + ); + } + #[tokio::test] async fn tab_create_follows_cached_focused_pane_cwd_without_runtime() { let event_hub = crate::api::EventHub::default(); |
