From 8dfcae15fd857681f758681f5d8839ffe1e43ab9 Mon Sep 17 00:00:00 2001 From: kit Date: Tue, 8 Jul 2025 13:20:58 -0400 Subject: [PATCH] Use multiple children for dock SplitContainers --- editor/debugger/script_editor_debugger.cpp | 10 +---- editor/docks/editor_dock_manager.cpp | 32 ++++++++------- editor/docks/editor_dock_manager.h | 5 +-- editor/editor_node.cpp | 48 ++++++++-------------- editor/editor_node.h | 3 -- 5 files changed, 39 insertions(+), 59 deletions(-) diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index fa016fe408c..59157d39814 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -2130,15 +2130,9 @@ ScriptEditorDebugger::ScriptEditorDebugger() { docontinue->set_shortcut(ED_GET_SHORTCUT("debugger/continue")); docontinue->connect(SceneStringName(pressed), callable_mp(this, &ScriptEditorDebugger::debug_continue)); - HSplitContainer *parent_sc = memnew(HSplitContainer); - vbc->add_child(parent_sc); - parent_sc->set_v_size_flags(SIZE_EXPAND_FILL); - parent_sc->set_split_offset(500 * EDSCALE); - HSplitContainer *sc = memnew(HSplitContainer); sc->set_v_size_flags(SIZE_EXPAND_FILL); - sc->set_h_size_flags(SIZE_EXPAND_FILL); - parent_sc->add_child(sc); + vbc->add_child(sc); VBoxContainer *stack_vb = memnew(VBoxContainer); stack_vb->set_h_size_flags(SIZE_EXPAND_FILL); @@ -2204,7 +2198,7 @@ ScriptEditorDebugger::ScriptEditorDebugger() { breakpoints_tree->connect("item_activated", callable_mp(this, &ScriptEditorDebugger::_breakpoint_tree_clicked)); breakpoints_tree->create_item(); - parent_sc->add_child(breakpoints_tree); + sc->add_child(breakpoints_tree); tabs->add_child(dbg); breakpoints_menu = memnew(PopupMenu); diff --git a/editor/docks/editor_dock_manager.cpp b/editor/docks/editor_dock_manager.cpp index 6a01b922271..937905d11a8 100644 --- a/editor/docks/editor_dock_manager.cpp +++ b/editor/docks/editor_dock_manager.cpp @@ -673,8 +673,15 @@ void EditorDockManager::save_docks_to_config(Ref p_layout, const Str } } - for (int i = 0; i < hsplits.size(); i++) { - p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), int(hsplits[i]->get_split_offset() / EDSCALE)); + PackedInt32Array split_offsets = main_hsplit->get_split_offsets(); + int index = 0; + for (int i = 0; i < vsplits.size(); i++) { + int value = 0; + if (vsplits[i]->is_visible() && index < split_offsets.size()) { + value = split_offsets[index] / EDSCALE; + index++; + } + p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), value); } } @@ -755,21 +762,22 @@ void EditorDockManager::load_docks_from_config(Ref p_layout, const S } // Load SplitContainer offsets. + PackedInt32Array offsets; for (int i = 0; i < vsplits.size(); i++) { if (!p_layout->has_section_key(p_section, "dock_split_" + itos(i + 1))) { continue; } int ofs = p_layout->get_value(p_section, "dock_split_" + itos(i + 1)); vsplits[i]->set_split_offset(ofs); - } - for (int i = 0; i < hsplits.size(); i++) { - if (!p_layout->has_section_key(p_section, "dock_hsplit_" + itos(i + 1))) { - continue; + // Only visible ones need a split offset for the main hsplit, even though they all have a value saved. + if (vsplits[i]->is_visible() && p_layout->has_section_key(p_section, "dock_hsplit_" + itos(i + 1))) { + int offset = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1)); + offsets.push_back(offset * EDSCALE); } - int ofs = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1)); - hsplits[i]->set_split_offset(ofs * EDSCALE); } + main_hsplit->set_split_offsets(offsets); + update_docks_menu(); } @@ -942,8 +950,8 @@ void EditorDockManager::add_vsplit(DockSplitContainer *p_split) { p_split->connect("dragged", callable_mp(this, &EditorDockManager::_dock_split_dragged)); } -void EditorDockManager::add_hsplit(DockSplitContainer *p_split) { - hsplits.push_back(p_split); +void EditorDockManager::set_hsplit(DockSplitContainer *p_split) { + main_hsplit = p_split; p_split->connect("dragged", callable_mp(this, &EditorDockManager::_dock_split_dragged)); } @@ -983,10 +991,6 @@ void EditorDockManager::register_dock_slot(DockConstants::DockSlot p_dock_slot, slot.drag_hint->set_slot(p_dock_slot); } -int EditorDockManager::get_hsplit_count() const { - return hsplits.size(); -} - int EditorDockManager::get_vsplit_count() const { return vsplits.size(); } diff --git a/editor/docks/editor_dock_manager.h b/editor/docks/editor_dock_manager.h index 838b22e4132..d7bac325d70 100644 --- a/editor/docks/editor_dock_manager.h +++ b/editor/docks/editor_dock_manager.h @@ -86,7 +86,7 @@ private: // To access splits easily by index. Vector vsplits; - Vector hsplits; + DockSplitContainer *main_hsplit = nullptr; struct DockSlot { TabContainer *container = nullptr; @@ -133,9 +133,8 @@ public: void set_tab_icon_max_width(int p_max_width); void add_vsplit(DockSplitContainer *p_split); - void add_hsplit(DockSplitContainer *p_split); + void set_hsplit(DockSplitContainer *p_split); void register_dock_slot(DockConstants::DockSlot p_dock_slot, TabContainer *p_tab_container, DockConstants::DockLayout p_layout); - int get_hsplit_count() const; int get_vsplit_count() const; PopupMenu *get_docks_menu(); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index d1013be20ae..8f6fc6460fd 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -8235,16 +8235,15 @@ EditorNode::EditorNode() { main_vbox->add_child(title_bar); #endif - left_l_hsplit = memnew(DockSplitContainer); - left_l_hsplit->set_name("DockHSplitLeftL"); - main_vbox->add_child(left_l_hsplit); - - left_l_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL); + main_hsplit = memnew(DockSplitContainer); + main_hsplit->set_name("DockHSplitMain"); + main_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL); + main_vbox->add_child(main_hsplit); left_l_vsplit = memnew(DockSplitContainer); left_l_vsplit->set_name("DockVSplitLeftL"); left_l_vsplit->set_vertical(true); - left_l_hsplit->add_child(left_l_vsplit); + main_hsplit->add_child(left_l_vsplit); TabContainer *dock_slot[DockConstants::DOCK_SLOT_MAX]; dock_slot[DockConstants::DOCK_SLOT_LEFT_UL] = memnew(TabContainer); @@ -8254,13 +8253,10 @@ EditorNode::EditorNode() { dock_slot[DockConstants::DOCK_SLOT_LEFT_BL]->set_name("DockSlotLeftBL"); left_l_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_LEFT_BL]); - left_r_hsplit = memnew(DockSplitContainer); - left_r_hsplit->set_name("DockHSplitLeftR"); - left_l_hsplit->add_child(left_r_hsplit); left_r_vsplit = memnew(DockSplitContainer); left_r_vsplit->set_name("DockVSplitLeftR"); left_r_vsplit->set_vertical(true); - left_r_hsplit->add_child(left_r_vsplit); + main_hsplit->add_child(left_r_vsplit); dock_slot[DockConstants::DOCK_SLOT_LEFT_UR] = memnew(TabContainer); dock_slot[DockConstants::DOCK_SLOT_LEFT_UR]->set_name("DockSlotLeftUR"); left_r_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_LEFT_UR]); @@ -8268,13 +8264,9 @@ EditorNode::EditorNode() { dock_slot[DockConstants::DOCK_SLOT_LEFT_BR]->set_name("DockSlotLeftBR"); left_r_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_LEFT_BR]); - main_hsplit = memnew(DockSplitContainer); - main_hsplit->set_name("DockHSplitMain"); - left_r_hsplit->add_child(main_hsplit); VBoxContainer *center_vb = memnew(VBoxContainer); - main_hsplit->add_child(center_vb); - center_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL); + main_hsplit->add_child(center_vb); center_split = memnew(DockSplitContainer); center_split->set_name("DockVSplitCenter"); @@ -8284,14 +8276,10 @@ EditorNode::EditorNode() { center_vb->add_child(center_split); center_split->connect("drag_ended", callable_mp(this, &EditorNode::_bottom_panel_resized)); - right_hsplit = memnew(DockSplitContainer); - right_hsplit->set_name("DockHSplitRight"); - main_hsplit->add_child(right_hsplit); - right_l_vsplit = memnew(DockSplitContainer); right_l_vsplit->set_name("DockVSplitRightL"); right_l_vsplit->set_vertical(true); - right_hsplit->add_child(right_l_vsplit); + main_hsplit->add_child(right_l_vsplit); dock_slot[DockConstants::DOCK_SLOT_RIGHT_UL] = memnew(TabContainer); dock_slot[DockConstants::DOCK_SLOT_RIGHT_UL]->set_name("DockSlotRightUL"); right_l_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_RIGHT_UL]); @@ -8302,7 +8290,7 @@ EditorNode::EditorNode() { right_r_vsplit = memnew(DockSplitContainer); right_r_vsplit->set_name("DockVSplitRightR"); right_r_vsplit->set_vertical(true); - right_hsplit->add_child(right_r_vsplit); + main_hsplit->add_child(right_r_vsplit); dock_slot[DockConstants::DOCK_SLOT_RIGHT_UR] = memnew(TabContainer); dock_slot[DockConstants::DOCK_SLOT_RIGHT_UR]->set_name("DockSlotRightUR"); right_r_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_RIGHT_UR]); @@ -8318,10 +8306,7 @@ EditorNode::EditorNode() { editor_dock_manager->add_vsplit(right_l_vsplit); editor_dock_manager->add_vsplit(right_r_vsplit); - editor_dock_manager->add_hsplit(left_l_hsplit); - editor_dock_manager->add_hsplit(left_r_hsplit); - editor_dock_manager->add_hsplit(main_hsplit); - editor_dock_manager->add_hsplit(right_hsplit); + editor_dock_manager->set_hsplit(main_hsplit); for (int i = 0; i < DockConstants::DOCK_SLOT_BOTTOM; i++) { editor_dock_manager->register_dock_slot((DockConstants::DockSlot)i, dock_slot[i], DockConstants::DOCK_LAYOUT_VERTICAL); @@ -8781,9 +8766,11 @@ EditorNode::EditorNode() { history_dock = memnew(HistoryDock); editor_dock_manager->add_dock(history_dock); - // Add some offsets to left_r and main hsplits to make LEFT_R and RIGHT_L docks wider than minsize. - left_r_hsplit->set_split_offset(280 * EDSCALE); - main_hsplit->set_split_offset(-280 * EDSCALE); + // Add some offsets to make LEFT_R and RIGHT_L docks wider than minsize. + const int dock_hsize = 280; + // By default there is only 3 visible, so set 2 split offsets for them. + const int dock_hsize_scaled = dock_hsize * EDSCALE; + main_hsplit->set_split_offsets({ dock_hsize_scaled, -dock_hsize_scaled }); // Define corresponding default layout. @@ -8794,9 +8781,8 @@ EditorNode::EditorNode() { default_layout->set_value(docks_section, "dock_4", "FileSystem,History"); default_layout->set_value(docks_section, "dock_5", "Inspector,Signals,Groups"); - int hsplits[] = { 0, 280, -280, 0 }; - DEV_ASSERT((int)std_size(hsplits) == editor_dock_manager->get_hsplit_count()); - for (int i = 0; i < editor_dock_manager->get_hsplit_count(); i++) { + int hsplits[] = { 0, dock_hsize, -dock_hsize, 0 }; + for (int i = 0; i < (int)std_size(hsplits); i++) { default_layout->set_value(docks_section, "dock_hsplit_" + itos(i + 1), hsplits[i]); } for (int i = 0; i < editor_dock_manager->get_vsplit_count(); i++) { diff --git a/editor/editor_node.h b/editor/editor_node.h index 3db1ec62f77..2eff6a047fd 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -298,12 +298,9 @@ private: ConfirmationDialog *video_restart_dialog = nullptr; // Split containers. - DockSplitContainer *left_l_hsplit = nullptr; DockSplitContainer *left_l_vsplit = nullptr; - DockSplitContainer *left_r_hsplit = nullptr; DockSplitContainer *left_r_vsplit = nullptr; DockSplitContainer *main_hsplit = nullptr; - DockSplitContainer *right_hsplit = nullptr; DockSplitContainer *right_l_vsplit = nullptr; DockSplitContainer *right_r_vsplit = nullptr; DockSplitContainer *center_split = nullptr;