Skip to content

Commit 9764adc

Browse files
committed
Docking: Amend 24dfebf. Fixed incorrect focus highlight on docking node with nested hierarchies.
1 parent 5067173 commit 9764adc

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

imgui.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6325,7 +6325,7 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags
63256325
}
63266326
if (parent_window && (flags & ImGuiWindowFlags_Popup))
63276327
window->RootWindowPopupTree = parent_window->RootWindowPopupTree;
6328-
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)))
6328+
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup))) // FIXME: simply use _NoTitleBar ?
63296329
window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
63306330
while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened)
63316331
{
@@ -15293,6 +15293,21 @@ void ImGui::DockNodeEndAmendTabBar()
1529315293
End();
1529415294
}
1529515295

15296+
static bool IsDockNodeTitleBarHighlighted(ImGuiDockNode* node, ImGuiDockNode* root_node, ImGuiWindow* host_window)
15297+
{
15298+
// CTRL+Tab highlight (only highlighting leaf node, not whole hierarchy)
15299+
ImGuiContext& g = *GImGui;
15300+
if (g.NavWindowingTarget)
15301+
return (g.NavWindowingTarget->DockNode == node);
15302+
15303+
// FIXME-DOCKING: May want alternative to treat central node void differently? e.g. if (g.NavWindow == host_window)
15304+
if (g.NavWindow && g.NavWindow->RootWindowForTitleBarHighlight == host_window->RootWindowDockTree && root_node->LastFocusedNodeId == node->ID)
15305+
for (ImGuiDockNode* parent_node = g.NavWindow->RootWindow->DockNode; parent_node != NULL; parent_node = parent_node->HostWindow ? parent_node->HostWindow->RootWindow->DockNode : NULL)
15306+
if ((parent_node = ImGui::DockNodeGetRootNode(parent_node)) == root_node)
15307+
return true;
15308+
return false;
15309+
}
15310+
1529615311
// Submit the tab bar corresponding to a dock node and various housekeeping details.
1529715312
static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_window)
1529815313
{
@@ -15308,14 +15323,8 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
1530815323
// Decide if we should use a focused title bar color
1530915324
bool is_focused = false;
1531015325
ImGuiDockNode* root_node = DockNodeGetRootNode(node);
15311-
if (g.NavWindowingTarget)
15312-
is_focused = (g.NavWindowingTarget->DockNode == node);
15313-
else if (g.NavWindow && g.NavWindow->RootWindowForTitleBarHighlight == host_window->RootWindowDockTree && root_node->LastFocusedNodeId == node->ID)
15314-
{
15315-
// FIXME-DOCKING: May want alternative to treat central node void differently? e.g. if (g.NavWindow == host_window)
15316-
if (g.NavWindow->DockNode && DockNodeIsInHierarchyOf(g.NavWindow->DockNode, root_node)) // Omit child windows injected in window hierarchy
15317-
is_focused = true;
15318-
}
15326+
if (IsDockNodeTitleBarHighlighted(node, root_node, host_window))
15327+
is_focused = true;
1531915328

1532015329
// Hidden tab bar will show a triangle on the upper-left (in Begin)
1532115330
if (node->IsHiddenTabBar() || node->IsNoTabBar())

0 commit comments

Comments
 (0)