From d6ea56dfd97ac5d7caab2208b11e0e12fa2377d9 Mon Sep 17 00:00:00 2001 From: ocornut Date: Fri, 3 Feb 2023 22:50:43 +0100 Subject: [PATCH] Tables: amend f799a29 with a better solution + fix potential overflow (#6140) --- imgui.cpp | 9 +++++++++ imgui_internal.h | 1 + imgui_tables.cpp | 4 +--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index b729f66de..e04d623f8 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -7514,6 +7514,15 @@ ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed) return id; } +ImGuiID ImGui::GetIDWithSeed(int n, ImGuiID seed) +{ + ImGuiID id = ImHashData(&n, sizeof(n), seed); + ImGuiContext& g = *GImGui; + if (g.DebugHookIdInfo == id) + DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); + return id; +} + void ImGui::PopID() { ImGuiWindow* window = GImGui->CurrentWindow; diff --git a/imgui_internal.h b/imgui_internal.h index 73512921f..021a24ec7 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -2802,6 +2802,7 @@ namespace ImGui IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function. IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes) IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed); + IMGUI_API ImGuiID GetIDWithSeed(int n, ImGuiID seed); // Basic Helpers for widget code IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); diff --git a/imgui_tables.cpp b/imgui_tables.cpp index 8452c06e2..06a21ed84 100644 --- a/imgui_tables.cpp +++ b/imgui_tables.cpp @@ -366,9 +366,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG IM_ASSERT(table->ColumnsCount == columns_count && "BeginTable(): Cannot change columns count mid-frame while preserving same ID"); if (table->InstanceDataExtra.Size < instance_no) table->InstanceDataExtra.push_back(ImGuiTableInstanceData()); - char instance_desc[12]; - int instance_desc_len = ImFormatString(instance_desc, IM_ARRAYSIZE(instance_desc), "##Instance%d", instance_no); - instance_id = GetIDWithSeed(instance_desc, instance_desc + instance_desc_len, id); + instance_id = GetIDWithSeed(instance_no, GetIDWithSeed("##Instances", NULL, id)); // Push "##Instance" followed by (int)instance_no in ID stack. } else {