diff --git a/doc/classes/EditorDock.xml b/doc/classes/EditorDock.xml
index 1eb16e6eeb..743386f3a3 100644
--- a/doc/classes/EditorDock.xml
+++ b/doc/classes/EditorDock.xml
@@ -137,7 +137,7 @@
Allows placing the dock in the vertical dock slots on either side of the editor.
- Allows placing the dock in the editor's bottom panel.
+ Allows placing the dock in the horizontal dock slots at the bottom.
Allows making the dock floating (opened as a separate window).
@@ -175,7 +175,13 @@
Bottom panel.
-
+
+ Dock slot at the bottom, below bottom panel, on the left side.
+
+
+ Dock slot at the bottom, below bottom panel, on the right side.
+
+
Represents the size of the [enum DockSlot] enum.
diff --git a/editor/docks/dock_tab_container.cpp b/editor/docks/dock_tab_container.cpp
index 23035a2c6b..cc46ade1b8 100644
--- a/editor/docks/dock_tab_container.cpp
+++ b/editor/docks/dock_tab_container.cpp
@@ -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);
+}
diff --git a/editor/docks/dock_tab_container.h b/editor/docks/dock_tab_container.h
index 6ed4cfa94e..89d21c797e 100644
--- a/editor/docks/dock_tab_container.h
+++ b/editor/docks/dock_tab_container.h
@@ -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);
+};
diff --git a/editor/docks/editor_dock.cpp b/editor/docks/editor_dock.cpp
index da333b3024..da05ce0364 100644
--- a/editor/docks/editor_dock.cpp
+++ b/editor/docks/editor_dock.cpp
@@ -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");
diff --git a/editor/docks/editor_dock.h b/editor/docks/editor_dock.h
index 9ad108a462..0032dac19e 100644
--- a/editor/docks/editor_dock.h
+++ b/editor/docks/editor_dock.h
@@ -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
};
diff --git a/editor/docks/editor_dock_manager.h b/editor/docks/editor_dock_manager.h
index e848bcc5e8..b6abb77d69 100644
--- a/editor/docks/editor_dock_manager.h
+++ b/editor/docks/editor_dock_manager.h
@@ -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;
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 3e008c26f6..1307d60331 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -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 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);