RangeSelect/MultiSelect: Box-Select: fix preventing focus. amend determination of scope_hovered for decorated/non-child windows + avoid stealing NavId. (7424)

features/range_select
ocornut ago%!(EXTRA string=1 year)
parent e3df9e8a7a
commit e05496092e
  1. 12
      imgui_widgets.cpp

@ -7318,7 +7318,8 @@ ImGuiMultiSelectIO* ImGui::EndMultiSelect()
// Clear selection when clicking void? // Clear selection when clicking void?
// We specifically test for IsMouseDragPastThreshold(0) == false to allow box-selection! // 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)) if (scope_hovered && (ms->Flags & ImGuiMultiSelectFlags_ScopeRect))
scope_hovered &= scope_rect.Contains(g.IO.MousePos); scope_hovered &= scope_rect.Contains(g.IO.MousePos);
if (scope_hovered && g.HoveredId == 0 && g.ActiveId == 0) if (scope_hovered && g.HoveredId == 0 && g.ActiveId == 0)
@ -7326,10 +7327,13 @@ ImGuiMultiSelectIO* ImGui::EndMultiSelect()
if (ms->Flags & ImGuiMultiSelectFlags_BoxSelect) if (ms->Flags & ImGuiMultiSelectFlags_BoxSelect)
{ {
if (!g.BoxSelectState.IsActive && !g.BoxSelectState.IsStarting && g.IO.MouseClickedCount[0] == 1) if (!g.BoxSelectState.IsActive && !g.BoxSelectState.IsStarting && g.IO.MouseClickedCount[0] == 1)
{
BoxSelectStartDrag(ms->BoxSelectId, ImGuiSelectionUserData_Invalid); BoxSelectStartDrag(ms->BoxSelectId, ImGuiSelectionUserData_Invalid);
SetHoveredID(ms->BoxSelectId); FocusWindow(window, ImGuiFocusRequestFlags_UnlessBelowModal);
if (ms->Flags & ImGuiMultiSelectFlags_ScopeRect) SetHoveredID(ms->BoxSelectId);
SetNavID(0, ImGuiNavLayer_Main, ms->FocusScopeId, ImRect(g.IO.MousePos, g.IO.MousePos)); // Automatically switch FocusScope for initial click from outside to box-select. 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) if (ms->Flags & ImGuiMultiSelectFlags_ClearOnClickVoid)

Loading…
Cancel
Save