Merge pull request #116312 from KoBeWi/5000_docks_below_surface

Add extra bottom dock slots
This commit is contained in:
Thaddeus Crews 2026-02-18 17:28:29 -06:00
commit 30faebb208
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
7 changed files with 64 additions and 15 deletions

View file

@ -137,7 +137,7 @@
Allows placing the dock in the vertical dock slots on either side of the editor.
</constant>
<constant name="DOCK_LAYOUT_HORIZONTAL" value="2" enum="DockLayout" is_bitfield="true">
Allows placing the dock in the editor's bottom panel.
Allows placing the dock in the horizontal dock slots at the bottom.
</constant>
<constant name="DOCK_LAYOUT_FLOATING" value="4" enum="DockLayout" is_bitfield="true">
Allows making the dock floating (opened as a separate window).
@ -175,7 +175,13 @@
<constant name="DOCK_SLOT_BOTTOM" value="8" enum="DockSlot">
Bottom panel.
</constant>
<constant name="DOCK_SLOT_MAX" value="9" enum="DockSlot">
<constant name="DOCK_SLOT_BOTTOM_L" value="9" enum="DockSlot">
Dock slot at the bottom, below bottom panel, on the left side.
</constant>
<constant name="DOCK_SLOT_BOTTOM_R" value="10" enum="DockSlot">
Dock slot at the bottom, below bottom panel, on the right side.
</constant>
<constant name="DOCK_SLOT_MAX" value="11" enum="DockSlot">
Represents the size of the [enum DockSlot] enum.
</constant>
</constants>

View file

@ -270,3 +270,13 @@ SideDockTabContainer::SideDockTabContainer(EditorDock::DockSlot p_slot, const Re
set_v_size_flags(Control::SIZE_EXPAND_FILL);
set_use_hidden_tabs_for_min_size(true);
}
BottomSideDockTabContainer::BottomSideDockTabContainer(EditorDock::DockSlot p_slot, const Rect2i &p_slot_rect) :
DockTabContainer(p_slot) {
grid_rect = p_slot_rect;
layout = EditorDock::DOCK_LAYOUT_HORIZONTAL;
set_custom_minimum_size(Size2(0, 170 * EDSCALE));
set_h_size_flags(Control::SIZE_EXPAND_FILL);
set_use_hidden_tabs_for_min_size(true);
}

View file

@ -120,3 +120,10 @@ class SideDockTabContainer : public DockTabContainer {
public:
SideDockTabContainer(EditorDock::DockSlot p_slot, const Rect2i &p_slot_rect);
};
class BottomSideDockTabContainer : public DockTabContainer {
GDCLASS(BottomSideDockTabContainer, DockTabContainer);
public:
BottomSideDockTabContainer(EditorDock::DockSlot p_slot, const Rect2i &p_slot_rect);
};

View file

@ -133,6 +133,8 @@ void EditorDock::_bind_methods() {
BIND_ENUM_CONSTANT(DOCK_SLOT_RIGHT_UR);
BIND_ENUM_CONSTANT(DOCK_SLOT_RIGHT_BR);
BIND_ENUM_CONSTANT(DOCK_SLOT_BOTTOM);
BIND_ENUM_CONSTANT(DOCK_SLOT_BOTTOM_L);
BIND_ENUM_CONSTANT(DOCK_SLOT_BOTTOM_R);
BIND_ENUM_CONSTANT(DOCK_SLOT_MAX);
GDVIRTUAL_BIND(_update_layout, "layout");

View file

@ -59,6 +59,8 @@ public:
DOCK_SLOT_RIGHT_UR,
DOCK_SLOT_RIGHT_BR,
DOCK_SLOT_BOTTOM,
DOCK_SLOT_BOTTOM_L,
DOCK_SLOT_BOTTOM_R,
DOCK_SLOT_MAX
};

View file

@ -155,7 +155,7 @@ public:
class DockSlotGrid : public Control {
GDCLASS(DockSlotGrid, Control);
static constexpr Vector2i GRID_SIZE = Vector2i(6, 6);
static constexpr Vector2i GRID_SIZE = Vector2i(6, 8);
static constexpr Vector2i MARGINS = Vector2i(4, 8);
static constexpr Vector2i CELL_SIZE = Vector2i(24, 12);
static constexpr int TABS_PER_CELL = 3;

View file

@ -8528,28 +8528,34 @@ EditorNode::EditorNode() {
main_vbox->add_child(title_bar);
#endif
DockSplitContainer *main_vsplit = memnew(DockSplitContainer);
main_vsplit->set_name("DockVSplitMain");
main_vsplit->set_vertical(true);
main_vsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
main_vbox->add_child(main_vsplit);
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);
main_vsplit->add_child(main_hsplit);
left_l_vsplit = memnew(DockSplitContainer);
left_l_vsplit->set_name("DockVSplitLeftL");
left_l_vsplit->set_vertical(true);
main_hsplit->add_child(left_l_vsplit);
DockTabContainer *dock_slots[EditorDock::DOCK_SLOT_MAX];
LocalVector<DockTabContainer *> dock_slots;
{
DockTabContainer *dock_container = memnew(SideDockTabContainer(EditorDock::DOCK_SLOT_LEFT_UL, Rect2i(0, 0, 1, 3)));
dock_container->set_name("DockSlotLeftUL");
left_l_vsplit->add_child(dock_container);
dock_slots[dock_container->dock_slot] = dock_container;
dock_slots.push_back(dock_container);
}
{
DockTabContainer *dock_container = memnew(SideDockTabContainer(EditorDock::DOCK_SLOT_LEFT_BL, Rect2i(0, 3, 1, 3)));
dock_container->set_name("DockSlotLeftBL");
left_l_vsplit->add_child(dock_container);
dock_slots[dock_container->dock_slot] = dock_container;
dock_slots.push_back(dock_container);
}
left_r_vsplit = memnew(DockSplitContainer);
@ -8560,13 +8566,13 @@ EditorNode::EditorNode() {
DockTabContainer *dock_container = memnew(SideDockTabContainer(EditorDock::DOCK_SLOT_LEFT_UR, Rect2i(1, 0, 1, 3)));
dock_container->set_name("DockSlotLeftUR");
left_r_vsplit->add_child(dock_container);
dock_slots[dock_container->dock_slot] = dock_container;
dock_slots.push_back(dock_container);
}
{
DockTabContainer *dock_container = memnew(SideDockTabContainer(EditorDock::DOCK_SLOT_LEFT_BR, Rect2i(1, 3, 1, 3)));
dock_container->set_name("DockSlotLeftBR");
left_r_vsplit->add_child(dock_container);
dock_slots[dock_container->dock_slot] = dock_container;
dock_slots.push_back(dock_container);
}
VBoxContainer *center_vb = memnew(VBoxContainer);
@ -8589,13 +8595,13 @@ EditorNode::EditorNode() {
DockTabContainer *dock_container = memnew(SideDockTabContainer(EditorDock::DOCK_SLOT_RIGHT_UL, Rect2i(4, 0, 1, 3)));
dock_container->set_name("DockSlotRightUL");
right_l_vsplit->add_child(dock_container);
dock_slots[dock_container->dock_slot] = dock_container;
dock_slots.push_back(dock_container);
}
{
DockTabContainer *dock_container = memnew(SideDockTabContainer(EditorDock::DOCK_SLOT_RIGHT_BL, Rect2i(4, 3, 1, 3)));
dock_container->set_name("DockSlotRightBL");
right_l_vsplit->add_child(dock_container);
dock_slots[dock_container->dock_slot] = dock_container;
dock_slots.push_back(dock_container);
}
right_r_vsplit = memnew(DockSplitContainer);
@ -8606,13 +8612,29 @@ EditorNode::EditorNode() {
DockTabContainer *dock_container = memnew(SideDockTabContainer(EditorDock::DOCK_SLOT_RIGHT_UR, Rect2i(5, 0, 1, 3)));
dock_container->set_name("DockSlotRightUR");
right_r_vsplit->add_child(dock_container);
dock_slots[dock_container->dock_slot] = dock_container;
dock_slots.push_back(dock_container);
}
{
DockTabContainer *dock_container = memnew(SideDockTabContainer(EditorDock::DOCK_SLOT_RIGHT_BR, Rect2i(5, 3, 1, 3)));
dock_container->set_name("DockSlotRightBR");
right_r_vsplit->add_child(dock_container);
dock_slots[dock_container->dock_slot] = dock_container;
dock_slots.push_back(dock_container);
}
DockSplitContainer *bottom_hsplit = memnew(DockSplitContainer);
bottom_hsplit->set_name("DockHSplitBottom");
main_vsplit->add_child(bottom_hsplit);
{
DockTabContainer *dock_container = memnew(BottomSideDockTabContainer(EditorDock::DOCK_SLOT_BOTTOM_L, Rect2i(0, 6, 3, 2)));
dock_container->set_name("DockSlotBottomL");
bottom_hsplit->add_child(dock_container);
dock_slots.push_back(dock_container);
}
{
DockTabContainer *dock_container = memnew(BottomSideDockTabContainer(EditorDock::DOCK_SLOT_BOTTOM_R, Rect2i(3, 6, 3, 2)));
dock_container->set_name("DockSlotBottomR");
bottom_hsplit->add_child(dock_container);
dock_slots.push_back(dock_container);
}
editor_dock_manager = memnew(EditorDockManager);
@ -8625,8 +8647,8 @@ EditorNode::EditorNode() {
editor_dock_manager->set_hsplit(main_hsplit);
for (int i = 0; i < EditorDock::DOCK_SLOT_BOTTOM; i++) {
editor_dock_manager->register_dock_slot(dock_slots[i]);
for (DockTabContainer *dock_container : dock_slots) {
editor_dock_manager->register_dock_slot(dock_container);
}
editor_layout_save_delay_timer = memnew(Timer);