From 06b6d669fe503d232241bcfd68e7cfa2a5afaf29 Mon Sep 17 00:00:00 2001 From: Logan Detrick Date: Thu, 5 Feb 2026 15:46:16 -0800 Subject: [PATCH] Change to previously open dock when closing active dock. --- editor/docks/dock_tab_container.cpp | 2 +- editor/docks/editor_dock_manager.cpp | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/editor/docks/dock_tab_container.cpp b/editor/docks/dock_tab_container.cpp index 705060a922..3cf67b5748 100644 --- a/editor/docks/dock_tab_container.cpp +++ b/editor/docks/dock_tab_container.cpp @@ -227,7 +227,7 @@ void DockTabContainer::move_dock_index(EditorDock *p_dock, int p_to_index, bool int target_index = CLAMP(p_to_index, 0, get_tab_count() - 1); move_child(p_dock, get_dock(target_index)->get_index(false)); - if (p_set_current) { + if (p_set_current && !p_dock->is_visible_in_tree()) { set_current_tab(target_index); } set_block_signals(false); diff --git a/editor/docks/editor_dock_manager.cpp b/editor/docks/editor_dock_manager.cpp index 684b4130e8..73a2cbdd9e 100644 --- a/editor/docks/editor_dock_manager.cpp +++ b/editor/docks/editor_dock_manager.cpp @@ -322,6 +322,11 @@ void EditorDockManager::_move_dock(EditorDock *p_dock, Control *p_target, int p_ DockTabContainer *parent_tabs = Object::cast_to(parent); if (parent_tabs) { p_dock->previous_tab_index = parent_tabs->get_tab_idx_from_control(p_dock); + + // Swap to previous tab when closing current tab. + if (parent_tabs->get_current_tab() == p_dock->previous_tab_index) { + parent_tabs->set_current_tab(parent_tabs->get_previous_tab()); + } } parent->set_block_signals(true); parent->remove_child(p_dock); @@ -337,6 +342,9 @@ void EditorDockManager::_move_dock(EditorDock *p_dock, Control *p_target, int p_ return; } + // Prevent extra visibility signals from firing. + p_dock->hide(); + DockTabContainer *dock_tab_container = Object::cast_to(p_target); if (p_target != closed_dock_parent) { if (dock_tab_container->layout != p_dock->current_layout) { @@ -584,8 +592,6 @@ void EditorDockManager::close_dock(EditorDock *p_dock) { parent_container->dock_closed(p_dock); } - // Hide before moving to remove inconsistent signals. - p_dock->hide(); _move_dock(p_dock, closed_dock_parent); _update_layout(); @@ -648,8 +654,10 @@ void EditorDockManager::_make_dock_visible(EditorDock *p_dock, bool p_grab_focus tab_container->get_tab_bar()->grab_focus(); } - int tab_index = tab_container->get_tab_idx_from_control(p_dock); - tab_container->set_current_tab(tab_index); + if (!p_dock->is_visible_in_tree()) { + int tab_index = tab_container->get_tab_idx_from_control(p_dock); + tab_container->set_current_tab(tab_index); + } } void EditorDockManager::focus_dock(EditorDock *p_dock) {