From 8a314909219d73a88463f6c29ed9143a0ce3f7a5 Mon Sep 17 00:00:00 2001 From: ocornut Date: Fri, 30 Jun 2023 14:17:16 +0200 Subject: [PATCH] RangeSelect/MultiSelect: Tidying up/simpllifying MultiSelectItemFooter(). Intended to be entirely a no-op, merely a transform of source code for simplification. But committing separatey from behavior change in previous change. --- imgui_widgets.cpp | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index eaa0ae51..ab88c740 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -7177,6 +7177,7 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed) } // Right-click handling: this could be moved at the Selectable() level. + // FIXME-MULTISELECT: See https://github.com/ocornut/imgui/pull/5816 bool hovered = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup); if (hovered && IsMouseClicked(1)) { @@ -7216,11 +7217,12 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed) //---------------------------------------------------------------------------------------- ImGuiInputSource input_source = (g.NavJustMovedToId == id || g.NavActivateId == id) ? g.NavInputSource : ImGuiInputSource_Mouse; + ms->EndIO.RequestSetRange = true; + ms->EndIO.RangeDstItem = item_data; if (is_shift && is_multiselect) { - // Shift+Arrow always select, Ctrl+Shift+Arrow copy source selection state. - ms->EndIO.RequestSetRange = true; - ms->EndIO.RangeDstItem = item_data; + // Shift+Arrow always select + // Ctrl+Shift+Arrow copy source selection state (alrady stored by BeginMultiSelect() in RangeSelected) if (!is_ctrl) ms->EndIO.RangeSelected = true; ms->EndIO.RangeDirection = ms->BeginIO.RangeSrcPassedBy ? +1 : -1; @@ -7229,40 +7231,23 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed) { // Ctrl inverts selection, otherwise always select selected = is_ctrl ? !selected : true; - ms->EndIO.RangeSrcItem = ms->EndIO.RangeDstItem = item_data; + ms->EndIO.RangeSrcItem = item_data; ms->EndIO.RangeSelected = selected; - ms->EndIO.RequestSetRange = true; ms->EndIO.RangeDirection = +1; } if (input_source == ImGuiInputSource_Mouse || g.NavActivateId == id) { - // Mouse click without CTRL clears the selection, unless the clicked item is already selected if (is_multiselect && !is_ctrl) ms->EndIO.RequestClear = true; - if (is_multiselect && !is_shift && ms->EndIO.RequestClear) - { - // For toggle selection unless there is a Clear request, we can handle it completely locally without sending a RangeSet request. - IM_ASSERT(ms->EndIO.RangeSrcItem == ms->EndIO.RangeDstItem); // Setup by else block above - ms->EndIO.RequestSetRange = true; - ms->EndIO.RangeSelected = selected; - ms->EndIO.RangeDirection = +1; - } - if (!is_multiselect) - { - // Clear selection, set single item range - IM_ASSERT(ms->EndIO.RangeSrcItem == item_data && ms->EndIO.RangeDstItem == item_data); // Setup by block above - ms->EndIO.RequestClear = true; - ms->EndIO.RequestSetRange = true; - } } else if (input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Gamepad) { - if (is_multiselect && is_shift && !is_ctrl) - ms->EndIO.RequestClear = true; - else if (!is_multiselect) + if (is_multiselect && is_shift && !is_ctrl) // Without Shift the RequestClear was done in BeginIO, not necessary to do again. ms->EndIO.RequestClear = true; } + else if (!is_multiselect) + ms->EndIO.RequestClear = true; } // Update/store the selection state of the Source item (used by CTRL+SHIFT, when Source is unselected we perform a range unselect)