RangeSelect/MultiSelect: Box-Select: Fixed initial drag from not claiming hovered id, preventing window behind to move for a frame.

features/range_select
ocornut ago%!(EXTRA string=1 year)
parent 7d1246e248
commit 1f6239de4e
  1. 5
      imgui_demo.cpp
  2. 9
      imgui_widgets.cpp

@ -3066,7 +3066,7 @@ static void ShowDemoWindowMultiSelect()
ImGuiListClipper clipper; ImGuiListClipper clipper;
clipper.Begin(ITEMS_COUNT); clipper.Begin(ITEMS_COUNT);
if (ms_io->RangeSrcItem > 0) if (ms_io->RangeSrcItem != -1)
clipper.IncludeItemByIndex((int)ms_io->RangeSrcItem); // Ensure RangeSrc item is not clipped. clipper.IncludeItemByIndex((int)ms_io->RangeSrcItem); // Ensure RangeSrc item is not clipped.
while (clipper.Step()) while (clipper.Step())
{ {
@ -3190,6 +3190,7 @@ static void ShowDemoWindowMultiSelect()
if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ScopeRect", &flags, ImGuiMultiSelectFlags_ScopeRect) && (flags & ImGuiMultiSelectFlags_ScopeRect)) if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ScopeRect", &flags, ImGuiMultiSelectFlags_ScopeRect) && (flags & ImGuiMultiSelectFlags_ScopeRect))
flags &= ~ImGuiMultiSelectFlags_ScopeWindow; flags &= ~ImGuiMultiSelectFlags_ScopeWindow;
ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnClickVoid", &flags, ImGuiMultiSelectFlags_ClearOnClickVoid); ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnClickVoid", &flags, ImGuiMultiSelectFlags_ClearOnClickVoid);
ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelect", &flags, ImGuiMultiSelectFlags_BoxSelect);
for (int selection_scope_n = 0; selection_scope_n < SCOPES_COUNT; selection_scope_n++) for (int selection_scope_n = 0; selection_scope_n < SCOPES_COUNT; selection_scope_n++)
{ {
@ -3316,7 +3317,7 @@ static void ShowDemoWindowMultiSelect()
clipper.Begin(items.Size); clipper.Begin(items.Size);
if (item_curr_idx_to_focus != -1) if (item_curr_idx_to_focus != -1)
clipper.IncludeItemByIndex(item_curr_idx_to_focus); // Ensure focused item is not clipped. clipper.IncludeItemByIndex(item_curr_idx_to_focus); // Ensure focused item is not clipped.
if (ms_io->RangeSrcItem > 0) if (ms_io->RangeSrcItem != -1)
clipper.IncludeItemByIndex((int)ms_io->RangeSrcItem); // Ensure RangeSrc item is not clipped. clipper.IncludeItemByIndex((int)ms_io->RangeSrcItem); // Ensure RangeSrc item is not clipped.
} }

@ -7059,6 +7059,7 @@ bool ImGui::BeginBoxSelect(ImGuiWindow* window, ImGuiID box_select_id, ImGuiMult
// IsStarting is set by MultiSelectItemFooter() when considering a possible box-select. We validate it here and lock geometry. // IsStarting is set by MultiSelectItemFooter() when considering a possible box-select. We validate it here and lock geometry.
if (bs->IsStarting && IsMouseDragPastThreshold(0)) if (bs->IsStarting && IsMouseDragPastThreshold(0))
{ {
IMGUI_DEBUG_LOG_SELECTION("[selection] BeginBoxSelect() 0X%08X: Started.\n", box_select_id);
bs->IsActive = true; bs->IsActive = true;
bs->Window = window; bs->Window = window;
bs->IsStarting = false; bs->IsStarting = false;
@ -7070,7 +7071,10 @@ bool ImGui::BeginBoxSelect(ImGuiWindow* window, ImGuiID box_select_id, ImGuiMult
{ {
bs->IsActive = bs->IsStarting = false; bs->IsActive = bs->IsStarting = false;
if (g.ActiveId == bs->ID) if (g.ActiveId == bs->ID)
{
IMGUI_DEBUG_LOG_SELECTION("[selection] BeginBoxSelect() 0X%08X: Ended.\n", box_select_id);
ClearActiveID(); ClearActiveID();
}
bs->ID = 0; bs->ID = 0;
} }
if (!bs->IsActive) if (!bs->IsActive)
@ -7307,8 +7311,13 @@ ImGuiMultiSelectIO* ImGui::EndMultiSelect()
if (scope_hovered && g.HoveredId == 0 && g.ActiveId == 0) if (scope_hovered && g.HoveredId == 0 && g.ActiveId == 0)
{ {
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);
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.
}
if (ms->Flags & ImGuiMultiSelectFlags_ClearOnClickVoid) if (ms->Flags & ImGuiMultiSelectFlags_ClearOnClickVoid)
if (IsMouseReleased(0) && IsMouseDragPastThreshold(0) == false && g.IO.KeyMods == ImGuiMod_None) if (IsMouseReleased(0) && IsMouseDragPastThreshold(0) == false && g.IO.KeyMods == ImGuiMod_None)

Loading…
Cancel
Save