| 5894 | } |
| 5895 | |
| 5896 | bool ImGui::TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags) |
| 5897 | { |
| 5898 | if (flags & ImGuiTreeNodeFlags_Leaf) |
| 5899 | return true; |
| 5900 | |
| 5901 | // We only write to the tree storage if the user clicks (or explicitly use the SetNextItemOpen function) |
| 5902 | ImGuiContext& g = *GImGui; |
| 5903 | ImGuiWindow* window = g.CurrentWindow; |
| 5904 | ImGuiStorage* storage = window->DC.StateStorage; |
| 5905 | |
| 5906 | bool is_open; |
| 5907 | if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasOpen) |
| 5908 | { |
| 5909 | if (g.NextItemData.OpenCond & ImGuiCond_Always) |
| 5910 | { |
| 5911 | is_open = g.NextItemData.OpenVal; |
| 5912 | TreeNodeSetOpen(id, is_open); |
| 5913 | } |
| 5914 | else |
| 5915 | { |
| 5916 | // We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently. |
| 5917 | const int stored_value = storage->GetInt(id, -1); |
| 5918 | if (stored_value == -1) |
| 5919 | { |
| 5920 | is_open = g.NextItemData.OpenVal; |
| 5921 | TreeNodeSetOpen(id, is_open); |
| 5922 | } |
| 5923 | else |
| 5924 | { |
| 5925 | is_open = stored_value != 0; |
| 5926 | } |
| 5927 | } |
| 5928 | } |
| 5929 | else |
| 5930 | { |
| 5931 | is_open = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0; |
| 5932 | } |
| 5933 | |
| 5934 | // When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior). |
| 5935 | // NB- If we are above max depth we still allow manually opened nodes to be logged. |
| 5936 | if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && (window->DC.TreeDepth - g.LogDepthRef) < g.LogDepthToExpand) |
| 5937 | is_open = true; |
| 5938 | |
| 5939 | return is_open; |
| 5940 | } |
| 5941 | |
| 5942 | bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end) |
| 5943 | { |