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);