|
@@ -1952,28 +1952,30 @@ bool ImGui::Combo(const char* label, int* current_item, const char* (*getter)(vo
|
|
|
return false;
|
|
|
|
|
|
// Display items
|
|
|
- // FIXME-OPT: Use clipper (but we need to disable it on the appearing frame to make sure our call to SetItemDefaultFocus() is processed)
|
|
|
bool value_changed = false;
|
|
|
- for (int i = 0; i < items_count; i++)
|
|
|
- {
|
|
|
- const char* item_text = getter(user_data, i);
|
|
|
- if (item_text == NULL)
|
|
|
- item_text = "*Unknown item*";
|
|
|
-
|
|
|
- PushID(i);
|
|
|
- const bool item_selected = (i == *current_item);
|
|
|
- if (Selectable(item_text, item_selected) && *current_item != i)
|
|
|
+ ImGuiListClipper clipper;
|
|
|
+ clipper.Begin(items_count);
|
|
|
+ clipper.IncludeItemByIndex(*current_item);
|
|
|
+ while (clipper.Step())
|
|
|
+ for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
|
|
|
{
|
|
|
- value_changed = true;
|
|
|
- *current_item = i;
|
|
|
+ const char* item_text = getter(user_data, i);
|
|
|
+ if (item_text == NULL)
|
|
|
+ item_text = "*Unknown item*";
|
|
|
+
|
|
|
+ PushID(i);
|
|
|
+ const bool item_selected = (i == *current_item);
|
|
|
+ if (Selectable(item_text, item_selected) && *current_item != i)
|
|
|
+ {
|
|
|
+ value_changed = true;
|
|
|
+ *current_item = i;
|
|
|
+ }
|
|
|
+ if (item_selected)
|
|
|
+ SetItemDefaultFocus();
|
|
|
+ PopID();
|
|
|
}
|
|
|
- if (item_selected)
|
|
|
- SetItemDefaultFocus();
|
|
|
- PopID();
|
|
|
- }
|
|
|
|
|
|
EndCombo();
|
|
|
-
|
|
|
if (value_changed)
|
|
|
MarkItemEdited(g.LastItemData.ID);
|
|
|
|
|
@@ -7011,6 +7013,7 @@ bool ImGui::ListBox(const char* label, int* current_item, const char* (*getter)(
|
|
|
bool value_changed = false;
|
|
|
ImGuiListClipper clipper;
|
|
|
clipper.Begin(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to.
|
|
|
+ clipper.IncludeItemByIndex(*current_item);
|
|
|
while (clipper.Step())
|
|
|
for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
|
|
|
{
|