@ -2691,7 +2691,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.
@ -2893,47 +2893,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 : : InputTextHinted ( const char * label , const char * hint , char * buf , size_t buf_size , bool * is_user_data , ImGuiInputTextFlags flags , ImGuiInputTextCallback callback , void * user_data )
bool ImGui : : InputTextHinted ( const char * label , const char * hint , char * buf , size_t buf_size , ImGuiInputTextFlags flags , ImGuiInputTextCallback callback , void * user_data )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
const ImGuiID id = window - > GetID ( label ) ;
if ( id ! = GetActiveID ( ) ) {
if ( buf_size > 0 & & ! * buf ) {
unsigned int len = ( unsigned int ) strlen ( hint ) + 1 ;
IM_ASSERT ( buf_size > = len ) ;
memcpy ( buf , hint , len ) ;
* is_user_data = false ;
}
} else {
if ( ! * is_user_data ) {
ImGuiInputTextState & state = GImGui - > InputTextState ;
state . TextW [ 0 ] = ' \0 ' ;
state . CurLenW = 0 ;
state . TextA [ 0 ] = ' \0 ' ;
state . CurLenA = 0 ;
state . InitialTextA [ 0 ] = ' \0 ' ;
state . Stb . cursor = 0 ;
* is_user_data = true ;
}
}
if ( ! * is_user_data ) {
ImGuiInputTextFlags CallbackFlags = ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackAlways | ImGuiInputTextFlags_CallbackCharFilter ;
InputTextEx ( label , buf , ( int ) buf_size , ImVec2 ( 0 , 0 ) , ( flags | ImGuiInputTextFlags_ShowTextAsDisabled ) & ~ CallbackFlags , NULL , NULL ) ;
return false ;
} else {
return InputTextEx ( label , buf , ( int ) buf_size , ImVec2 ( 0 , 0 ) , flags , callback , 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 )
@ -3228,7 +3198,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 )
@ -3754,6 +3724,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.
@ -3892,11 +3863,24 @@ 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 ;
if ( is_multiline | | ( buf_display_end - buf_display ) < buf_display_max_length ) {
ImGuiCol text_color = flags & ImGuiInputTextFlags_ShowTextAsDisabled ? ImGuiCol_TextDisabled : ImGuiCol_Text ;
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 )
{
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 ) ;
}
@ -3907,10 +3891,8 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
bool cursor_is_visible = ( ! g . IO . ConfigInputTextCursorBlink ) | | ( state - > CursorAnim < = 0.0f ) | | ImFmod ( state - > CursorAnim , 1.20f ) < = 0.80f ;
ImVec2 cursor_screen_pos = draw_pos + cursor_offset - draw_scroll ;
ImRect cursor_screen_rect ( cursor_screen_pos . x , cursor_screen_pos . y - g . FontSize + 0.5f , cursor_screen_pos . x + 1.0f , cursor_screen_pos . y - 1.5f ) ;
if ( cursor_is_visible & & cursor_screen_rect . Overlaps ( clip_rect ) ) {
ImGuiCol text_color = flags & ImGuiInputTextFlags_ShowTextAsDisabled ? ImGuiCol_TextDisabled : ImGuiCol_Text ;
draw_window - > DrawList - > AddLine ( cursor_screen_rect . Min , cursor_screen_rect . GetBL ( ) , GetColorU32 ( text_color ) ) ;
}
if ( cursor_is_visible & & cursor_screen_rect . Overlaps ( clip_rect ) )
draw_window - > DrawList - > AddLine ( cursor_screen_rect . Min , cursor_screen_rect . GetBL ( ) , GetColorU32 ( ImGuiCol_Text ) ) ;
// Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)
if ( ! is_readonly )
@ -3920,15 +3902,25 @@ 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 )
if ( is_multiline & & buf_display )
text_size = ImVec2 ( size . x , InputTextCalcTextLenAndLineCount ( buf_display , & buf_display_end ) * g . FontSize ) ; // We don't need width
else if ( g . ActiveId = = id )
buf_display_end = buf_display + state - > CurLenA ;
else
buf_display_end = buf_display + strlen ( buf_display ) ;
if ( is_multiline | | ( buf_display_end - buf_display ) < buf_display_max_length ) {
ImGuiCol text_color = flags & ImGuiInputTextFlags_ShowTextAsDisabled ? ImGuiCol_TextDisabled : ImGuiCol_Text ;
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 )
{
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 ) ;
}
}