From d411c9054ad93e8e5b17cc3f451a94483b897f16 Mon Sep 17 00:00:00 2001 From: ocornut Date: Fri, 28 Jun 2024 18:36:53 +0200 Subject: [PATCH] MultiSelect: minor tidying up. Checkbox() was reworked in master effectively fixing render clipping when culled by BoxSelect2d's UnclipMode. --- imgui.h | 1 + imgui_internal.h | 2 +- imgui_widgets.cpp | 12 +++++------- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/imgui.h b/imgui.h index 569281729..b086caa27 100644 --- a/imgui.h +++ b/imgui.h @@ -2780,6 +2780,7 @@ enum ImGuiMultiSelectFlags_ ImGuiMultiSelectFlags_ScopeRect = 1 << 12, // Scope for _BoxSelect and _ClearOnClickVoid is rectangle encompassing BeginMultiSelect()/EndMultiSelect(). Use if BeginMultiSelect() is called multiple times in same window. ImGuiMultiSelectFlags_SelectOnClick = 1 << 13, // Apply selection on mouse down when clicking on unselected item. (Default) ImGuiMultiSelectFlags_SelectOnClickRelease = 1 << 14, // Apply selection on mouse release when clicking an unselected item. Allow dragging an unselected item without altering selection. + //ImGuiMultiSelectFlags_RangeSelect2d = 1 << 15, // Shift+Selection uses 2d geometry instead of linear sequence, so possible to use Shift+up/down to select vertically in grid. Analogous to what BoxSelect does. }; // Main IO structure returned by BeginMultiSelect()/EndMultiSelect(). diff --git a/imgui_internal.h b/imgui_internal.h index 908c8f426..ae3375e28 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -3406,7 +3406,7 @@ namespace ImGui // Box-Select API IMGUI_API bool BeginBoxSelect(ImGuiWindow* window, ImGuiID box_select_id, ImGuiMultiSelectFlags ms_flags); - IMGUI_API void EndBoxSelect(const ImRect& scope_rect, bool enable_scroll); + IMGUI_API void EndBoxSelect(const ImRect& scope_rect, ImGuiMultiSelectFlags ms_flags); // Multi-Select API IMGUI_API void MultiSelectItemHeader(ImGuiID id, bool* p_selected, ImGuiButtonFlags* p_button_flags); diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 5b2e400d1..135273597 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -1136,8 +1136,9 @@ bool ImGui::Checkbox(const char* label, bool* v) const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); ItemSize(total_bb, style.FramePadding.y); const bool is_visible = ItemAdd(total_bb, id); + const bool is_multi_select = (g.LastItemData.InFlags & ImGuiItemFlags_IsMultiSelect) != 0; if (!is_visible) - if (!g.BoxSelectState.UnclipMode || (g.LastItemData.InFlags & ImGuiItemFlags_IsMultiSelect) == 0 || !g.BoxSelectState.UnclipRect.Overlaps(total_bb)) // Extra layer of "no logic clip" for box-select support + if (!is_multi_select || !g.BoxSelectState.UnclipMode || !g.BoxSelectState.UnclipRect.Overlaps(total_bb)) // Extra layer of "no logic clip" for box-select support { IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); return false; @@ -1145,7 +1146,6 @@ bool ImGui::Checkbox(const char* label, bool* v) // Range-Selection/Multi-selection support (header) bool checked = *v; - const bool is_multi_select = (g.LastItemData.InFlags & ImGuiItemFlags_IsMultiSelect) != 0; if (is_multi_select) MultiSelectItemHeader(id, &checked, NULL); @@ -7250,7 +7250,7 @@ bool ImGui::BeginBoxSelect(ImGuiWindow* window, ImGuiID box_select_id, ImGuiMult return true; } -void ImGui::EndBoxSelect(const ImRect& scope_rect, bool enable_scroll) +void ImGui::EndBoxSelect(const ImRect& scope_rect, ImGuiMultiSelectFlags ms_flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; @@ -7266,6 +7266,7 @@ void ImGui::EndBoxSelect(const ImRect& scope_rect, bool enable_scroll) window->DrawList->AddRect(box_select_r.Min, box_select_r.Max, GetColorU32(ImGuiCol_NavHighlight)); // FIXME-MULTISELECT: Styling // Scroll + const bool enable_scroll = (ms_flags & ImGuiMultiSelectFlags_ScopeWindow) && (ms_flags & ImGuiMultiSelectFlags_BoxSelectNoScroll) == 0; if (enable_scroll) { ImRect scroll_r = scope_rect; @@ -7443,10 +7444,7 @@ ImGuiMultiSelectIO* ImGui::EndMultiSelect() } if ((ms->Flags & (ImGuiMultiSelectFlags_BoxSelect1d | ImGuiMultiSelectFlags_BoxSelect2d)) && GetBoxSelectState(ms->BoxSelectId)) - { - bool enable_scroll = (ms->Flags & ImGuiMultiSelectFlags_ScopeWindow) && (ms->Flags & ImGuiMultiSelectFlags_BoxSelectNoScroll) == 0; - EndBoxSelect(scope_rect, enable_scroll); - } + EndBoxSelect(scope_rect, ms->Flags); } if (ms->IsEndIO == false)