diff --git a/imgui.cpp b/imgui.cpp index f4a38ec..79ddb07 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -7774,7 +7774,7 @@ if (new_best) { result->ID = id; - result->SelectScopeId = g.MultiSelectScopeId; + result->SelectScopeId = g.NextItemData.MultiSelectScopeId; result->Window = window; result->RectRel = nav_bb_rel; } @@ -7786,7 +7786,7 @@ { result = &g.NavMoveResultLocalVisibleSet; result->ID = id; - result->SelectScopeId = g.MultiSelectScopeId; + result->SelectScopeId = g.NextItemData.MultiSelectScopeId; result->Window = window; result->RectRel = nav_bb_rel; } diff --git a/imgui.cpp b/imgui.cpp index f4a38ec..79ddb07 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -7774,7 +7774,7 @@ if (new_best) { result->ID = id; - result->SelectScopeId = g.MultiSelectScopeId; + result->SelectScopeId = g.NextItemData.MultiSelectScopeId; result->Window = window; result->RectRel = nav_bb_rel; } @@ -7786,7 +7786,7 @@ { result = &g.NavMoveResultLocalVisibleSet; result->ID = id; - result->SelectScopeId = g.MultiSelectScopeId; + result->SelectScopeId = g.NextItemData.MultiSelectScopeId; result->Window = window; result->RectRel = nav_bb_rel; } diff --git a/imgui_internal.h b/imgui_internal.h index 9237c4c..645c532 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -823,7 +823,7 @@ bool OpenVal; // Set by SetNextItemOpen() function. ImGuiCond OpenCond; void* MultiSelectData; - bool MultiSelectDataIsSet; + ImGuiID MultiSelectScopeId; ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } diff --git a/imgui.cpp b/imgui.cpp index f4a38ec..79ddb07 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -7774,7 +7774,7 @@ if (new_best) { result->ID = id; - result->SelectScopeId = g.MultiSelectScopeId; + result->SelectScopeId = g.NextItemData.MultiSelectScopeId; result->Window = window; result->RectRel = nav_bb_rel; } @@ -7786,7 +7786,7 @@ { result = &g.NavMoveResultLocalVisibleSet; result->ID = id; - result->SelectScopeId = g.MultiSelectScopeId; + result->SelectScopeId = g.NextItemData.MultiSelectScopeId; result->Window = window; result->RectRel = nav_bb_rel; } diff --git a/imgui_internal.h b/imgui_internal.h index 9237c4c..645c532 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -823,7 +823,7 @@ bool OpenVal; // Set by SetNextItemOpen() function. ImGuiCond OpenCond; void* MultiSelectData; - bool MultiSelectDataIsSet; + ImGuiID MultiSelectScopeId; ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index b04584b..7d3c25b 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -5590,6 +5590,9 @@ // - MultiSelectItemHeader() [Internal] // - MultiSelectItemFooter() [Internal] //------------------------------------------------------------------------- +// FIXME: Shift+click on an item that has no multi-select data could treat selection the same as the last item with such data? +// The problem is that this may conflict with other behaviors of those items? +//------------------------------------------------------------------------- ImGuiMultiSelectData* ImGui::BeginMultiSelect(ImGuiMultiSelectFlags flags, void* range_ref, bool range_ref_is_selected) { @@ -5625,7 +5628,7 @@ if (IsWindowFocused() && g.IO.KeyCtrl && IsKeyPressed(GetKeyIndex(ImGuiKey_A))) state->In.RequestSelectAll = true; -#if IMGUI_DEBUG_MULTISELECT +#ifdef IMGUI_DEBUG_MULTISELECT if (state->In.RequestClear) printf("[%05d] BeginMultiSelect: RequestClear\n", g.FrameCount); if (state->In.RequestSelectAll) printf("[%05d] BeginMultiSelect: RequestSelectAll\n", g.FrameCount); #endif @@ -5644,7 +5647,7 @@ g.MultiSelectScopeWindow = NULL; g.MultiSelectFlags = 0; -#if IMGUI_DEBUG_MULTISELECT +#ifdef IMGUI_DEBUG_MULTISELECT if (state->Out.RequestClear) printf("[%05d] EndMultiSelect: RequestClear\n", g.FrameCount); if (state->Out.RequestSelectAll) printf("[%05d] EndMultiSelect: RequestSelectAll\n", g.FrameCount); if (state->Out.RequestSetRange) printf("[%05d] EndMultiSelect: RequestSetRange %p..%p = %d\n", g.FrameCount, state->Out.RangeSrc, state->Out.RangeDst, state->Out.RangeValue); @@ -5656,8 +5659,9 @@ void ImGui::SetNextItemMultiSelectData(void* item_data) { ImGuiContext& g = *GImGui; + IM_ASSERT(g.MultiSelectScopeId != 0); g.NextItemData.MultiSelectData = item_data; - g.NextItemData.MultiSelectDataIsSet = true; + g.NextItemData.MultiSelectScopeId = g.MultiSelectScopeId; } void ImGui::MultiSelectItemHeader(ImGuiID id, bool* p_selected) @@ -5665,7 +5669,7 @@ ImGuiContext& g = *GImGui; ImGuiMultiSelectState* state = &g.MultiSelectState; - IM_ASSERT(g.NextItemData.MultiSelectDataIsSet && "Forgot to call SetNextItemMultiSelectData() prior to item, required in BeginMultiSelect()/EndMultiSelect() scope"); + IM_ASSERT(g.NextItemData.MultiSelectScopeId == g.MultiSelectScopeId && "Forgot to call SetNextItemMultiSelectData() prior to item, required in BeginMultiSelect()/EndMultiSelect() scope"); void* item_data = g.NextItemData.MultiSelectData; // Apply Clear/SelectAll requests requested by BeginMultiSelect(). @@ -5706,7 +5710,7 @@ ImGuiMultiSelectState* state = &g.MultiSelectState; void* item_data = g.NextItemData.MultiSelectData; - g.NextItemData.MultiSelectDataIsSet = false; + g.NextItemData.MultiSelectScopeId = 0; bool selected = *p_selected; bool pressed = *p_pressed;