mirror of
https://github.com/ocornut/imgui.git
synced 2025-02-06 14:24:29 +01:00
Combo: Moved functions (untouched).
This commit is contained in:
parent
a5e9392140
commit
e998c7d3e3
98
imgui.cpp
98
imgui.cpp
@ -9061,55 +9061,6 @@ bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_fla
|
|||||||
return InputIntN(label, v, 4, extra_flags);
|
return InputIntN(label, v, 4, extra_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool Items_ArrayGetter(void* data, int idx, const char** out_text)
|
|
||||||
{
|
|
||||||
const char* const* items = (const char* const*)data;
|
|
||||||
if (out_text)
|
|
||||||
*out_text = items[idx];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
|
|
||||||
{
|
|
||||||
// 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;
|
|
||||||
while (*p)
|
|
||||||
{
|
|
||||||
if (idx == items_count)
|
|
||||||
break;
|
|
||||||
p += strlen(p) + 1;
|
|
||||||
items_count++;
|
|
||||||
}
|
|
||||||
if (!*p)
|
|
||||||
return false;
|
|
||||||
if (out_text)
|
|
||||||
*out_text = p;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Combo box helper allowing to pass an array of strings.
|
|
||||||
bool ImGui::Combo(const char* label, int* current_item, const char* const* items, int items_count, int height_in_items)
|
|
||||||
{
|
|
||||||
const bool value_changed = Combo(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_in_items);
|
|
||||||
return value_changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Combo box helper allowing to pass all items in a single string.
|
|
||||||
bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items)
|
|
||||||
{
|
|
||||||
int items_count = 0;
|
|
||||||
const char* p = items_separated_by_zeros; // FIXME-OPT: Avoid computing this, or at least only when combo is open
|
|
||||||
while (*p)
|
|
||||||
{
|
|
||||||
p += strlen(p) + 1;
|
|
||||||
items_count++;
|
|
||||||
}
|
|
||||||
bool value_changed = Combo(label, current_item, Items_SingleStringGetter, (void*)items_separated_by_zeros, items_count, height_in_items);
|
|
||||||
return value_changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
static float CalcMaxPopupHeightFromItemCount(int items_count)
|
static float CalcMaxPopupHeightFromItemCount(int items_count)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -9262,6 +9213,55 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi
|
|||||||
return value_changed;
|
return value_changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool Items_ArrayGetter(void* data, int idx, const char** out_text)
|
||||||
|
{
|
||||||
|
const char* const* items = (const char* const*)data;
|
||||||
|
if (out_text)
|
||||||
|
*out_text = items[idx];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
|
||||||
|
{
|
||||||
|
// 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;
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
if (idx == items_count)
|
||||||
|
break;
|
||||||
|
p += strlen(p) + 1;
|
||||||
|
items_count++;
|
||||||
|
}
|
||||||
|
if (!*p)
|
||||||
|
return false;
|
||||||
|
if (out_text)
|
||||||
|
*out_text = p;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Combo box helper allowing to pass an array of strings.
|
||||||
|
bool ImGui::Combo(const char* label, int* current_item, const char* const* items, int items_count, int height_in_items)
|
||||||
|
{
|
||||||
|
const bool value_changed = Combo(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_in_items);
|
||||||
|
return value_changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Combo box helper allowing to pass all items in a single string.
|
||||||
|
bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items)
|
||||||
|
{
|
||||||
|
int items_count = 0;
|
||||||
|
const char* p = items_separated_by_zeros; // FIXME-OPT: Avoid computing this, or at least only when combo is open
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
p += strlen(p) + 1;
|
||||||
|
items_count++;
|
||||||
|
}
|
||||||
|
bool value_changed = Combo(label, current_item, Items_SingleStringGetter, (void*)items_separated_by_zeros, items_count, height_in_items);
|
||||||
|
return value_changed;
|
||||||
|
}
|
||||||
|
|
||||||
// Tip: pass an empty label (e.g. "##dummy") then you can use the space to draw other text or image.
|
// Tip: pass an empty label (e.g. "##dummy") then you can use the space to draw other text or image.
|
||||||
// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID.
|
// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID.
|
||||||
bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)
|
bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user