@ -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 ) ;