MCPcopy Create free account
hub / github.com/VictorGordan/opengl-tutorials / TreeNodeBehavior

Method TreeNodeBehavior

ImGUI GLFW Tutorial/imgui/imgui_widgets.cpp:5702–5887  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5700}
5701
5702bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end)
5703{
5704 ImGuiWindow* window = GetCurrentWindow();
5705 if (window->SkipItems)
5706 return false;
5707
5708 ImGuiContext& g = *GImGui;
5709 const ImGuiStyle& style = g.Style;
5710 const bool display_frame = (flags & ImGuiTreeNodeFlags_Framed) != 0;
5711 const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, ImMin(window->DC.CurrLineTextBaseOffset, style.FramePadding.y));
5712
5713 if (!label_end)
5714 label_end = FindRenderedTextEnd(label);
5715 const ImVec2 label_size = CalcTextSize(label, label_end, false);
5716
5717 // We vertically grow up to current line height up the typical widget height.
5718 const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), label_size.y + padding.y * 2);
5719 ImRect frame_bb;
5720 frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x;
5721 frame_bb.Min.y = window->DC.CursorPos.y;
5722 frame_bb.Max.x = window->WorkRect.Max.x;
5723 frame_bb.Max.y = window->DC.CursorPos.y + frame_height;
5724 if (display_frame)
5725 {
5726 // Framed header expand a little outside the default padding, to the edge of InnerClipRect
5727 // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f)
5728 frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f);
5729 frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f);
5730 }
5731
5732 const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapser arrow width + Spacing
5733 const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it
5734 const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x * 2 : 0.0f); // Include collapser
5735 ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y);
5736 ItemSize(ImVec2(text_width, frame_height), padding.y);
5737
5738 // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing
5739 ImRect interact_bb = frame_bb;
5740 if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0)
5741 interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f;
5742
5743 // Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child.
5744 // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop().
5745 // This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero.
5746 const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0;
5747 bool is_open = TreeNodeBehaviorIsOpen(id, flags);
5748 if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
5749 window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth);
5750
5751 bool item_add = ItemAdd(interact_bb, id);
5752 window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HasDisplayRect;
5753 window->DC.LastItemDisplayRect = frame_bb;
5754
5755 if (!item_add)
5756 {
5757 if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
5758 TreePushOverrideID(id);
5759 IMGUI_TEST_ENGINE_ITEM_INFO(window->DC.LastItemId, label, window->DC.LastItemStatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0));

Callers

nothing calls this directly

Calls 7

GetCurrentWindowFunction · 0.70
ImVec2Function · 0.70
ImMinFunction · 0.70
ImMaxFunction · 0.70
RenderBulletFunction · 0.70
RenderArrowFunction · 0.70
SetIntMethod · 0.45

Tested by

no test coverage detected