From d60299dee278b89e588783eecb4e7ac58254b8fd Mon Sep 17 00:00:00 2001 From: ocornut Date: Thu, 18 Apr 2024 15:35:29 +0200 Subject: [PATCH] RangeSelect/MultiSelect: Box-Select: fix preventing focus. amend determination of scope_hovered for decorated/non-child windows + avoid stealing NavId. (7424) --- imgui_widgets.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 99a23ba89ff5..68f39ade550b 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -7262,7 +7262,8 @@ ImGuiMultiSelectIO* ImGui::EndMultiSelect() // Clear selection when clicking void? // We specifically test for IsMouseDragPastThreshold(0) == false to allow box-selection! - bool scope_hovered = IsWindowHovered(); + // The InnerRect test is necessary for non-child/decorated windows. + bool scope_hovered = IsWindowHovered() && window->InnerRect.Contains(g.IO.MousePos); if (scope_hovered && (ms->Flags & ImGuiMultiSelectFlags_ScopeRect)) scope_hovered &= scope_rect.Contains(g.IO.MousePos); if (scope_hovered && g.HoveredId == 0 && g.ActiveId == 0) @@ -7270,10 +7271,13 @@ ImGuiMultiSelectIO* ImGui::EndMultiSelect() if (ms->Flags & ImGuiMultiSelectFlags_BoxSelect) { if (!g.BoxSelectState.IsActive && !g.BoxSelectState.IsStarting && g.IO.MouseClickedCount[0] == 1) + { BoxSelectStartDrag(ms->BoxSelectId, ImGuiSelectionUserData_Invalid); - SetHoveredID(ms->BoxSelectId); - if (ms->Flags & ImGuiMultiSelectFlags_ScopeRect) - SetNavID(0, ImGuiNavLayer_Main, ms->FocusScopeId, ImRect(g.IO.MousePos, g.IO.MousePos)); // Automatically switch FocusScope for initial click from outside to box-select. + FocusWindow(window, ImGuiFocusRequestFlags_UnlessBelowModal); + SetHoveredID(ms->BoxSelectId); + if (ms->Flags & ImGuiMultiSelectFlags_ScopeRect) + SetNavID(0, ImGuiNavLayer_Main, ms->FocusScopeId, ImRect(g.IO.MousePos, g.IO.MousePos)); // Automatically switch FocusScope for initial click from void to box-select. + } } if (ms->Flags & ImGuiMultiSelectFlags_ClearOnClickVoid)