|
@@ -1870,18 +1870,15 @@ void ImGui::EndComboPreview()
|
|
|
}
|
|
|
|
|
|
// Getter for the old Combo() API: const char*[]
|
|
|
-static bool Items_ArrayGetter(void* data, int idx, const char** out_text)
|
|
|
+static const char* Items_ArrayGetter(void* data, int idx)
|
|
|
{
|
|
|
const char* const* items = (const char* const*)data;
|
|
|
- if (out_text)
|
|
|
- *out_text = items[idx];
|
|
|
- return true;
|
|
|
+ return items[idx];
|
|
|
}
|
|
|
|
|
|
// Getter for the old Combo() API: "item1\0item2\0item3\0"
|
|
|
-static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
|
|
|
+static const char* Items_SingleStringGetter(void* data, int idx)
|
|
|
{
|
|
|
- // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited.
|
|
|
const char* items_separated_by_zeros = (const char*)data;
|
|
|
int items_count = 0;
|
|
|
const char* p = items_separated_by_zeros;
|
|
@@ -1892,22 +1889,18 @@ static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
|
|
|
p += strlen(p) + 1;
|
|
|
items_count++;
|
|
|
}
|
|
|
- if (!*p)
|
|
|
- return false;
|
|
|
- if (out_text)
|
|
|
- *out_text = p;
|
|
|
- return true;
|
|
|
+ return *p ? p : NULL;
|
|
|
}
|
|
|
|
|
|
// Old API, prefer using BeginCombo() nowadays if you can.
|
|
|
-bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items)
|
|
|
+bool ImGui::Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int popup_max_height_in_items)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
|
|
|
// Call the getter to obtain the preview string which is a parameter to BeginCombo()
|
|
|
const char* preview_value = NULL;
|
|
|
if (*current_item >= 0 && *current_item < items_count)
|
|
|
- items_getter(data, *current_item, &preview_value);
|
|
|
+ preview_value = getter(user_data, *current_item);
|
|
|
|
|
|
// The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here.
|
|
|
if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint))
|
|
@@ -1921,11 +1914,12 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi
|
|
|
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);
|
|
|
- const char* item_text;
|
|
|
- if (!items_getter(data, i, &item_text))
|
|
|
- item_text = "*Unknown item*";
|
|
|
if (Selectable(item_text, item_selected) && *current_item != i)
|
|
|
{
|
|
|
value_changed = true;
|
|
@@ -1965,6 +1959,30 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa
|
|
|
return value_changed;
|
|
|
}
|
|
|
|
|
|
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
|
+
|
|
|
+struct ImGuiGetNameFromIndexOldToNewCallbackData { void* UserData; bool (*OldCallback)(void*, int, const char**); };
|
|
|
+static const char* ImGuiGetNameFromIndexOldToNewCallback(void* user_data, int idx)
|
|
|
+{
|
|
|
+ ImGuiGetNameFromIndexOldToNewCallbackData* data = (ImGuiGetNameFromIndexOldToNewCallbackData*)user_data;
|
|
|
+ const char* s = NULL;
|
|
|
+ data->OldCallback(data->UserData, idx, &s);
|
|
|
+ return s;
|
|
|
+}
|
|
|
+
|
|
|
+bool ImGui::ListBox(const char* label, int* current_item, bool (*old_getter)(void*, int, const char**), void* user_data, int items_count, int height_in_items)
|
|
|
+{
|
|
|
+ ImGuiGetNameFromIndexOldToNewCallbackData old_to_new_data = { user_data, old_getter };
|
|
|
+ return ListBox(label, current_item, ImGuiGetNameFromIndexOldToNewCallback, &old_to_new_data, items_count, height_in_items);
|
|
|
+}
|
|
|
+bool ImGui::Combo(const char* label, int* current_item, bool (*old_getter)(void*, int, const char**), void* user_data, int items_count, int popup_max_height_in_items)
|
|
|
+{
|
|
|
+ ImGuiGetNameFromIndexOldToNewCallbackData old_to_new_data = { user_data, old_getter };
|
|
|
+ return Combo(label, current_item, ImGuiGetNameFromIndexOldToNewCallback, &old_to_new_data, items_count, popup_max_height_in_items);
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
//-------------------------------------------------------------------------
|
|
|
// [SECTION] Data Type and Data Formatting Helpers [Internal]
|
|
|
//-------------------------------------------------------------------------
|
|
@@ -6879,7 +6897,7 @@ bool ImGui::ListBox(const char* label, int* current_item, const char* const item
|
|
|
|
|
|
// This is merely a helper around BeginListBox(), EndListBox().
|
|
|
// Considering using those directly to submit custom data or store selection differently.
|
|
|
-bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items)
|
|
|
+bool ImGui::ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int height_in_items)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
|
|
@@ -6900,8 +6918,8 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v
|
|
|
while (clipper.Step())
|
|
|
for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
|
|
|
{
|
|
|
- const char* item_text;
|
|
|
- if (!items_getter(data, i, &item_text))
|
|
|
+ const char* item_text = getter(user_data, i);
|
|
|
+ if (item_text == NULL)
|
|
|
item_text = "*Unknown item*";
|
|
|
|
|
|
PushID(i);
|