Internals, TreeNode: indent all render block into its own scope (aim is to add a is_visible test there later)
diff --git a/imgui.cpp b/imgui.cpp
index c7b83d8..52fa2f1 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -12048,6 +12048,7 @@
{
ImGuiContext& g = *GImGui;
IM_ASSERT(g.NavWindow != NULL);
+ //IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequestSubmit: dir %c, window \"%s\"\n", "-WENS"[move_dir + 1], g.NavWindow->Name);
if (move_flags & ImGuiNavMoveFlags_IsTabbing)
move_flags |= ImGuiNavMoveFlags_AllowCurrentNavId;
diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp
index 9a63a59..70ff174 100644
--- a/imgui_widgets.cpp
+++ b/imgui_widgets.cpp
@@ -6410,6 +6410,9 @@
if ((flags & (ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_SpanTextWidth | ImGuiTreeNodeFlags_SpanAllColumns)) == 0)
interact_bb.Max.x = frame_bb.Min.x + text_width + (label_size.x > 0.0f ? style.ItemSpacing.x * 2.0f : 0.0f);
+ // Compute open and multi-select states before ItemAdd() as it clear NextItem data.
+ bool is_open = TreeNodeUpdateNextOpen(storage_id, flags);
+
// Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackgroundChannel for every Selectable..
const float backup_clip_rect_min_x = window->ClipRect.Min.x;
const float backup_clip_rect_max_x = window->ClipRect.Max.x;
@@ -6418,18 +6421,14 @@
window->ClipRect.Min.x = window->ParentWorkRect.Min.x;
window->ClipRect.Max.x = window->ParentWorkRect.Max.x;
}
-
- // Compute open and multi-select states before ItemAdd() as it clear NextItem data.
- bool is_open = TreeNodeUpdateNextOpen(storage_id, flags);
- bool item_add = ItemAdd(interact_bb, id);
- g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDisplayRect;
- g.LastItemData.DisplayRect = frame_bb;
-
+ const bool is_visible = ItemAdd(interact_bb, id);
if (span_all_columns)
{
window->ClipRect.Min.x = backup_clip_rect_min_x;
window->ClipRect.Max.x = backup_clip_rect_max_x;
}
+ g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDisplayRect;
+ g.LastItemData.DisplayRect = frame_bb;
// If a NavLeft request is happening and ImGuiTreeNodeFlags_NavLeftJumpsBackHere enabled:
// Store data for the current depth to allow returning to this node from any child item.
@@ -6444,7 +6443,7 @@
}
const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0;
- if (!item_add)
+ if (!is_visible)
{
if (store_tree_node_stack_data && is_open)
TreeNodeStoreStackData(flags); // Call before TreePushOverrideID()
@@ -6566,53 +6565,55 @@
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection;
// Render
- const ImU32 text_col = GetColorU32(ImGuiCol_Text);
- ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_Compact;
- if (is_multi_select)
- nav_highlight_flags |= ImGuiNavHighlightFlags_AlwaysDraw; // Always show the nav rectangle
- if (display_frame)
{
- // Framed type
- const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
- RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding);
- RenderNavHighlight(frame_bb, id, nav_highlight_flags);
- if (flags & ImGuiTreeNodeFlags_Bullet)
- RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col);
- else if (!is_leaf)
- RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 1.0f);
- else // Leaf without bullet, left-adjusted text
- text_pos.x -= text_offset_x -padding.x;
- if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton)
- frame_bb.Max.x -= g.FontSize + style.FramePadding.x;
- if (g.LogEnabled)
- LogSetNextTextDecoration("###", "###");
- }
- else
- {
- // Unframed typed for tree nodes
- if (hovered || selected)
+ const ImU32 text_col = GetColorU32(ImGuiCol_Text);
+ ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_Compact;
+ if (is_multi_select)
+ nav_highlight_flags |= ImGuiNavHighlightFlags_AlwaysDraw; // Always show the nav rectangle
+ if (display_frame)
{
+ // Framed type
const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
- RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false);
+ RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding);
+ RenderNavHighlight(frame_bb, id, nav_highlight_flags);
+ if (flags & ImGuiTreeNodeFlags_Bullet)
+ RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col);
+ else if (!is_leaf)
+ RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 1.0f);
+ else // Leaf without bullet, left-adjusted text
+ text_pos.x -= text_offset_x - padding.x;
+ if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton)
+ frame_bb.Max.x -= g.FontSize + style.FramePadding.x;
+ if (g.LogEnabled)
+ LogSetNextTextDecoration("###", "###");
}
- RenderNavHighlight(frame_bb, id, nav_highlight_flags);
- if (flags & ImGuiTreeNodeFlags_Bullet)
- RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col);
- else if (!is_leaf)
- RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 0.70f);
- if (g.LogEnabled)
- LogSetNextTextDecoration(">", NULL);
+ else
+ {
+ // Unframed typed for tree nodes
+ if (hovered || selected)
+ {
+ const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false);
+ }
+ RenderNavHighlight(frame_bb, id, nav_highlight_flags);
+ if (flags & ImGuiTreeNodeFlags_Bullet)
+ RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col);
+ else if (!is_leaf)
+ RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 0.70f);
+ if (g.LogEnabled)
+ LogSetNextTextDecoration(">", NULL);
+ }
+
+ if (span_all_columns)
+ TablePopBackgroundChannel();
+
+ // Label
+ if (display_frame)
+ RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size);
+ else
+ RenderText(text_pos, label, label_end, false);
}
- if (span_all_columns)
- TablePopBackgroundChannel();
-
- // Label
- if (display_frame)
- RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size);
- else
- RenderText(text_pos, label, label_end, false);
-
if (store_tree_node_stack_data && is_open)
TreeNodeStoreStackData(flags); // Call before TreePushOverrideID()
if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))