瀏覽代碼

Clipper: fixed invalid state when number of frozen table row is smaller than ItemCount.

+ Bonus rather unorthodox coding style.
ocornut 3 年之前
父節點
當前提交
926addbfe2
共有 2 個文件被更改,包括 6 次插入4 次删除
  1. 1 0
      docs/CHANGELOG.txt
  2. 5 4
      imgui.cpp

+ 1 - 0
docs/CHANGELOG.txt

@@ -74,6 +74,7 @@ Other Changes:
   (an additional ItemSpacing.y was declared, affecting scrollbar range).
 - Clipper: various and incomplete changes to tame down scrolling and precision issues on very large ranges.
   Passing an explicit height to the clipper now allows larger ranges. (#3609, #3962).
+- Clipper: fixed invalid state when number of frozen table row is smaller than ItemCount.
 - Drag and Drop: BeginDragDropSource() with ImGuiDragDropFlags_SourceAllowNullID doesn't lose
   tooltip when scrolling. (#143)
 - Metrics: Added a node showing windows in submission order and showing the Begin() stack.

+ 5 - 4
imgui.cpp

@@ -2435,10 +2435,7 @@ bool ImGuiListClipper::Step()
 
     // No items
     if (ItemsCount == 0 || GetSkipItemForListClipping())
-    {
-        End();
-        return false;
-    }
+        return (void)End(), false;
 
     // While we are in frozen row state, keep displaying items one by one, unclipped
     // FIXME: Could be stored as a table-agnostic state.
@@ -2446,6 +2443,8 @@ bool ImGuiListClipper::Step()
     {
         DisplayStart = data->ItemsFrozen;
         DisplayEnd = data->ItemsFrozen + 1;
+        if (DisplayStart >= ItemsCount)
+            return (void)End(), false;
         data->ItemsFrozen++;
         return true;
     }
@@ -2461,6 +2460,8 @@ bool ImGuiListClipper::Step()
             data->Ranges.push_front(ImGuiListClipperRange::FromIndices(data->ItemsFrozen, data->ItemsFrozen + 1));
             DisplayStart = ImMax(data->Ranges[0].Min, data->ItemsFrozen);
             DisplayEnd = ImMin(data->Ranges[0].Max, ItemsCount);
+            if (DisplayStart == DisplayEnd)
+                return (void)End(), false;
             data->StepNo = 1;
             return true;
         }