From 0eee0046233d0fbcce4683b706e24965557a6fd4 Mon Sep 17 00:00:00 2001 From: Oz Date: Fri, 4 Sep 2026 23:37:33 +0000 Subject: [PATCH] fix: commit inline renames on vertical-tabs click-away Co-Authored-By: Ben Holmes <51384119+bholmesdev@users.noreply.github.com> --- app/src/workspace/action.rs | 2 + app/src/workspace/view.rs | 5 ++ app/src/workspace/view/vertical_tabs.rs | 2 +- app/src/workspace/view_tests.rs | 91 +++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 1 deletion(-) diff --git a/app/src/workspace/action.rs b/app/src/workspace/action.rs index 5c0fa344582..15ace161f30 100644 --- a/app/src/workspace/action.rs +++ b/app/src/workspace/action.rs @@ -177,6 +177,7 @@ pub enum WorkspaceAction { ToggleTabGroupCollapsed(TabGroupId), /// Opens an inline editor over the given group's header for renaming. RenameTabGroup(TabGroupId), + CommitActiveRename, CancelActiveRename, /// Creates a new tab group containing the tab at the given index. NewTabGroupFromTab(usize), @@ -1156,6 +1157,7 @@ impl WorkspaceAction { | ShiftSelectTabRange { .. } | ToggleTabMultiSelection { .. } | ClearTabMultiSelection + | CommitActiveRename | CancelActiveRename | StartNewConversation { .. } | UndoRevertInCodeReviewPane { .. } diff --git a/app/src/workspace/view.rs b/app/src/workspace/view.rs index 44b0d7b3613..53cb835e0f8 100644 --- a/app/src/workspace/view.rs +++ b/app/src/workspace/view.rs @@ -23959,6 +23959,11 @@ impl TypedActionView for Workspace { CloseTabGroup(group_id) => self.close_tab_group(*group_id, ctx), ToggleTabGroupCollapsed(group_id) => self.toggle_tab_group_collapsed(*group_id, ctx), RenameTabGroup(group_id) => self.rename_tab_group(*group_id, ctx), + CommitActiveRename => { + self.finish_tab_rename(ctx); + self.finish_pane_rename(ctx); + self.finish_tab_group_rename(ctx); + } CancelActiveRename => { self.cancel_tab_rename(ctx); self.cancel_pane_rename(ctx); diff --git a/app/src/workspace/view/vertical_tabs.rs b/app/src/workspace/view/vertical_tabs.rs index 2894be9c1d7..54f944e1707 100644 --- a/app/src/workspace/view/vertical_tabs.rs +++ b/app/src/workspace/view/vertical_tabs.rs @@ -1725,7 +1725,7 @@ fn render_vertical_tabs_panel( .finish() }) .on_click(|ctx, _, _| { - ctx.dispatch_typed_action(WorkspaceAction::CancelActiveRename); + ctx.dispatch_typed_action(WorkspaceAction::CommitActiveRename); }) .on_right_click(|ctx, _, position| { if FeatureFlag::GroupedTabs.is_enabled() { diff --git a/app/src/workspace/view_tests.rs b/app/src/workspace/view_tests.rs index 63570077665..02eda7d97ce 100644 --- a/app/src/workspace/view_tests.rs +++ b/app/src/workspace/view_tests.rs @@ -1589,6 +1589,62 @@ fn test_tab_renaming_editor_selections() { }); } +#[test] +fn test_commit_active_rename_commits_tab_rename() { + App::test((), |mut app| async move { + initialize_app(&mut app); + + let workspace = mock_workspace(&mut app); + + workspace.update(&mut app, |workspace, ctx| { + workspace.rename_tab_internal(0, "old title", ctx); + workspace.tab_rename_editor.update(ctx, |editor, ctx| { + editor.insert_selected_text("new title", ctx); + }); + + workspace.handle_action(&WorkspaceAction::CommitActiveRename, ctx); + + assert!(!workspace.current_workspace_state.is_tab_being_renamed()); + assert_eq!( + workspace.tabs[0] + .pane_group + .as_ref(ctx) + .custom_title(ctx) + .as_deref(), + Some("new title") + ); + }); + }); +} + +#[test] +fn test_cancel_active_rename_discards_tab_rename() { + App::test((), |mut app| async move { + initialize_app(&mut app); + + let workspace = mock_workspace(&mut app); + + workspace.update(&mut app, |workspace, ctx| { + workspace.rename_tab_internal(0, "old title", ctx); + workspace.tab_rename_editor.update(ctx, |editor, ctx| { + editor.insert_selected_text("new title", ctx); + }); + + workspace.handle_action(&WorkspaceAction::CancelActiveRename, ctx); + + assert!(!workspace.current_workspace_state.is_tab_being_renamed()); + assert_ne!( + workspace.tabs[0] + .pane_group + .as_ref(ctx) + .custom_title(ctx) + .as_deref(), + Some("new title") + ); + }); + }); +} + #[test] fn test_tab_renaming_editor_reset() { App::test((), |mut app| async move { @@ -4606,6 +4662,41 @@ fn test_toggle_tab_group_collapsed_flips_state() { }); } +#[test] +fn test_commit_active_rename_commits_tab_group_rename() { + let _grouped_tabs_guard = FeatureFlag::GroupedTabs.override_enabled(true); + + App::test((), |mut app| async move { + initialize_app(&mut app); + + let workspace = mock_workspace(&mut app); + workspace.update(&mut app, |workspace, ctx| { + let group = TabGroup::new(); + let group_id = group.id; + workspace.tab_groups.insert(group_id, group); + workspace.tabs[0].group_id = Some(group_id); + workspace.rename_tab_group(group_id, ctx); + workspace + .tab_group_rename_editor + .update(ctx, |editor, ctx| { + editor.insert_selected_text("renamed group", ctx); + }); + + workspace.handle_action(&WorkspaceAction::CommitActiveRename, ctx); + + assert!( + !workspace + .current_workspace_state + .is_any_tab_group_being_renamed() + ); + assert_eq!( + workspace.tab_groups[&group_id].name.as_deref(), + Some("renamed group") + ); + }); + }); +} + #[test] fn test_close_tab_group_removes_group_and_members() { let _grouped_tabs_guard = FeatureFlag::GroupedTabs.override_enabled(true);