Return false to discard a character.
| 10009 | |
| 10010 | // Return false to discard a character. |
| 10011 | static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data) |
| 10012 | { |
| 10013 | unsigned int c = *p_char; |
| 10014 | |
| 10015 | if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF))) |
| 10016 | { |
| 10017 | bool pass = false; |
| 10018 | pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); |
| 10019 | pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput)); |
| 10020 | if (!pass) |
| 10021 | return false; |
| 10022 | } |
| 10023 | |
| 10024 | 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. |
| 10025 | return false; |
| 10026 | |
| 10027 | if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank)) |
| 10028 | { |
| 10029 | if (flags & ImGuiInputTextFlags_CharsDecimal) |
| 10030 | if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/')) |
| 10031 | return false; |
| 10032 | |
| 10033 | if (flags & ImGuiInputTextFlags_CharsHexadecimal) |
| 10034 | if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) |
| 10035 | return false; |
| 10036 | |
| 10037 | if (flags & ImGuiInputTextFlags_CharsUppercase) |
| 10038 | if (c >= 'a' && c <= 'z') |
| 10039 | *p_char = (c += (unsigned int)('A' - 'a')); |
| 10040 | |
| 10041 | if (flags & ImGuiInputTextFlags_CharsNoBlank) |
| 10042 | if (ImCharIsSpace(c)) |
| 10043 | return false; |
| 10044 | } |
| 10045 | |
| 10046 | if (flags & ImGuiInputTextFlags_CallbackCharFilter) |
| 10047 | { |
| 10048 | ImGuiTextEditCallbackData callback_data; |
| 10049 | memset(&callback_data, 0, sizeof(ImGuiTextEditCallbackData)); |
| 10050 | callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter; |
| 10051 | callback_data.EventChar = (ImWchar)c; |
| 10052 | callback_data.Flags = flags; |
| 10053 | callback_data.UserData = user_data; |
| 10054 | if (callback(&callback_data) != 0) |
| 10055 | return false; |
| 10056 | *p_char = callback_data.EventChar; |
| 10057 | if (!callback_data.EventChar) |
| 10058 | return false; |
| 10059 | } |
| 10060 | |
| 10061 | return true; |
| 10062 | } |
| 10063 | |
| 10064 | // Edit a string of text |
| 10065 | // 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