|
17 | 17 | /////////////////////////////////////////////////////////////////////////////// |
18 | 18 |
|
19 | 19 | #include "WindowRegistry.hpp" |
| 20 | +#include "Logger.hpp" |
| 21 | +#include <imgui_internal.h> |
20 | 22 |
|
21 | 23 | namespace nexo::editor { |
22 | 24 |
|
@@ -93,4 +95,38 @@ namespace nexo::editor { |
93 | 95 | } |
94 | 96 | } |
95 | 97 | } |
| 98 | + |
| 99 | + bool WindowRegistry::splitDockAndAttachWindow( |
| 100 | + const std::string& sourceWindowName, |
| 101 | + const std::string& newWindowName, |
| 102 | + const ImGuiDir splitDirection, |
| 103 | + const float splitRatio) |
| 104 | + { |
| 105 | + const ImGuiWindow* sourceImGuiWindow = ImGui::FindWindowByName(sourceWindowName.c_str()); |
| 106 | + |
| 107 | + if (!sourceImGuiWindow || !sourceImGuiWindow->DockId) |
| 108 | + { |
| 109 | + LOG(NEXO_WARN, "Cannot split dock: source window '{}' not found or not docked", sourceWindowName); |
| 110 | + return false; |
| 111 | + } |
| 112 | + |
| 113 | + const ImGuiID sourceDockId = sourceImGuiWindow->DockId; |
| 114 | + ImGuiID newNode, remainingNode; |
| 115 | + |
| 116 | + if (!ImGui::DockBuilderSplitNode(sourceDockId, splitDirection, splitRatio, &newNode, &remainingNode)) |
| 117 | + { |
| 118 | + LOG(NEXO_WARN, "Failed to split dock node for window '{}'", sourceWindowName); |
| 119 | + return false; |
| 120 | + } |
| 121 | + |
| 122 | + ImGui::DockBuilderDockWindow(sourceWindowName.c_str(), remainingNode); |
| 123 | + ImGui::DockBuilderDockWindow(newWindowName.c_str(), newNode); |
| 124 | + ImGui::DockBuilderFinish(sourceDockId); |
| 125 | + |
| 126 | + m_dockingRegistry.setDockId(sourceWindowName, remainingNode); |
| 127 | + m_dockingRegistry.setDockId(newWindowName, newNode); |
| 128 | + |
| 129 | + LOG(NEXO_DEBUG, "Successfully split dock for '{}' and attached '{}'", sourceWindowName, newWindowName); |
| 130 | + return true; |
| 131 | + } |
96 | 132 | } |
0 commit comments