浏览代码

Clipper: hotfix (amend 93cccd2, was broken) (#3841, #1725)

ocornut 3 年之前
父节点
当前提交
32779c5b64
共有 1 个文件被更改,包括 14 次插入12 次删除
  1. 14 12
      imgui.cpp

+ 14 - 12
imgui.cpp

@@ -2357,7 +2357,7 @@ ImGuiListClipper::ImGuiListClipper()
 
 
 ImGuiListClipper::~ImGuiListClipper()
 ImGuiListClipper::~ImGuiListClipper()
 {
 {
-    IM_ASSERT(ItemsCount == -1 && "Forgot to call End(), or to Step() until false?");
+    End();
 }
 }
 
 
 // Use case A: Begin() called from constructor with items_height<0, then called again from Step() in StepNo 1
 // Use case A: Begin() called from constructor with items_height<0, then called again from Step() in StepNo 1
@@ -2388,22 +2388,24 @@ void ImGuiListClipper::Begin(int items_count, float items_height)
 
 
 void ImGuiListClipper::End()
 void ImGuiListClipper::End()
 {
 {
-    ImGuiContext& g = *GImGui;
-    if (ItemsCount < 0) // Already ended
-        return;
-
     // In theory here we should assert that we are already at the right position, but it seems saner to just seek at the end and not assert/crash the user.
     // In theory here we should assert that we are already at the right position, but it seems saner to just seek at the end and not assert/crash the user.
-    ImGuiListClipperData* data = (ImGuiListClipperData*)TempData;
-    if (ItemsCount < INT_MAX && DisplayStart >= 0)
+    ImGuiContext& g = *GImGui;
+    if (ItemsCount >= 0 && ItemsCount < INT_MAX && DisplayStart >= 0)
         ImGuiListClipper_SeekCursorForItem(this, ItemsCount);
         ImGuiListClipper_SeekCursorForItem(this, ItemsCount);
     ItemsCount = -1;
     ItemsCount = -1;
-    data->StepNo = data->Ranges.Size;
 
 
     // Restore temporary buffer and fix back pointers which may be invalidated when nesting
     // Restore temporary buffer and fix back pointers which may be invalidated when nesting
-    IM_ASSERT(g.ClipperTempDataStacked > 0);
-    data = (--g.ClipperTempDataStacked > 0) ? &g.ClipperTempData[g.ClipperTempDataStacked - 1] : NULL;
-    if (data)
-        data->ListClipper->TempData = data;
+    if (ImGuiListClipperData* data = (ImGuiListClipperData*)TempData)
+    {
+        IM_ASSERT(data->ListClipper == this);
+        data->StepNo = data->Ranges.Size;
+        if (--g.ClipperTempDataStacked > 0)
+        {
+            data = &g.ClipperTempData[g.ClipperTempDataStacked - 1];
+            data->ListClipper->TempData = data;
+        }
+        TempData = NULL;
+    }
 }
 }
 
 
 bool ImGuiListClipper::Step()
 bool ImGuiListClipper::Step()