From 3d41994a6326b113fa51dd7b04237c68e06b3ee4 Mon Sep 17 00:00:00 2001 From: ocornut Date: Wed, 27 Sep 2023 14:24:23 +0200 Subject: [PATCH] MultiSelect: simplify clearing ImGuiMultiSelectTempData. --- imgui_internal.h | 4 ++-- imgui_widgets.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/imgui_internal.h b/imgui_internal.h index 63772203d..9bb378f23 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -1716,11 +1716,11 @@ struct ImGuiOldColumns // Temporary storage for multi-select struct IMGUI_API ImGuiMultiSelectTempData { + ImGuiMultiSelectIO IO; // MUST BE FIRST FIELD. Requests are set and returned by BeginMultiSelect()/EndMultiSelect() + written to by user during the loop. ImGuiMultiSelectState* Storage; ImGuiID FocusScopeId; // Copied from g.CurrentFocusScopeId (unless another selection scope was pushed manually) ImGuiMultiSelectFlags Flags; ImGuiKeyChord KeyMods; - ImGuiMultiSelectIO IO; // Requests are set and returned by BeginMultiSelect()/EndMultiSelect() + written to by user during the loop. bool LoopRequestClear; bool LoopRequestSelectAll; bool IsEndIO; // Set when switching IO from BeginMultiSelect() to EndMultiSelect() state. @@ -1732,7 +1732,7 @@ struct IMGUI_API ImGuiMultiSelectTempData //ImRect Rect; // Extent of selection scope between BeginMultiSelect() / EndMultiSelect(), used by ImGuiMultiSelectFlags_ClearOnClickRectVoid. ImGuiMultiSelectTempData() { Clear(); } - void Clear() { Storage = NULL; FocusScopeId = 0; Flags = 0; KeyMods = 0; IO.Clear(); IsEndIO = LoopRequestClear = LoopRequestSelectAll = IsFocused = IsSetRange = NavIdPassedBy = RangeSrcPassedBy = RangeDstPassedBy = false; } + void Clear() { size_t io_sz = sizeof(IO); IO.Clear(); memset((void*)(&IO + 1), 0, sizeof(*this) - io_sz); } // Zero-clear except IO }; // Persistent storage for multi-select (as long as selection is alive) diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index edf48aa68..500be32f1 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -7129,6 +7129,7 @@ ImGuiMultiSelectIO* ImGui::BeginMultiSelect(ImGuiMultiSelectFlags flags) ImGuiWindow* window = g.CurrentWindow; ImGuiMultiSelectTempData* ms = &g.MultiSelectTempData[0]; IM_ASSERT(g.CurrentMultiSelect == NULL); // No recursion allowed yet (we could allow it if we deem it useful) + IM_STATIC_ASSERT(offsetof(ImGuiMultiSelectTempData, IO) == 0); // Clear() relies on that. g.CurrentMultiSelect = ms; // FIXME: BeginFocusScope()