Return false to discard a character.
| 8345 | |
| 8346 | // Return false to discard a character. |
| 8347 | static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data) |
| 8348 | { |
| 8349 | unsigned int c = *p_char; |
| 8350 | |
| 8351 | if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF))) |
| 8352 | { |
| 8353 | bool pass = false; |
| 8354 | pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); |
| 8355 | pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput)); |
| 8356 | if (!pass) |
| 8357 | return false; |
| 8358 | } |
| 8359 | |
| 8360 | 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. |
| 8361 | return false; |
| 8362 | |
| 8363 | if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank)) |
| 8364 | { |
| 8365 | if (flags & ImGuiInputTextFlags_CharsDecimal) |
| 8366 | if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/')) |
| 8367 | return false; |
| 8368 | |
| 8369 | if (flags & ImGuiInputTextFlags_CharsHexadecimal) |
| 8370 | if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) |
| 8371 | return false; |
| 8372 | |
| 8373 | if (flags & ImGuiInputTextFlags_CharsUppercase) |
| 8374 | if (c >= 'a' && c <= 'z') |
| 8375 | *p_char = (c += (unsigned int)('A'-'a')); |
| 8376 | |
| 8377 | if (flags & ImGuiInputTextFlags_CharsNoBlank) |
| 8378 | if (ImCharIsSpace(c)) |
| 8379 | return false; |
| 8380 | } |
| 8381 | |
| 8382 | if (flags & ImGuiInputTextFlags_CallbackCharFilter) |
| 8383 | { |
| 8384 | ImGuiTextEditCallbackData callback_data; |
| 8385 | memset(&callback_data, 0, sizeof(ImGuiTextEditCallbackData)); |
| 8386 | callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter; |
| 8387 | callback_data.EventChar = (ImWchar)c; |
| 8388 | callback_data.Flags = flags; |
| 8389 | callback_data.UserData = user_data; |
| 8390 | if (callback(&callback_data) != 0) |
| 8391 | return false; |
| 8392 | *p_char = callback_data.EventChar; |
| 8393 | if (!callback_data.EventChar) |
| 8394 | return false; |
| 8395 | } |
| 8396 | |
| 8397 | return true; |
| 8398 | } |
| 8399 | |
| 8400 | // Edit a string of text |
| 8401 | // NB: when active, hold on a privately held copy of the text (and apply back to 'buf'). So changing 'buf' while active has no effect. |
no test coverage detected