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. 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. 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/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/10 (1.32) - renamed GetItemWidth() to CalcItemWidth() to clarify its evolving behavior
- 2015/02/08 (1.31) - renamed GetTextLineSpacing() to GetTextLineHeightWithSpacing() - 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: 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: field resize behavior - field could stretch when being edited? hover tooltip shows more text?
- text edit: add multi-line text edit - 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 - 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: write more decent code to allow saving/loading new fields
- settings: api for per-tool simple persistent data (bool,int,float) in .ini file - settings: api for per-tool simple persistent data (bool,int,float) in .ini file
@ -889,7 +889,6 @@ struct ImGuiDrawContext
ImVector<float> TextWrapPos; ImVector<float> TextWrapPos;
ImGuiColorEditMode ColorEditMode; ImGuiColorEditMode ColorEditMode;
ImGuiStorage* StateStorage; 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 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. 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); LastItemAabb = ImGuiAabb(0.0f,0.0f,0.0f,0.0f);
LastItemHovered = false; LastItemHovered = false;
StateStorage = NULL; StateStorage = NULL;
OpenNextNode = -1;
ColumnsStartX = 0.0f; ColumnsStartX = 0.0f;
ColumnsOffsetX = 0.0f; ColumnsOffsetX = 0.0f;
@ -999,6 +997,7 @@ struct ImGuiState
ImVector<ImGuiColMod> ColorModifiers; ImVector<ImGuiColMod> ColorModifiers;
ImVector<ImGuiStyleMod> StyleModifiers; ImVector<ImGuiStyleMod> StyleModifiers;
ImVector<ImFont*> FontStack; ImVector<ImFont*> FontStack;
ImVec2 SetNextWindowPosVal; ImVec2 SetNextWindowPosVal;
ImGuiSetCondition SetNextWindowPosCond; ImGuiSetCondition SetNextWindowPosCond;
ImVec2 SetNextWindowSizeVal; ImVec2 SetNextWindowSizeVal;
@ -1006,6 +1005,8 @@ struct ImGuiState
bool SetNextWindowCollapsedVal; bool SetNextWindowCollapsedVal;
ImGuiSetCondition SetNextWindowCollapsedCond; ImGuiSetCondition SetNextWindowCollapsedCond;
bool SetNextWindowFocus; bool SetNextWindowFocus;
bool SetNextTreeNodeOpenedVal;
ImGuiSetCondition SetNextTreeNodeOpenedCond;
// Render // Render
ImVector<ImDrawList*> RenderDrawLists; ImVector<ImDrawList*> RenderDrawLists;
@ -1051,6 +1052,7 @@ struct ImGuiState
ActiveIdIsAlive = false; ActiveIdIsAlive = false;
ActiveIdIsFocusedOnly = false; ActiveIdIsFocusedOnly = false;
SettingsDirtyTimer = 0.0f; SettingsDirtyTimer = 0.0f;
SetNextWindowPosVal = ImVec2(0.0f, 0.0f); SetNextWindowPosVal = ImVec2(0.0f, 0.0f);
SetNextWindowPosCond = 0; SetNextWindowPosCond = 0;
SetNextWindowSizeVal = ImVec2(0.0f, 0.0f); SetNextWindowSizeVal = ImVec2(0.0f, 0.0f);
@ -1058,6 +1060,8 @@ struct ImGuiState
SetNextWindowCollapsedVal = false; SetNextWindowCollapsedVal = false;
SetNextWindowCollapsedCond = 0; SetNextWindowCollapsedCond = 0;
SetNextWindowFocus = false; SetNextWindowFocus = false;
SetNextTreeNodeOpenedVal = false;
SetNextTreeNodeOpenedCond = 0;
SliderAsInputTextId = 0; SliderAsInputTextId = 0;
ActiveComboID = 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.ColumnsCellMinY = window->DC.ColumnsCellMaxY = window->DC.ColumnsStartPos.y;
window->DC.TreeDepth = 0; window->DC.TreeDepth = 0;
window->DC.StateStorage = &window->StateStorage; window->DC.StateStorage = &window->StateStorage;
window->DC.OpenNextNode = -1;
// Reset contents size for auto-fitting // Reset contents size for auto-fitting
window->SizeContentsFit = ImVec2(0.0f, 0.0f); window->SizeContentsFit = ImVec2(0.0f, 0.0f);
@ -4204,7 +4207,7 @@ void ImGui::LogButtons()
LogToClipboard(g.LogAutoExpandMaxDepth); 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; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
@ -4220,14 +4223,31 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, const bool d
label = str_id; label = str_id;
const ImGuiID id = window->GetID(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; ImGuiStorage* storage = window->DC.StateStorage;
bool opened; 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); 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 else
{ {
@ -4418,10 +4438,11 @@ bool ImGui::TreeNode(const char* str_label_id)
return TreeNode(str_label_id, "%s", 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(); ImGuiState& g = *GImGui;
window->DC.OpenNextNode = open ? 1 : 0; g.SetNextTreeNodeOpenedVal = opened;
g.SetNextTreeNodeOpenedCond = cond ? cond : ImGuiSetCondition_Always;
} }
void ImGui::PushID(const char* str_id) 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 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 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 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 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 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); 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 ColorEdit3(const char* label, float col[3]);
IMGUI_API bool ColorEdit4(const char* label, float col[4], bool show_alpha = true); IMGUI_API bool ColorEdit4(const char* label, float col[4], bool show_alpha = true);
IMGUI_API void ColorEditMode(ImGuiColorEditMode mode); 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_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 char* str_id, const char* fmt, ...); // "
IMGUI_API bool TreeNode(const void* ptr_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 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 TreePush(const void* ptr_id = NULL); // "
IMGUI_API void TreePop(); 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 // Selectable / Lists
IMGUI_API bool Selectable(const char* label, bool selected, const ImVec2& size = ImVec2(0,0)); 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) // Obsolete (will be removed)
IMGUI_API void GetDefaultFontData(const void** fnt_data, unsigned int* fnt_size, const void** png_data, unsigned int* png_size); 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 } // namespace ImGui