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

@@ -673,8 +673,15 @@ void EditorDockManager::save_docks_to_config(Ref<ConfigFile> p_layout, const Str
}
}
for (int i = 0; i < hsplits.size(); i++) {
p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), int(hsplits[i]->get_split_offset() / EDSCALE));
PackedInt32Array split_offsets = main_hsplit->get_split_offsets();
int index = 0;
for (int i = 0; i < vsplits.size(); i++) {
int value = 0;
if (vsplits[i]->is_visible() && index < split_offsets.size()) {
value = split_offsets[index] / EDSCALE;
index++;
}
p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), value);
}
}
@@ -755,21 +762,22 @@ void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const S
}
// Load SplitContainer offsets.
PackedInt32Array offsets;
for (int i = 0; i < vsplits.size(); i++) {
if (!p_layout->has_section_key(p_section, "dock_split_" + itos(i + 1))) {
continue;
}
int ofs = p_layout->get_value(p_section, "dock_split_" + itos(i + 1));
vsplits[i]->set_split_offset(ofs);
}
for (int i = 0; i < hsplits.size(); i++) {
if (!p_layout->has_section_key(p_section, "dock_hsplit_" + itos(i + 1))) {
continue;
// Only visible ones need a split offset for the main hsplit, even though they all have a value saved.
if (vsplits[i]->is_visible() && p_layout->has_section_key(p_section, "dock_hsplit_" + itos(i + 1))) {
int offset = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1));
offsets.push_back(offset * EDSCALE);
}
int ofs = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1));
hsplits[i]->set_split_offset(ofs * EDSCALE);
}
main_hsplit->set_split_offsets(offsets);
update_docks_menu();
}
@@ -942,8 +950,8 @@ void EditorDockManager::add_vsplit(DockSplitContainer *p_split) {
p_split->connect("dragged", callable_mp(this, &EditorDockManager::_dock_split_dragged));
}
void EditorDockManager::add_hsplit(DockSplitContainer *p_split) {
hsplits.push_back(p_split);
void EditorDockManager::set_hsplit(DockSplitContainer *p_split) {
main_hsplit = p_split;
p_split->connect("dragged", callable_mp(this, &EditorDockManager::_dock_split_dragged));
}
@@ -983,10 +991,6 @@ void EditorDockManager::register_dock_slot(DockConstants::DockSlot p_dock_slot,
slot.drag_hint->set_slot(p_dock_slot);
}
int EditorDockManager::get_hsplit_count() const {
return hsplits.size();
}
int EditorDockManager::get_vsplit_count() const {
return vsplits.size();
}

View File

@@ -86,7 +86,7 @@ private:
// To access splits easily by index.
Vector<DockSplitContainer *> vsplits;
Vector<DockSplitContainer *> hsplits;
DockSplitContainer *main_hsplit = nullptr;
struct DockSlot {
TabContainer *container = nullptr;
@@ -133,9 +133,8 @@ public:
void set_tab_icon_max_width(int p_max_width);
void add_vsplit(DockSplitContainer *p_split);
void add_hsplit(DockSplitContainer *p_split);
void set_hsplit(DockSplitContainer *p_split);
void register_dock_slot(DockConstants::DockSlot p_dock_slot, TabContainer *p_tab_container, DockConstants::DockLayout p_layout);
int get_hsplit_count() const;
int get_vsplit_count() const;
PopupMenu *get_docks_menu();