@ -2692,7 +2692,7 @@ bool ImGui::InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const c
DataTypeFormatString ( data_buf , IM_ARRAYSIZE ( data_buf ) , data_type , data_ptr , format ) ;
ImStrTrimBlanks ( data_buf ) ;
ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ( ( data_type = = ImGuiDataType_Float | | data_type = = ImGuiDataType_Double ) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal ) ;
bool value_changed = InputTextEx ( label , data_buf , IM_ARRAYSIZE ( data_buf ) , bb . GetSize ( ) , flags ) ;
bool value_changed = InputTextEx ( label , NULL , data_buf , IM_ARRAYSIZE ( data_buf ) , bb . GetSize ( ) , flags ) ;
if ( g . ScalarAsInputTextId = = 0 )
{
// First frame we started displaying the InputText widget, we expect it to take the active id.
@ -2883,9 +2883,10 @@ bool ImGui::InputDouble(const char* label, double* v, double step, double step_f
}
//-------------------------------------------------------------------------
// [SECTION] Widgets: InputText, InputTextMultiline
// [SECTION] Widgets: InputText, InputTextMultiline, InputTextWithHint
//-------------------------------------------------------------------------
// - InputText()
// - InputTextWithHint()
// - InputTextMultiline()
// - InputTextEx() [Internal]
//-------------------------------------------------------------------------
@ -2893,12 +2894,17 @@ bool ImGui::InputDouble(const char* label, double* v, double step, double step_f
bool ImGui : : InputText ( const char * label , char * buf , size_t buf_size , ImGuiInputTextFlags flags , ImGuiInputTextCallback callback , void * user_data )
{
IM_ASSERT ( ! ( flags & ImGuiInputTextFlags_Multiline ) ) ; // call InputTextMultiline()
return InputTextEx ( label , buf , ( int ) buf_size , ImVec2 ( 0 , 0 ) , flags , callback , user_data ) ;
return InputTextEx ( label , NULL , buf , ( int ) buf_size , ImVec2 ( 0 , 0 ) , flags , callback , user_data ) ;
}
bool ImGui : : InputTextMultiline ( const char * label , char * buf , size_t buf_size , const ImVec2 & size , ImGuiInputTextFlags flags , ImGuiInputTextCallback callback , void * user_data )
{
return InputTextEx ( label , buf , ( int ) buf_size , size , flags | ImGuiInputTextFlags_Multiline , callback , user_data ) ;
return InputTextEx ( label , NULL , buf , ( int ) buf_size , size , flags | ImGuiInputTextFlags_Multiline , callback , user_data ) ;
}
bool ImGui : : InputTextWithHint ( const char * label , const char * hint , char * buf , size_t buf_size , ImGuiInputTextFlags flags , ImGuiInputTextCallback callback , void * user_data )
{
return InputTextEx ( label , hint , buf , ( int ) buf_size , ImVec2 ( 0 , 0 ) , flags , callback , user_data ) ;
}
static int InputTextCalcTextLenAndLineCount ( const char * text_begin , const char * * out_text_end )
@ -3193,7 +3199,7 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
// - If you want to use ImGui::InputText() with std::string, see misc/cpp/imgui_stdlib.h
// (FIXME: Rather confusing and messy function, among the worse part of our codebase, expecting to rewrite a V2 at some point.. Partly because we are
// doing UTF8 > U16 > UTF8 conversions on the go to easily interface with stb_textedit. Ideally should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188)
bool ImGui : : InputTextEx ( const char * label , char * buf , int buf_size , const ImVec2 & size_arg , ImGuiInputTextFlags flags , ImGuiInputTextCallback callback , void * callback_user_data )
bool ImGui : : InputTextEx ( const char * label , const char * hint , char * buf , int buf_size , const ImVec2 & size_arg , ImGuiInputTextFlags flags , ImGuiInputTextCallback callback , void * callback_user_data )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
@ -3725,6 +3731,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
const int buf_display_max_length = 2 * 1024 * 1024 ;
const char * buf_display = NULL ;
const char * buf_display_end = NULL ;
ImGuiCol text_color = ImGuiCol_COUNT ;
// Render text. We currently only render selection when the widget is active or while scrolling.
// FIXME: We could remove the '&& render_cursor' to keep rendering selection when inactive.
@ -3861,11 +3868,26 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
}
}
// We test for 'buf_display_max_length' as a way to avoid some pathological cases (e.g. single-line 1 MB string) which would make ImDrawList crash.
if ( state - > CurLenA ! = 0 | | hint = = NULL )
{
buf_display = ( ! is_readonly & & state - > TextAIsValid ) ? state - > TextA . Data : buf ;
buf_display_end = buf_display + state - > CurLenA ;
text_color = ImGuiCol_Text ;
}
else
{
buf_display = hint ;
buf_display_end = hint + strlen ( hint ) ;
text_color = ImGuiCol_TextDisabled ;
}
// We test for 'buf_display_max_length' as a way to avoid some pathological cases (e.g. single-line 1 MB string) which would make ImDrawList crash.
if ( is_multiline | | ( buf_display_end - buf_display ) < buf_display_max_length )
draw_window - > DrawList - > AddText ( g . Font , g . FontSize , draw_pos - draw_scroll , GetColorU32 ( ImGuiCol_Text ) , buf_display , buf_display_end , 0.0f , is_multiline ? NULL : & clip_rect ) ;
{
IM_ASSERT ( text_color ! = ImGuiCol_COUNT ) ;
draw_window - > DrawList - > AddText ( g . Font , g . FontSize , draw_pos - draw_scroll , GetColorU32 ( text_color ) , buf_display , buf_display_end , 0.0f , is_multiline ? NULL : & clip_rect ) ;
}
// Draw blinking cursor
if ( render_cursor )
@ -3885,6 +3907,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
else
{
// Render text only (no selection, no cursor)
text_color = ImGuiCol_Text ;
buf_display = ( g . ActiveId = = id & & ! is_readonly & & state - > TextAIsValid ) ? state - > TextA . Data : buf ;
if ( is_multiline )
text_size = ImVec2 ( size . x , InputTextCalcTextLenAndLineCount ( buf_display , & buf_display_end ) * g . FontSize ) ; // We don't need width
@ -3892,8 +3915,19 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
buf_display_end = buf_display + state - > CurLenA ;
else
buf_display_end = buf_display + strlen ( buf_display ) ;
if ( buf_display_end = = buf_display & & hint ! = NULL )
{
buf_display = hint ;
buf_display_end = buf_display + strlen ( buf_display ) ;
text_color = ImGuiCol_TextDisabled ;
}
if ( is_multiline | | ( buf_display_end - buf_display ) < buf_display_max_length )
draw_window - > DrawList - > AddText ( g . Font , g . FontSize , draw_pos , GetColorU32 ( ImGuiCol_Text ) , buf_display , buf_display_end , 0.0f , is_multiline ? NULL : & clip_rect ) ;
{
IM_ASSERT ( text_color ! = ImGuiCol_COUNT ) ;
draw_window - > DrawList - > AddText ( g . Font , g . FontSize , draw_pos , GetColorU32 ( text_color ) , buf_display , buf_display_end , 0.0f , is_multiline ? NULL : & clip_rect ) ;
}
}
if ( is_multiline )