Added SetNextTreeNodeOpened() with optional condition flag in replacement of OpenNextNode()

This commit is contained in:
ocornut 2015-02-27 09:38:22 +00:00
parent ea17240b96
commit 2177b11682
2 changed files with 39 additions and 15 deletions

View File

@ -129,6 +129,7 @@
Occasionally introducing changes that are breaking the API. The breakage are generally minor and easy to fix.
Here is a change-log of API breaking changes, if you are using one of the functions listed, expect to have to fix some code.
- 2015/02/27 (1.34) - renamed OpenNextNode(bool) to SetNextTreeNodeOpened(bool, ImGuiSetCondition), kept inline redirection function
- 2015/02/11 (1.32) - changed text input callback ImGuiTextEditCallback return type from void-->int. reserved for future use, return 0 for now.
- 2015/02/10 (1.32) - renamed GetItemWidth() to CalcItemWidth() to clarify its evolving behavior
- 2015/02/08 (1.31) - renamed GetTextLineSpacing() to GetTextLineHeightWithSpacing()
@ -289,7 +290,6 @@
- text edit: flag to disable live update of the user buffer.
- text edit: field resize behavior - field could stretch when being edited? hover tooltip shows more text?
- text edit: add multi-line text edit
- tree: reformulate OpenNextNode() into SetNextWindowCollapsed() api
- tree: add treenode/treepush int variants? because (void*) cast from int warns on some platforms/settings
- settings: write more decent code to allow saving/loading new fields
- settings: api for per-tool simple persistent data (bool,int,float) in .ini file
@ -889,7 +889,6 @@ struct ImGuiDrawContext
ImVector<float> TextWrapPos;
ImGuiColorEditMode ColorEditMode;
ImGuiStorage* StateStorage;
int OpenNextNode; // FIXME: Reformulate this feature like SetNextWindowCollapsed() API
float ColumnsStartX; // Start position from left of window (increased by TreePush/TreePop, etc.)
float ColumnsOffsetX; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
@ -912,7 +911,6 @@ struct ImGuiDrawContext
LastItemAabb = ImGuiAabb(0.0f,0.0f,0.0f,0.0f);
LastItemHovered = false;
StateStorage = NULL;
OpenNextNode = -1;
ColumnsStartX = 0.0f;
ColumnsOffsetX = 0.0f;
@ -999,6 +997,7 @@ struct ImGuiState
ImVector<ImGuiColMod> ColorModifiers;
ImVector<ImGuiStyleMod> StyleModifiers;
ImVector<ImFont*> FontStack;
ImVec2 SetNextWindowPosVal;
ImGuiSetCondition SetNextWindowPosCond;
ImVec2 SetNextWindowSizeVal;
@ -1006,6 +1005,8 @@ struct ImGuiState
bool SetNextWindowCollapsedVal;
ImGuiSetCondition SetNextWindowCollapsedCond;
bool SetNextWindowFocus;
bool SetNextTreeNodeOpenedVal;
ImGuiSetCondition SetNextTreeNodeOpenedCond;
// Render
ImVector<ImDrawList*> RenderDrawLists;
@ -1051,6 +1052,7 @@ struct ImGuiState
ActiveIdIsAlive = false;
ActiveIdIsFocusedOnly = false;
SettingsDirtyTimer = 0.0f;
SetNextWindowPosVal = ImVec2(0.0f, 0.0f);
SetNextWindowPosCond = 0;
SetNextWindowSizeVal = ImVec2(0.0f, 0.0f);
@ -1058,6 +1060,8 @@ struct ImGuiState
SetNextWindowCollapsedVal = false;
SetNextWindowCollapsedCond = 0;
SetNextWindowFocus = false;
SetNextTreeNodeOpenedVal = false;
SetNextTreeNodeOpenedCond = 0;
SliderAsInputTextId = 0;
ActiveComboID = 0;
@ -3035,7 +3039,6 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size, float bg
window->DC.ColumnsCellMinY = window->DC.ColumnsCellMaxY = window->DC.ColumnsStartPos.y;
window->DC.TreeDepth = 0;
window->DC.StateStorage = &window->StateStorage;
window->DC.OpenNextNode = -1;
// Reset contents size for auto-fitting
window->SizeContentsFit = ImVec2(0.0f, 0.0f);
@ -4204,7 +4207,7 @@ void ImGui::LogButtons()
LogToClipboard(g.LogAutoExpandMaxDepth);
}
bool ImGui::CollapsingHeader(const char* label, const char* str_id, const bool display_frame, const bool default_open)
bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display_frame, bool default_open)
{
ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
@ -4220,14 +4223,31 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, const bool d
label = str_id;
const ImGuiID id = window->GetID(str_id);
// We only write to the tree storage if the user clicks
// We only write to the tree storage if the user clicks (or explicitely use SetNextTreeNode*** functions)
ImGuiStorage* storage = window->DC.StateStorage;
bool opened;
if (window->DC.OpenNextNode != -1)
if (g.SetNextTreeNodeOpenedCond != 0)
{
opened = window->DC.OpenNextNode > 0;
if (g.SetNextTreeNodeOpenedCond & ImGuiSetCondition_Always)
{
opened = g.SetNextTreeNodeOpenedVal;
storage->SetInt(id, opened);
window->DC.OpenNextNode = -1;
}
else
{
// We thread ImGuiSetCondition_FirstUseThisSession and ImGuiSetCondition_FirstUseEver the same because tree node state are not saved persistently.
const int stored_value = storage->GetInt(id, -1);
if (stored_value == -1)
{
opened = g.SetNextTreeNodeOpenedVal;
storage->SetInt(id, opened);
}
else
{
opened = stored_value != 0;
}
}
g.SetNextTreeNodeOpenedCond = 0;
}
else
{
@ -4418,10 +4438,11 @@ bool ImGui::TreeNode(const char* str_label_id)
return TreeNode(str_label_id, "%s", str_label_id);
}
void ImGui::OpenNextNode(bool open)
void ImGui::SetNextTreeNodeOpened(bool opened, ImGuiSetCondition cond)
{
ImGuiWindow* window = GetCurrentWindow();
window->DC.OpenNextNode = open ? 1 : 0;
ImGuiState& g = *GImGui;
g.SetNextTreeNodeOpenedVal = opened;
g.SetNextTreeNodeOpenedCond = cond ? cond : ImGuiSetCondition_Always;
}
void ImGui::PushID(const char* str_id)

View File

@ -269,7 +269,7 @@ namespace ImGui
IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size);
IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0));
IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,1), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no paddnig.
IMGUI_API bool CollapsingHeader(const char* label, const char* str_id = NULL, const bool display_frame = true, const bool default_open = false);
IMGUI_API bool CollapsingHeader(const char* label, const char* str_id = NULL, bool display_frame = true, bool default_open = false);
IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); // adjust display_format to decorate the value with a prefix or a suffix. Use power!=1.0 for logarithmic sliders.
IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
@ -300,6 +300,8 @@ namespace ImGui
IMGUI_API bool ColorEdit3(const char* label, float col[3]);
IMGUI_API bool ColorEdit4(const char* label, float col[4], bool show_alpha = true);
IMGUI_API void ColorEditMode(ImGuiColorEditMode mode);
// Trees
IMGUI_API bool TreeNode(const char* str_label_id); // if returning 'true' the node is open and the user is responsible for calling TreePop
IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...); // "
IMGUI_API bool TreeNode(const void* ptr_id, const char* fmt, ...); // "
@ -308,7 +310,7 @@ namespace ImGui
IMGUI_API void TreePush(const char* str_id = NULL); // already called by TreeNode(), but you can call Push/Pop yourself for layouting purpose
IMGUI_API void TreePush(const void* ptr_id = NULL); // "
IMGUI_API void TreePop();
IMGUI_API void OpenNextNode(bool open); // force open/close the next TreeNode or CollapsingHeader
IMGUI_API void SetNextTreeNodeOpened(bool opened, ImGuiSetCondition cond = 0); // set next tree node to be opened.
// Selectable / Lists
IMGUI_API bool Selectable(const char* label, bool selected, const ImVec2& size = ImVec2(0,0));
@ -370,6 +372,7 @@ namespace ImGui
// Obsolete (will be removed)
IMGUI_API void GetDefaultFontData(const void** fnt_data, unsigned int* fnt_size, const void** png_data, unsigned int* png_size);
static inline void OpenNextNode(bool open) { ImGui::SetNextTreeNodeOpened(open, 0); }
} // namespace ImGui