diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 69294a56..29f7d9d6 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -48,6 +48,11 @@ Other Changes: multi-line edit is clipped due to being out of view. - Fonts: - imgui_freetype: add FreeType headers & compiled version in 'About Dear ImGui' details. +- Clipper: + - Improved error reporting when misusing the clipper inside a table (prioritize + reporting the common clipper error over a table sanity check assert). (#9350) + - Tweaked assert triggering when first item height measurement fails, and made it + a better recoverable error. (#9350) - Backends: - Metal: avoid redundant vertex buffer bind in SetupRenderState, which leads to validation issue. (#9343) [@Hunam6] diff --git a/imgui.cpp b/imgui.cpp index a603ad88..5360fa47 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -3387,9 +3387,6 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper) if (clipper->ItemsHeight <= 0.0f) { IM_ASSERT(data->StepNo == 1); - if (table) - IM_ASSERT(table->RowPosY1 == clipper->StartPosY && table->RowPosY2 == window->DC.CursorPos.y); - bool affected_by_floating_point_precision = ImIsFloatAboveGuaranteedIntegerPrecision((float)clipper->StartPosY) || ImIsFloatAboveGuaranteedIntegerPrecision(window->DC.CursorPos.y); if (affected_by_floating_point_precision) { @@ -3403,7 +3400,14 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper) } if (clipper->ItemsHeight == 0.0f && clipper->ItemsCount == INT_MAX) // Accept that no item have been submitted if in indeterminate mode. return false; - IM_ASSERT(clipper->ItemsHeight > 0.0f && "Unable to calculate item height! First item hasn't moved the cursor vertically!"); + if (clipper->ItemsHeight <= 0.0f) + { + IM_ASSERT_USER_ERROR(clipper->ItemsHeight > 0.0f, "ImGuiListClipper: Failed to calculate item height! First item hasn't been submitted by user code, or has not moved the cursor vertically!"); + return false; + } + if (table) + IM_ASSERT(table->RowPosY1 == clipper->StartPosY && table->RowPosY2 == window->DC.CursorPos.y); + calc_clipping = true; // If item height had to be calculated, calculate clipping afterwards. }