Skip to content

Commit 8dfcae1

Browse files
committed
Use multiple children for dock SplitContainers
1 parent 78d9194 commit 8dfcae1

File tree

5 files changed

+39
-59
lines changed

5 files changed

+39
-59
lines changed

editor/debugger/script_editor_debugger.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2130,15 +2130,9 @@ ScriptEditorDebugger::ScriptEditorDebugger() {
21302130
docontinue->set_shortcut(ED_GET_SHORTCUT("debugger/continue"));
21312131
docontinue->connect(SceneStringName(pressed), callable_mp(this, &ScriptEditorDebugger::debug_continue));
21322132

2133-
HSplitContainer *parent_sc = memnew(HSplitContainer);
2134-
vbc->add_child(parent_sc);
2135-
parent_sc->set_v_size_flags(SIZE_EXPAND_FILL);
2136-
parent_sc->set_split_offset(500 * EDSCALE);
2137-
21382133
HSplitContainer *sc = memnew(HSplitContainer);
21392134
sc->set_v_size_flags(SIZE_EXPAND_FILL);
2140-
sc->set_h_size_flags(SIZE_EXPAND_FILL);
2141-
parent_sc->add_child(sc);
2135+
vbc->add_child(sc);
21422136

21432137
VBoxContainer *stack_vb = memnew(VBoxContainer);
21442138
stack_vb->set_h_size_flags(SIZE_EXPAND_FILL);
@@ -2204,7 +2198,7 @@ ScriptEditorDebugger::ScriptEditorDebugger() {
22042198
breakpoints_tree->connect("item_activated", callable_mp(this, &ScriptEditorDebugger::_breakpoint_tree_clicked));
22052199
breakpoints_tree->create_item();
22062200

2207-
parent_sc->add_child(breakpoints_tree);
2201+
sc->add_child(breakpoints_tree);
22082202
tabs->add_child(dbg);
22092203

22102204
breakpoints_menu = memnew(PopupMenu);

editor/docks/editor_dock_manager.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -673,8 +673,15 @@ void EditorDockManager::save_docks_to_config(Ref<ConfigFile> p_layout, const Str
673673
}
674674
}
675675

676-
for (int i = 0; i < hsplits.size(); i++) {
677-
p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), int(hsplits[i]->get_split_offset() / EDSCALE));
676+
PackedInt32Array split_offsets = main_hsplit->get_split_offsets();
677+
int index = 0;
678+
for (int i = 0; i < vsplits.size(); i++) {
679+
int value = 0;
680+
if (vsplits[i]->is_visible() && index < split_offsets.size()) {
681+
value = split_offsets[index] / EDSCALE;
682+
index++;
683+
}
684+
p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), value);
678685
}
679686
}
680687

@@ -755,21 +762,22 @@ void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const S
755762
}
756763

757764
// Load SplitContainer offsets.
765+
PackedInt32Array offsets;
758766
for (int i = 0; i < vsplits.size(); i++) {
759767
if (!p_layout->has_section_key(p_section, "dock_split_" + itos(i + 1))) {
760768
continue;
761769
}
762770
int ofs = p_layout->get_value(p_section, "dock_split_" + itos(i + 1));
763771
vsplits[i]->set_split_offset(ofs);
764-
}
765772

766-
for (int i = 0; i < hsplits.size(); i++) {
767-
if (!p_layout->has_section_key(p_section, "dock_hsplit_" + itos(i + 1))) {
768-
continue;
773+
// Only visible ones need a split offset for the main hsplit, even though they all have a value saved.
774+
if (vsplits[i]->is_visible() && p_layout->has_section_key(p_section, "dock_hsplit_" + itos(i + 1))) {
775+
int offset = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1));
776+
offsets.push_back(offset * EDSCALE);
769777
}
770-
int ofs = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1));
771-
hsplits[i]->set_split_offset(ofs * EDSCALE);
772778
}
779+
main_hsplit->set_split_offsets(offsets);
780+
773781
update_docks_menu();
774782
}
775783

@@ -942,8 +950,8 @@ void EditorDockManager::add_vsplit(DockSplitContainer *p_split) {
942950
p_split->connect("dragged", callable_mp(this, &EditorDockManager::_dock_split_dragged));
943951
}
944952

945-
void EditorDockManager::add_hsplit(DockSplitContainer *p_split) {
946-
hsplits.push_back(p_split);
953+
void EditorDockManager::set_hsplit(DockSplitContainer *p_split) {
954+
main_hsplit = p_split;
947955
p_split->connect("dragged", callable_mp(this, &EditorDockManager::_dock_split_dragged));
948956
}
949957

@@ -983,10 +991,6 @@ void EditorDockManager::register_dock_slot(DockConstants::DockSlot p_dock_slot,
983991
slot.drag_hint->set_slot(p_dock_slot);
984992
}
985993

986-
int EditorDockManager::get_hsplit_count() const {
987-
return hsplits.size();
988-
}
989-
990994
int EditorDockManager::get_vsplit_count() const {
991995
return vsplits.size();
992996
}

editor/docks/editor_dock_manager.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class EditorDockManager : public Object {
8686

8787
// To access splits easily by index.
8888
Vector<DockSplitContainer *> vsplits;
89-
Vector<DockSplitContainer *> hsplits;
89+
DockSplitContainer *main_hsplit = nullptr;
9090

9191
struct DockSlot {
9292
TabContainer *container = nullptr;
@@ -133,9 +133,8 @@ class EditorDockManager : public Object {
133133
void set_tab_icon_max_width(int p_max_width);
134134

135135
void add_vsplit(DockSplitContainer *p_split);
136-
void add_hsplit(DockSplitContainer *p_split);
136+
void set_hsplit(DockSplitContainer *p_split);
137137
void register_dock_slot(DockConstants::DockSlot p_dock_slot, TabContainer *p_tab_container, DockConstants::DockLayout p_layout);
138-
int get_hsplit_count() const;
139138
int get_vsplit_count() const;
140139
PopupMenu *get_docks_menu();
141140

editor/editor_node.cpp

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8235,16 +8235,15 @@ EditorNode::EditorNode() {
82358235
main_vbox->add_child(title_bar);
82368236
#endif
82378237

8238-
left_l_hsplit = memnew(DockSplitContainer);
8239-
left_l_hsplit->set_name("DockHSplitLeftL");
8240-
main_vbox->add_child(left_l_hsplit);
8241-
8242-
left_l_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
8238+
main_hsplit = memnew(DockSplitContainer);
8239+
main_hsplit->set_name("DockHSplitMain");
8240+
main_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
8241+
main_vbox->add_child(main_hsplit);
82438242

82448243
left_l_vsplit = memnew(DockSplitContainer);
82458244
left_l_vsplit->set_name("DockVSplitLeftL");
82468245
left_l_vsplit->set_vertical(true);
8247-
left_l_hsplit->add_child(left_l_vsplit);
8246+
main_hsplit->add_child(left_l_vsplit);
82488247

82498248
TabContainer *dock_slot[DockConstants::DOCK_SLOT_MAX];
82508249
dock_slot[DockConstants::DOCK_SLOT_LEFT_UL] = memnew(TabContainer);
@@ -8254,27 +8253,20 @@ EditorNode::EditorNode() {
82548253
dock_slot[DockConstants::DOCK_SLOT_LEFT_BL]->set_name("DockSlotLeftBL");
82558254
left_l_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_LEFT_BL]);
82568255

8257-
left_r_hsplit = memnew(DockSplitContainer);
8258-
left_r_hsplit->set_name("DockHSplitLeftR");
8259-
left_l_hsplit->add_child(left_r_hsplit);
82608256
left_r_vsplit = memnew(DockSplitContainer);
82618257
left_r_vsplit->set_name("DockVSplitLeftR");
82628258
left_r_vsplit->set_vertical(true);
8263-
left_r_hsplit->add_child(left_r_vsplit);
8259+
main_hsplit->add_child(left_r_vsplit);
82648260
dock_slot[DockConstants::DOCK_SLOT_LEFT_UR] = memnew(TabContainer);
82658261
dock_slot[DockConstants::DOCK_SLOT_LEFT_UR]->set_name("DockSlotLeftUR");
82668262
left_r_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_LEFT_UR]);
82678263
dock_slot[DockConstants::DOCK_SLOT_LEFT_BR] = memnew(TabContainer);
82688264
dock_slot[DockConstants::DOCK_SLOT_LEFT_BR]->set_name("DockSlotLeftBR");
82698265
left_r_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_LEFT_BR]);
82708266

8271-
main_hsplit = memnew(DockSplitContainer);
8272-
main_hsplit->set_name("DockHSplitMain");
8273-
left_r_hsplit->add_child(main_hsplit);
82748267
VBoxContainer *center_vb = memnew(VBoxContainer);
8275-
main_hsplit->add_child(center_vb);
8276-
82778268
center_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
8269+
main_hsplit->add_child(center_vb);
82788270

82798271
center_split = memnew(DockSplitContainer);
82808272
center_split->set_name("DockVSplitCenter");
@@ -8284,14 +8276,10 @@ EditorNode::EditorNode() {
82848276
center_vb->add_child(center_split);
82858277
center_split->connect("drag_ended", callable_mp(this, &EditorNode::_bottom_panel_resized));
82868278

8287-
right_hsplit = memnew(DockSplitContainer);
8288-
right_hsplit->set_name("DockHSplitRight");
8289-
main_hsplit->add_child(right_hsplit);
8290-
82918279
right_l_vsplit = memnew(DockSplitContainer);
82928280
right_l_vsplit->set_name("DockVSplitRightL");
82938281
right_l_vsplit->set_vertical(true);
8294-
right_hsplit->add_child(right_l_vsplit);
8282+
main_hsplit->add_child(right_l_vsplit);
82958283
dock_slot[DockConstants::DOCK_SLOT_RIGHT_UL] = memnew(TabContainer);
82968284
dock_slot[DockConstants::DOCK_SLOT_RIGHT_UL]->set_name("DockSlotRightUL");
82978285
right_l_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_RIGHT_UL]);
@@ -8302,7 +8290,7 @@ EditorNode::EditorNode() {
83028290
right_r_vsplit = memnew(DockSplitContainer);
83038291
right_r_vsplit->set_name("DockVSplitRightR");
83048292
right_r_vsplit->set_vertical(true);
8305-
right_hsplit->add_child(right_r_vsplit);
8293+
main_hsplit->add_child(right_r_vsplit);
83068294
dock_slot[DockConstants::DOCK_SLOT_RIGHT_UR] = memnew(TabContainer);
83078295
dock_slot[DockConstants::DOCK_SLOT_RIGHT_UR]->set_name("DockSlotRightUR");
83088296
right_r_vsplit->add_child(dock_slot[DockConstants::DOCK_SLOT_RIGHT_UR]);
@@ -8318,10 +8306,7 @@ EditorNode::EditorNode() {
83188306
editor_dock_manager->add_vsplit(right_l_vsplit);
83198307
editor_dock_manager->add_vsplit(right_r_vsplit);
83208308

8321-
editor_dock_manager->add_hsplit(left_l_hsplit);
8322-
editor_dock_manager->add_hsplit(left_r_hsplit);
8323-
editor_dock_manager->add_hsplit(main_hsplit);
8324-
editor_dock_manager->add_hsplit(right_hsplit);
8309+
editor_dock_manager->set_hsplit(main_hsplit);
83258310

83268311
for (int i = 0; i < DockConstants::DOCK_SLOT_BOTTOM; i++) {
83278312
editor_dock_manager->register_dock_slot((DockConstants::DockSlot)i, dock_slot[i], DockConstants::DOCK_LAYOUT_VERTICAL);
@@ -8781,9 +8766,11 @@ EditorNode::EditorNode() {
87818766
history_dock = memnew(HistoryDock);
87828767
editor_dock_manager->add_dock(history_dock);
87838768

8784-
// Add some offsets to left_r and main hsplits to make LEFT_R and RIGHT_L docks wider than minsize.
8785-
left_r_hsplit->set_split_offset(280 * EDSCALE);
8786-
main_hsplit->set_split_offset(-280 * EDSCALE);
8769+
// Add some offsets to make LEFT_R and RIGHT_L docks wider than minsize.
8770+
const int dock_hsize = 280;
8771+
// By default there is only 3 visible, so set 2 split offsets for them.
8772+
const int dock_hsize_scaled = dock_hsize * EDSCALE;
8773+
main_hsplit->set_split_offsets({ dock_hsize_scaled, -dock_hsize_scaled });
87878774

87888775
// Define corresponding default layout.
87898776

@@ -8794,9 +8781,8 @@ EditorNode::EditorNode() {
87948781
default_layout->set_value(docks_section, "dock_4", "FileSystem,History");
87958782
default_layout->set_value(docks_section, "dock_5", "Inspector,Signals,Groups");
87968783

8797-
int hsplits[] = { 0, 280, -280, 0 };
8798-
DEV_ASSERT((int)std_size(hsplits) == editor_dock_manager->get_hsplit_count());
8799-
for (int i = 0; i < editor_dock_manager->get_hsplit_count(); i++) {
8784+
int hsplits[] = { 0, dock_hsize, -dock_hsize, 0 };
8785+
for (int i = 0; i < (int)std_size(hsplits); i++) {
88008786
default_layout->set_value(docks_section, "dock_hsplit_" + itos(i + 1), hsplits[i]);
88018787
}
88028788
for (int i = 0; i < editor_dock_manager->get_vsplit_count(); i++) {

editor/editor_node.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,12 +298,9 @@ class EditorNode : public Node {
298298
ConfirmationDialog *video_restart_dialog = nullptr;
299299

300300
// Split containers.
301-
DockSplitContainer *left_l_hsplit = nullptr;
302301
DockSplitContainer *left_l_vsplit = nullptr;
303-
DockSplitContainer *left_r_hsplit = nullptr;
304302
DockSplitContainer *left_r_vsplit = nullptr;
305303
DockSplitContainer *main_hsplit = nullptr;
306-
DockSplitContainer *right_hsplit = nullptr;
307304
DockSplitContainer *right_l_vsplit = nullptr;
308305
DockSplitContainer *right_r_vsplit = nullptr;
309306
DockSplitContainer *center_split = nullptr;

0 commit comments

Comments
 (0)