|
@@ -9916,6 +9916,7 @@ namespace ImGui
|
|
static void DockNodeTreeUpdatePosSize(ImGuiDockNode* node, ImVec2 pos, ImVec2 size);
|
|
static void DockNodeTreeUpdatePosSize(ImGuiDockNode* node, ImVec2 pos, ImVec2 size);
|
|
static void DockNodeTreeUpdateSplitter(ImGuiDockNode* node);
|
|
static void DockNodeTreeUpdateSplitter(ImGuiDockNode* node);
|
|
static ImGuiDockNode* DockNodeTreeFindNodeByPos(ImGuiDockNode* node, ImVec2 pos);
|
|
static ImGuiDockNode* DockNodeTreeFindNodeByPos(ImGuiDockNode* node, ImVec2 pos);
|
|
|
|
+ static ImGuiDockNode* DockNodeTreeFindFallbackLeafNode(ImGuiDockNode* node);
|
|
|
|
|
|
// Settings
|
|
// Settings
|
|
static void DockSettingsMoveDockReferencesInInactiveWindow(ImGuiID old_dock_id, ImGuiID new_dock_id);
|
|
static void DockSettingsMoveDockReferencesInInactiveWindow(ImGuiID old_dock_id, ImGuiID new_dock_id);
|
|
@@ -11399,11 +11400,20 @@ static bool ImGui::DockNodePreviewDockCalc(ImGuiWindow* host_window, ImGuiDockNo
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
IM_ASSERT(g.CurrentWindow == host_window); // Because we rely on font size to calculate tab sizes
|
|
IM_ASSERT(g.CurrentWindow == host_window); // Because we rely on font size to calculate tab sizes
|
|
|
|
|
|
|
|
+ // There is an edge case when docking into a dockspace which only has inactive nodes.
|
|
|
|
+ // In this case DockNodeTreeFindNodeByPos() will have selected a leaf node which is inactive.
|
|
|
|
+ // Because the inactive leaf node doesn't have proper pos/size yet, we'll use the root node as reference.
|
|
|
|
+ ImGuiDockNode* ref_node_for_rect = (host_node && !host_node->IsVisible) ? DockNodeGetRootNode(host_node) : host_node;
|
|
|
|
+ if (ref_node_for_rect)
|
|
|
|
+ IM_ASSERT(ref_node_for_rect->IsVisible);
|
|
|
|
+
|
|
|
|
+ // Build a tentative future node (reuse same structure because it is practical)
|
|
data->FutureNode.HasCloseButton = (host_node ? host_node->HasCloseButton : host_window->HasCloseButton) || (root_payload->HasCloseButton);
|
|
data->FutureNode.HasCloseButton = (host_node ? host_node->HasCloseButton : host_window->HasCloseButton) || (root_payload->HasCloseButton);
|
|
data->FutureNode.HasCollapseButton = host_node ? true : ((host_window->Flags & ImGuiWindowFlags_NoCollapse) == 0);
|
|
data->FutureNode.HasCollapseButton = host_node ? true : ((host_window->Flags & ImGuiWindowFlags_NoCollapse) == 0);
|
|
- data->FutureNode.Pos = host_node ? host_node->Pos : host_window->Pos;
|
|
|
|
- data->FutureNode.Size = host_node ? host_node->Size : host_window->Size;
|
|
|
|
|
|
+ data->FutureNode.Pos = host_node ? ref_node_for_rect->Pos : host_window->Pos;
|
|
|
|
+ data->FutureNode.Size = host_node ? ref_node_for_rect->Size : host_window->Size;
|
|
|
|
|
|
|
|
+ // Figure out here we are allowed to dock
|
|
const bool src_is_visibly_splitted = root_payload->DockNodeAsHost && root_payload->DockNodeAsHost->IsSplitNode() && (root_payload->DockNodeAsHost->OnlyNodeWithWindows == NULL);
|
|
const bool src_is_visibly_splitted = root_payload->DockNodeAsHost && root_payload->DockNodeAsHost->IsSplitNode() && (root_payload->DockNodeAsHost->OnlyNodeWithWindows == NULL);
|
|
data->IsCenterAvailable = !is_outer_docking;
|
|
data->IsCenterAvailable = !is_outer_docking;
|
|
if (src_is_visibly_splitted && (!host_node || !host_node->IsEmpty()))
|
|
if (src_is_visibly_splitted && (!host_node || !host_node->IsEmpty()))
|
|
@@ -11837,6 +11847,17 @@ void ImGui::DockNodeTreeUpdateSplitter(ImGuiDockNode* node)
|
|
DockNodeTreeUpdateSplitter(child_1);
|
|
DockNodeTreeUpdateSplitter(child_1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ImGuiDockNode* ImGui::DockNodeTreeFindFallbackLeafNode(ImGuiDockNode* node)
|
|
|
|
+{
|
|
|
|
+ if (node->IsLeafNode())
|
|
|
|
+ return node;
|
|
|
|
+ if (ImGuiDockNode* leaf_node = DockNodeTreeFindFallbackLeafNode(node->ChildNodes[0]))
|
|
|
|
+ return leaf_node;
|
|
|
|
+ if (ImGuiDockNode* leaf_node = DockNodeTreeFindFallbackLeafNode(node->ChildNodes[1]))
|
|
|
|
+ return leaf_node;
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
ImGuiDockNode* ImGui::DockNodeTreeFindNodeByPos(ImGuiDockNode* node, ImVec2 pos)
|
|
ImGuiDockNode* ImGui::DockNodeTreeFindNodeByPos(ImGuiDockNode* node, ImVec2 pos)
|
|
{
|
|
{
|
|
if (!node->IsVisible)
|
|
if (!node->IsVisible)
|
|
@@ -11856,6 +11877,16 @@ ImGuiDockNode* ImGui::DockNodeTreeFindNodeByPos(ImGuiDockNode* node, ImVec2 pos)
|
|
return hovered_node;
|
|
return hovered_node;
|
|
if (ImGuiDockNode* hovered_node = DockNodeTreeFindNodeByPos(node->ChildNodes[1], pos))
|
|
if (ImGuiDockNode* hovered_node = DockNodeTreeFindNodeByPos(node->ChildNodes[1], pos))
|
|
return hovered_node;
|
|
return hovered_node;
|
|
|
|
+
|
|
|
|
+ // There is an edge case when docking into a dockspace which only has inactive nodes (because none of the windows are active)
|
|
|
|
+ // In this case we need to fallback into any leaf mode, possibly the central node.
|
|
|
|
+ if (node->IsDockSpace && node->IsRootNode())
|
|
|
|
+ {
|
|
|
|
+ if (node->CentralNode && node->IsLeafNode()) // FIXME-20181220: We should not have to test for IsLeafNode() here but we have another bug to fix first.
|
|
|
|
+ return node->CentralNode;
|
|
|
|
+ return DockNodeTreeFindFallbackLeafNode(node);
|
|
|
|
+ }
|
|
|
|
+
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|