| 6073 | } |
| 6074 | |
| 6075 | bool ImGui::TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags) |
| 6076 | { |
| 6077 | if (flags & ImGuiTreeNodeFlags_Leaf) |
| 6078 | return true; |
| 6079 | |
| 6080 | // We only write to the tree storage if the user clicks (or explicitly use the SetNextItemOpen function) |
| 6081 | ImGuiContext& g = *GImGui; |
| 6082 | ImGuiWindow* window = g.CurrentWindow; |
| 6083 | ImGuiStorage* storage = window->DC.StateStorage; |
| 6084 | |
| 6085 | bool is_open; |
| 6086 | if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasOpen) |
| 6087 | { |
| 6088 | if (g.NextItemData.OpenCond & ImGuiCond_Always) |
| 6089 | { |
| 6090 | is_open = g.NextItemData.OpenVal; |
| 6091 | TreeNodeSetOpen(id, is_open); |
| 6092 | } |
| 6093 | else |
| 6094 | { |
| 6095 | // We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently. |
| 6096 | const int stored_value = storage->GetInt(id, -1); |
| 6097 | if (stored_value == -1) |
| 6098 | { |
| 6099 | is_open = g.NextItemData.OpenVal; |
| 6100 | TreeNodeSetOpen(id, is_open); |
| 6101 | } |
| 6102 | else |
| 6103 | { |
| 6104 | is_open = stored_value != 0; |
| 6105 | } |
| 6106 | } |
| 6107 | } |
| 6108 | else |
| 6109 | { |
| 6110 | is_open = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0; |
| 6111 | } |
| 6112 | |
| 6113 | // When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior). |
| 6114 | // NB- If we are above max depth we still allow manually opened nodes to be logged. |
| 6115 | if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && (window->DC.TreeDepth - g.LogDepthRef) < g.LogDepthToExpand) |
| 6116 | is_open = true; |
| 6117 | |
| 6118 | return is_open; |
| 6119 | } |
| 6120 | |
| 6121 | bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end) |
| 6122 | { |