@ -149,6 +149,7 @@
Here is a change - log of API breaking changes , if you are using one of the functions listed , expect to have to fix some code .
Also read releases logs https : //github.com/ocornut/imgui/releases for more details.
- 2016 / 03 / 02 ( 1.48 ) - InputText ( ) completion / history / always callbacks : if you modify the text buffer manually ( without using DeleteChars ( ) / InsertChars ( ) helper ) you need to maintain the BufTextLen field . added an assert .
- 2016 / 01 / 23 ( 1.48 ) - fixed not honoring exact width passed to PushItemWidth ( ) , previously it would add extra FramePadding . x * 2 over that width . if you had manual pixel - perfect alignment in place it might affect you .
- 2015 / 12 / 27 ( 1.48 ) - fixed ImDrawList : : AddRect ( ) which used to render a rectangle 1 px too large on each axis .
- 2015 / 12 / 04 ( 1.47 ) - renamed Color ( ) helpers to ValueColor ( ) - dangerously named , rarely used and probably to be made obsolete .
@ -7117,41 +7118,41 @@ void ImGuiTextEditState::OnKeyPressed(int key)
// Public API to manipulate UTF-8 text
// We expose UTF-8 to the user (unlike the STB_TEXTEDIT_* functions which are manipulating wchar)
// FIXME: The existence of this rarely exercised code path is a bit of a nuisance.
void ImGuiTextEditCallbackData : : DeleteChars ( int pos , int bytes_count )
{
IM_ASSERT ( pos + bytes_count < = BufTextLen ) ;
char * dst = Buf + pos ;
const char * src = Buf + pos + bytes_count ;
while ( char c = * src + + )
* dst + + = c ;
* dst = ' \0 ' ;
BufDirty = true ;
if ( CursorPos + bytes_count > = pos )
CursorPos - = bytes_count ;
else if ( CursorPos > = pos )
CursorPos = pos ;
SelectionStart = SelectionEnd = CursorPos ;
BufDirty = true ;
BufTextLen - = bytes_count ;
}
void ImGuiTextEditCallbackData : : InsertChars ( int pos , const char * new_text , const char * new_text_end )
{
const int text_len = ( int ) strlen ( Buf ) ;
if ( ! new_text_end )
new_text_end = new_text + strlen ( new_text ) ;
const int new_text_len = ( int ) ( new_text_end - new_text ) ;
if ( new_text_len + text_len + 1 > = BufSize )
const int new_text_len = new_text_end ? ( int ) ( new_text_end - new_text ) : ( int ) strlen ( new_text ) ;
if ( new_text_len + BufTextLen + 1 > = BufSize )
return ;
if ( text_l en ! = pos )
memmove ( Buf + pos + new_text_len , Buf + pos , ( size_t ) ( text_l en - pos ) ) ;
if ( BufTextLen ! = pos )
memmove ( Buf + pos + new_text_len , Buf + pos , ( size_t ) ( BufTextLen - pos ) ) ;
memcpy ( Buf + pos , new_text , ( size_t ) new_text_len * sizeof ( char ) ) ;
Buf [ text_l en + new_text_len ] = ' \0 ' ;
Buf [ BufTextL en + new_text_len ] = ' \0 ' ;
BufDirty = true ;
if ( CursorPos > = pos )
CursorPos + = new_text_len ;
SelectionStart = SelectionEnd = CursorPos ;
BufDirty = true ;
BufTextLen + = new_text_len ;
}
// Return false to discard a character.
@ -7543,6 +7544,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
if ( event_key ! = ImGuiKey_COUNT | | ( flags & ImGuiInputTextFlags_CallbackAlways ) ! = 0 )
{
ImGuiTextEditCallbackData callback_data ;
memset ( & callback_data , 0 , sizeof ( ImGuiTextEditCallbackData ) ) ;
callback_data . EventFlag = event_flag ;
callback_data . Flags = flags ;
callback_data . UserData = user_data ;
@ -7550,10 +7552,11 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
callback_data . EventKey = event_key ;
callback_data . Buf = edit_state . TempTextBuffer . Data ;
callback_data . BufTextLen = edit_state . CurLenA ;
callback_data . BufSize = edit_state . BufSizeA ;
callback_data . BufDirty = false ;
// We have to convert from position from wchar to UTF-8 positions
// We have to convert from wchar-positions to UTF-8-positions, which can be pretty slow (an incentive to ditch the ImWchar buffer, see https://github.com/nothings/stb/issues/188)
ImWchar * text = edit_state . Text . Data ;
const int utf8_cursor_pos = callback_data . CursorPos = ImTextCountUtf8BytesFromStr ( text , text + edit_state . StbState . cursor ) ;
const int utf8_selection_start = callback_data . SelectionStart = ImTextCountUtf8BytesFromStr ( text , text + edit_state . StbState . select_start ) ;
@ -7571,8 +7574,9 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
if ( callback_data . SelectionEnd ! = utf8_selection_end ) edit_state . StbState . select_end = ImTextCountCharsFromUtf8 ( callback_data . Buf , callback_data . Buf + callback_data . SelectionEnd ) ;
if ( callback_data . BufDirty )
{
edit_state . CurLenW = ImTextStrFromUtf8 ( text , edit_state . Text . Size , edit_state . TempTextBuffer . Data , NULL ) ;
edit_state . CurLenA = ( int ) strlen ( edit_state . TempTextBuffer . Data ) ;
IM_ASSERT ( callback_data . BufTextLen = = ( int ) strlen ( callback_data . Buf ) ) ; // You need to maintain BufTextLen if you change the text!
edit_state . CurLenW = ImTextStrFromUtf8 ( edit_state . Text . Data , edit_state . Text . Size , callback_data . Buf , NULL ) ;
edit_state . CurLenA = callback_data . BufTextLen ; // Assume correct length and valid UTF-8 from user, saves us an extra strlen()
edit_state . CursorAnimReset ( ) ;
}
}