mirror of
https://github.com/Drezil/imgui.git
synced 2025-07-06 13:08:47 +02:00
Split tree/collapsable into internal TreeNodeBehaviorIsOpened() helper (unsure..) (#282)
This commit is contained in:
54
imgui.cpp
54
imgui.cpp
@ -5304,24 +5304,13 @@ void ImGui::LogButtons()
|
||||
LogToClipboard(g.LogAutoExpandMaxDepth);
|
||||
}
|
||||
|
||||
bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display_frame, bool default_open)
|
||||
bool ImGui::TreeNodeBehaviorIsOpened(ImGuiID id, ImGuiTreeNodeFlags flags)
|
||||
{
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
if (window->SkipItems)
|
||||
return false;
|
||||
|
||||
ImGuiState& g = *GImGui;
|
||||
const ImGuiStyle& style = g.Style;
|
||||
|
||||
IM_ASSERT(str_id != NULL || label != NULL);
|
||||
if (str_id == NULL)
|
||||
str_id = label;
|
||||
if (label == NULL)
|
||||
label = str_id;
|
||||
const ImGuiID id = window->GetID(str_id);
|
||||
|
||||
// We only write to the tree storage if the user clicks (or explicitely use SetNextTreeNode*** functions)
|
||||
ImGuiState& g = *GImGui;
|
||||
ImGuiWindow* window = g.CurrentWindow;
|
||||
ImGuiStorage* storage = window->DC.StateStorage;
|
||||
|
||||
bool opened;
|
||||
if (g.SetNextTreeNodeOpenedCond != 0)
|
||||
{
|
||||
@ -5348,9 +5337,33 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
|
||||
}
|
||||
else
|
||||
{
|
||||
opened = storage->GetInt(id, default_open) != 0;
|
||||
opened = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0;
|
||||
}
|
||||
|
||||
// When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior).
|
||||
// NB- If we are above max depth we still allow manually opened nodes to be logged.
|
||||
if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoExpandOnLog) && window->DC.TreeDepth < g.LogAutoExpandMaxDepth)
|
||||
opened = true;
|
||||
|
||||
return opened;
|
||||
}
|
||||
|
||||
bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display_frame, bool default_open)
|
||||
{
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
if (window->SkipItems)
|
||||
return false;
|
||||
|
||||
ImGuiState& g = *GImGui;
|
||||
const ImGuiStyle& style = g.Style;
|
||||
|
||||
IM_ASSERT(str_id != NULL || label != NULL);
|
||||
if (str_id == NULL)
|
||||
str_id = label;
|
||||
if (label == NULL)
|
||||
label = str_id;
|
||||
const ImGuiID id = window->GetID(str_id);
|
||||
|
||||
// Framed header expand a little outside the default padding
|
||||
const ImVec2 window_padding = window->WindowPadding;
|
||||
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
||||
@ -5368,12 +5381,9 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
|
||||
const ImRect text_bb(bb.Min, bb.Min + ImVec2(collapser_width + style.FramePadding.x*2*0 + (label_size.x > 0.0f ? label_size.x : 0.0f), label_size.y));
|
||||
ItemSize(ImVec2(text_bb.GetSize().x, bb.GetSize().y), display_frame ? style.FramePadding.y : 0.0f);
|
||||
|
||||
// When logging is enabled, if automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior).
|
||||
// NB- If we are above max depth we still allow manually opened nodes to be logged.
|
||||
if (g.LogEnabled && !display_frame && window->DC.TreeDepth < g.LogAutoExpandMaxDepth)
|
||||
opened = true;
|
||||
|
||||
const ImRect interact_bb = display_frame ? bb : ImRect(text_bb.Min, text_bb.Max + ImVec2(style.FramePadding.x*2,0.0f)); // FIXME
|
||||
bool opened = TreeNodeBehaviorIsOpened(id, (default_open ? ImGuiTreeNodeFlags_DefaultOpen : 0) | (display_frame ? ImGuiTreeNodeFlags_NoAutoExpandOnLog : 0));
|
||||
|
||||
if (!ItemAdd(bb, &id))
|
||||
//if (!ItemAdd(interact_bb, &id)) // Correct but would prevent user from accessing rendered bb which may be of use
|
||||
return opened;
|
||||
@ -5383,7 +5393,7 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
|
||||
if (pressed)
|
||||
{
|
||||
opened = !opened;
|
||||
storage->SetInt(id, opened);
|
||||
window->DC.StateStorage->SetInt(id, opened);
|
||||
}
|
||||
|
||||
// Render
|
||||
|
Reference in New Issue
Block a user