|
@@ -6410,6 +6410,9 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiID storage_id, ImGuiTreeNodeFlags
|
|
|
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 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiID storage_id, ImGuiTreeNodeFlags
|
|
|
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 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiID storage_id, ImGuiTreeNodeFlags
|
|
|
}
|
|
|
|
|
|
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,52 +6565,54 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiID storage_id, ImGuiTreeNodeFlags
|
|
|
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("###", "###");
|
|
|
+ }
|
|
|
+ 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);
|
|
|
}
|
|
|
- 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();
|
|
|
+ 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);
|
|
|
+ // 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()
|