@ -129,6 +129,7 @@
Occasionally introducing changes that are breaking the API . The breakage are generally minor and easy to fix .
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 .
- 2015 / 02 / 11 ( 1.32 ) - changed text input callback ImGuiTextEditCallback return type from void - - > int . reserved for future use , return 0 for now .
- 2015 / 02 / 10 ( 1.32 ) - renamed GetItemWidth ( ) to CalcItemWidth ( ) to clarify its evolving behavior
- 2015 / 02 / 08 ( 1.31 ) - renamed GetTextLineSpacing ( ) to GetTextLineHeightWithSpacing ( )
- 2015 / 02 / 01 ( 1.31 ) - removed IO . MemReallocFn ( unused )
@ -5223,27 +5224,44 @@ void ImGuiTextEditCallbackData::InsertChars(int pos, const char* new_text, const
SelectionStart = SelectionEnd = CursorPos ;
}
static bool InputTextFilterCharacter ( ImWchar c , ImGuiInputTextFlags flags )
// Return false to discard a character.
static bool InputTextFilterCharacter ( unsigned int * p_char , ImGuiInputTextFlags flags , ImGuiTextEditCallback callback , void * user_data )
{
unsigned int c = * p_char ;
if ( c < 128 & & c ! = ' ' & & ! isprint ( ( int ) ( c & 0xFF ) ) )
return true ;
return fals e;
if ( c > = 0xE000 & & c < = 0xF8FF ) // Filter private Unicode range. I don't imagine anybody would want to input them. GLFW on OSX seems to send private characters for special keys like arrow keys.
return tru e;
return fals e;
if ( flags & ImGuiInputTextFlags_CharsDecimal )
if ( ! ( c > = ' 0 ' & & c < = ' 9 ' ) & & ( c ! = ' . ' ) & & ( c ! = ' - ' ) & & ( c ! = ' + ' ) & & ( c ! = ' * ' ) & & ( c ! = ' / ' ) )
return tru e;
return fals e;
if ( flags & ImGuiInputTextFlags_CharsHexadecimal )
if ( ! ( c > = ' 0 ' & & c < = ' 9 ' ) & & ! ( c > = ' a ' & & c < = ' f ' ) & & ! ( c > = ' A ' & & c < = ' F ' ) )
return tru e;
return fals e;
return false ;
if ( flags & ImGuiInputTextFlags_CallbackCharFilter )
{
ImGuiTextEditCallbackData callback_data ;
memset ( & callback_data , 0 , sizeof ( ImGuiTextEditCallbackData ) ) ;
callback_data . EventFlag = ImGuiInputTextFlags_CallbackCharFilter ;
callback_data . EventChar = c ;
callback_data . Flags = flags ;
callback_data . UserData = user_data ;
callback ( & callback_data ) ;
* p_char = callback_data . EventChar ;
if ( ! callback_data . EventChar )
return false ;
}
return true ;
}
// Edit a string of text
bool ImGui : : InputText ( const char * label , char * buf , size_t buf_size , ImGuiInputTextFlags flags , void ( * callback ) ( ImGuiTextEditCallbackData * ) , void * user_data )
bool ImGui : : InputText ( const char * label , char * buf , size_t buf_size , ImGuiInputTextFlags flags , ImGuiTextEditCallback callback , void * user_data )
{
ImGuiState & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
@ -5344,13 +5362,13 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
// Process text input (before we check for Return because using some IME will effectively send a Return?)
for ( int n = 0 ; n < IM_ARRAYSIZE ( g . IO . InputCharacters ) & & g . IO . InputCharacters [ n ] ; n + + )
{
const ImWchar c = g . IO . InputCharacters [ n ] ;
unsigned int c = ( unsigned int ) g . IO . InputCharacters [ n ] ;
if ( c )
{
// Insert character if they pass filtering
if ( InputTextFilterCharacter ( c , flags ) )
if ( ! InputTextFilterCharacter ( & c , flags , callback , user_data ) )
continue ;
edit_state . OnKeyPressed ( c ) ;
edit_state . OnKeyPressed ( ( int ) c ) ;
}
}
@ -5407,7 +5425,7 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
break ;
if ( c > = 0x10000 )
continue ;
if ( InputTextFilterCharacter ( ( ImWchar ) c , flags ) )
if ( ! InputTextFilterCharacter ( & c , flags , callback , user_data ) )
continue ;
clipboard_filtered [ clipboard_filtered_len + + ] = ( ImWchar ) c ;
}
@ -5442,17 +5460,28 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
IM_ASSERT ( callback ! = NULL ) ;
// The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment.
ImGuiInputTextFlags event_flag = 0 ;
ImGuiKey event_key = ImGuiKey_COUNT ;
if ( ( flags & ImGuiInputTextFlags_CallbackCompletion ) ! = 0 & & IsKeyPressedMap ( ImGuiKey_Tab ) )
{
event_flag = ImGuiInputTextFlags_CallbackCompletion ;
event_key = ImGuiKey_Tab ;
}
else if ( ( flags & ImGuiInputTextFlags_CallbackHistory ) ! = 0 & & IsKeyPressedMap ( ImGuiKey_UpArrow ) )
{
event_flag = ImGuiInputTextFlags_CallbackHistory ;
event_key = ImGuiKey_UpArrow ;
}
else if ( ( flags & ImGuiInputTextFlags_CallbackHistory ) ! = 0 & & IsKeyPressedMap ( ImGuiKey_DownArrow ) )
{
event_flag = ImGuiInputTextFlags_CallbackHistory ;
event_key = ImGuiKey_DownArrow ;
}
if ( event_key ! = ImGuiKey_COUNT | | ( flags & ImGuiInputTextFlags_CallbackAlways ) ! = 0 )
{
ImGuiTextEditCallbackData callback_data ;
callback_data . EventFlag = event_flag ;
callback_data . EventKey = event_key ;
callback_data . Buf = text_tmp_utf8 ;
callback_data . BufSize = edit_state . BufSize ;
@ -8313,6 +8342,33 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Filtered Text Input " ) )
{
static char buf1 [ 64 ] = " " ; ImGui : : InputText ( " default " , buf1 , 64 ) ;
static char buf2 [ 64 ] = " " ; ImGui : : InputText ( " decimal " , buf2 , 64 , ImGuiInputTextFlags_CharsDecimal ) ;
static char buf3 [ 64 ] = " " ; ImGui : : InputText ( " hexadecimal " , buf3 , 64 , ImGuiInputTextFlags_CharsHexadecimal ) ;
struct TextFilters
{
static int FilterAZ ( ImGuiTextEditCallbackData * data )
{
const ImWchar c = data - > EventChar ;
if ( ! ( ( c > = ' a ' & & c < = ' z ' ) | | c > = ' A ' & & c < = ' Z ' ) )
data - > EventChar = 0 ;
return 0 ;
}
static int FilterUppercase ( ImGuiTextEditCallbackData * data )
{
const ImWchar c = data - > EventChar ;
if ( c > = ' a ' & & c < = ' z ' )
data - > EventChar + = ' A ' - ' a ' ;
return 0 ;
}
} ;
static char buf4 [ 64 ] = " " ; ImGui : : InputText ( " a-z only " , buf4 , 64 , ImGuiInputTextFlags_CallbackCharFilter , TextFilters : : FilterAZ ) ;
static char buf5 [ 64 ] = " " ; ImGui : : InputText ( " uppercase " , buf5 , 64 , ImGuiInputTextFlags_CallbackCharFilter , TextFilters : : FilterUppercase ) ;
ImGui : : TreePop ( ) ;
}
static bool check = true ;
ImGui : : Checkbox ( " checkbox " , & check ) ;
@ -8967,18 +9023,18 @@ struct ExampleAppConsole
}
}
static void TextEditCallbackStub ( ImGuiTextEditCallbackData * data )
static int TextEditCallbackStub ( ImGuiTextEditCallbackData * data )
{
ExampleAppConsole * console = ( ExampleAppConsole * ) data - > UserData ;
console - > TextEditCallback ( data ) ;
return console - > TextEditCallback ( data ) ;
}
void TextEditCallback ( ImGuiTextEditCallbackData * data )
int TextEditCallback ( ImGuiTextEditCallbackData * data )
{
//AddLog("cursor: %d, selection: %d-%d", data->CursorPos, data->SelectionStart, data->SelectionEnd);
switch ( data - > EventKey )
switch ( data - > EventFlag )
{
case ImGuiKey_Tab :
case ImGuiInputTextFlags_CallbackCompletion :
{
// Example of TEXT COMPLETION
@ -9043,8 +9099,7 @@ struct ExampleAppConsole
break ;
}
case ImGuiKey_UpArrow :
case ImGuiKey_DownArrow :
case ImGuiInputTextFlags_CallbackHistory :
{
// Example of HISTORY
const int prev_history_pos = HistoryPos ;
@ -9071,6 +9126,7 @@ struct ExampleAppConsole
}
}
}
return 0 ;
}
} ;