From 8c977bf7b3a74ac3a9bea4ad003676ffd2a3d940 Mon Sep 17 00:00:00 2001 From: ocornut Date: Thu, 10 Apr 2025 16:26:38 +0200 Subject: [PATCH] TreeNode, Tables: fixed ImGuiTreeNodeFlags_DrawLinesXXX feature when TreePop() is called in table: in no column or at top of row. (#2920) --- docs/CHANGELOG.txt | 9 +++++++-- imgui_tables.cpp | 2 +- imgui_widgets.cpp | 5 ++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 5ab36ed18..1e6766842 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -55,8 +55,8 @@ Other changes: - Windows: loosened code to allow hovering of resize grips, borders, and table borders while hovering a sibling child window, so that the code in master matches one in docking (they accidentally diverged). (#8554) -- TreeNode: added flags to draw tree hierarchy outlines linking parent - and tree nodes: (#2920) +- TreeNode: added experimental flags to draw tree hierarchy outlines linking + parent and tree nodes: (#2920) - ImGuiTreeNodeFlags_DrawLinesNone: No lines drawn (default value in style.TreeLinesFlags). - ImGuiTreeNodeFlags_DrawLinesFull: Horizontal lines to child nodes. Vertical line drawn down to TreePop() position: cover full contents. - ImGuiTreeNodeFlags_DrawLinesToNodes: Horizontal lines to child nodes. Vertical line drawn down to bottom-most child node. @@ -69,6 +69,11 @@ Other changes: nodes in unusual ways, using indent to create tree-looking structures, etc.) and the feature may not accurately represent them in every cases. - The feature adds a little cost as extra data needs to be stored. + (ImGuiTreeNodeFlags_DrawLinesToNodes is slower than ImGuiTreeNodeFlags_DrawLinesFull + which may be meaningful on very large trees, as it needs to record bottom-most + Y position even for clipped nodes). + - The feature is unlikely to ever work properly when using a coarse clipper + such as ImGuiListClipper. - TreeNode: fixed incorrect clipping of arrow/bullet when using ImGuiTreeNodeFlags_SpanAllColumns. - Nav: fixed assertion when holding gamepad FaceLeft/West button to open CTRL+Tab windowing + pressing a keyboard key. (#8525) diff --git a/imgui_tables.cpp b/imgui_tables.cpp index 6d4d673a1..b8b869301 100644 --- a/imgui_tables.cpp +++ b/imgui_tables.cpp @@ -2494,7 +2494,7 @@ void ImGui::TablePopColumnChannel() ImGuiTable* table = g.CurrentTable; // Optimization: avoid PopClipRect() + SetCurrentChannel() - if (table->Flags & ImGuiTableFlags_NoClip) + if ((table->Flags & ImGuiTableFlags_NoClip) || (table->CurrentColumn == -1)) // Calling TreePop() after TableNextRow() is supported. return; ImGuiWindow* window = g.CurrentWindow; const ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 42741b227..6933fdcb6 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -6919,7 +6919,10 @@ void ImGui::TreePop() float y2 = data->DrawLinesToNodesY2; if (data->TreeFlags & ImGuiTreeNodeFlags_DrawLinesFull) { - float y2_full = ImTrunc(window->DC.CursorPos.y - g.Style.ItemSpacing.y - g.FontSize * 0.5f); + float y2_full = window->DC.CursorPos.y; + if (g.CurrentTable) + y2_full = ImMax(g.CurrentTable->RowPosY2, y2_full); + y2_full = ImTrunc(y2_full - g.Style.ItemSpacing.y - g.FontSize * 0.5f); if (y2 + g.Style.ItemSpacing.y < y2_full) // FIXME: threshold to use ToNodes Y2 instead of Full Y2 when close by ItemSpacing.y y2 = y2_full; }