mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Fix clipboard pasting into an InputText box not filtering the characters according to input box semantic (number, etc.)
This commit is contained in:
		
							
								
								
									
										40
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -231,7 +231,6 @@ | ||||
|  - text edit: centered text for slider or input text to it matches typical positioning. | ||||
|  - text edit: flag to disable live update of the user buffer.  | ||||
|  - text edit: field resize behavior - field could stretch when being edited? hover tooltip shows more text? | ||||
|  - text edit: pasting text into a number box should filter the characters the same way direct input does | ||||
|  - text edit: add multi-line text edit | ||||
|  - settings: write more decent code to allow saving/loading new fields | ||||
|  - settings: api for per-tool simple persistent data (bool,int,float) in .ini file | ||||
| @@ -4730,6 +4729,22 @@ void ImGuiTextEditCallbackData::InsertChars(int pos, const char* new_text, const | ||||
|     SelectionStart = SelectionEnd = CursorPos; | ||||
| } | ||||
|  | ||||
| static bool InputTextFilterCharacter(ImWchar c, ImGuiInputTextFlags flags) | ||||
| { | ||||
| 	if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF))) | ||||
| 		return true; | ||||
|  | ||||
| 	if (flags & ImGuiInputTextFlags_CharsDecimal) | ||||
| 		if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/')) | ||||
| 			return true; | ||||
|  | ||||
| 	if (flags & ImGuiInputTextFlags_CharsHexadecimal) | ||||
| 		if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) | ||||
| 			return true; | ||||
|  | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| // 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) | ||||
| { | ||||
| @@ -4876,14 +4891,15 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT | ||||
|                         if (bytes_count <= 0) | ||||
|                             break; | ||||
|                         s += bytes_count; | ||||
|                         if (c == '\n' || c == '\r') | ||||
|                             continue; | ||||
|                         if (c >= 0x10000) | ||||
|                             continue; | ||||
|                         clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; | ||||
| 						if (InputTextFilterCharacter((ImWchar)c, flags)) | ||||
| 							continue; | ||||
| 						clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; | ||||
|                     } | ||||
|                     clipboard_filtered[clipboard_filtered_len] = 0; | ||||
|                     stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len); | ||||
|                     if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation | ||||
| 						stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len); | ||||
|                     ImGui::MemFree(clipboard_filtered); | ||||
|                 } | ||||
|             } | ||||
| @@ -4896,17 +4912,9 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT | ||||
|                 const ImWchar c = g.IO.InputCharacters[n]; | ||||
|                 if (c) | ||||
|                 { | ||||
|                     // Filter | ||||
|                     if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF))) | ||||
|                         continue; | ||||
|                     if (flags & ImGuiInputTextFlags_CharsDecimal) | ||||
|                         if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/')) | ||||
|                             continue; | ||||
|                     if (flags & ImGuiInputTextFlags_CharsHexadecimal) | ||||
|                         if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) | ||||
|                             continue; | ||||
|  | ||||
|                     // Insert character! | ||||
| 					// Insert character if they pass filtering | ||||
| 					if (InputTextFilterCharacter(c, flags)) | ||||
| 						continue; | ||||
|                     edit_state.OnKeyPressed(c); | ||||
|                 } | ||||
|             } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user