Use multiple children for dock SplitContainers

This commit is contained in:
kit 2025-07-08 13:20:58 -04:00
parent 78d91947f6
commit 8dfcae15fd
5 changed files with 39 additions and 59 deletions

View file

@ -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++) {