mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	InputText: Reworked prev/next-word behavior . Include period as delimiter and tweak prev/next words logic. (#6067)
This commit is contained in:
		| @@ -44,6 +44,9 @@ Other changes: | |||||||
|   retaining underlying data. While we don't really want to encourage user not retaining |   retaining underlying data. While we don't really want to encourage user not retaining | ||||||
|   underlying data, in the absence of a "late commit" behavior/flag we understand it may |   underlying data, in the absence of a "late commit" behavior/flag we understand it may | ||||||
|   be desirable to take advantage of this trick. (#4714) |   be desirable to take advantage of this trick. (#4714) | ||||||
|  | - InputText: Reworked prev/next-word behavior to more closely match Visual Studio | ||||||
|  |   text editor. Include '.' as a delimiter and alter varying subtle behavior with how | ||||||
|  |   blanks and separators are treated when skipping words. (#6067) [@ajweeks] | ||||||
| - Drag, Sliders: Fixed parsing of text input when '+' or '#' format flags are used | - Drag, Sliders: Fixed parsing of text input when '+' or '#' format flags are used | ||||||
|   in the format string. (#6259) [@idbrii] |   in the format string. (#6259) [@idbrii] | ||||||
| - Nav: Made Ctrl+Tab/Ctrl+Shift+Tab windowing register ownership to held modifier so | - Nav: Made Ctrl+Tab/Ctrl+Shift+Tab windowing register ownership to held modifier so | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -23,7 +23,7 @@ | |||||||
| // Library Version | // Library Version | ||||||
| // (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM > 12345') | // (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM > 12345') | ||||||
| #define IMGUI_VERSION               "1.89.5 WIP" | #define IMGUI_VERSION               "1.89.5 WIP" | ||||||
| #define IMGUI_VERSION_NUM           18944 | #define IMGUI_VERSION_NUM           18945 | ||||||
| #define IMGUI_HAS_TABLE | #define IMGUI_HAS_TABLE | ||||||
|  |  | ||||||
| /* | /* | ||||||
|   | |||||||
| @@ -3700,10 +3700,34 @@ static void    STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* ob | |||||||
|     r->num_chars = (int)(text_remaining - (text + line_start_idx)); |     r->num_chars = (int)(text_remaining - (text + line_start_idx)); | ||||||
| } | } | ||||||
|  |  | ||||||
| // When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators. | static bool is_separator(unsigned int c) | ||||||
| static bool is_separator(unsigned int c)                                        { return ImCharIsBlankW(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|' || c=='\n' || c=='\r'; } | { | ||||||
| static int  is_word_boundary_from_right(ImGuiInputTextState* obj, int idx)      { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (is_separator(obj->TextW[idx - 1]) && !is_separator(obj->TextW[idx]) ) : 1; } |     return c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|' || c=='\n' || c=='\r' || c=='.' || c=='!'; | ||||||
| static int  is_word_boundary_from_left(ImGuiInputTextState* obj, int idx)       { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (!is_separator(obj->TextW[idx - 1]) && is_separator(obj->TextW[idx])) : 1; } | } | ||||||
|  |  | ||||||
|  | static int is_word_boundary_from_right(ImGuiInputTextState* obj, int idx) | ||||||
|  | { | ||||||
|  |     // When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators. | ||||||
|  |     if ((obj->Flags & ImGuiInputTextFlags_Password) || idx <= 0) | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     bool prev_white = ImCharIsBlankW(obj->TextW[idx - 1]); | ||||||
|  |     bool prev_separ = is_separator(obj->TextW[idx - 1]); | ||||||
|  |     bool curr_white = ImCharIsBlankW(obj->TextW[idx]); | ||||||
|  |     bool curr_separ = is_separator(obj->TextW[idx]); | ||||||
|  |     return ((prev_white || prev_separ) && !(curr_separ || curr_white)) || (curr_separ && !prev_separ); | ||||||
|  | } | ||||||
|  | static int is_word_boundary_from_left(ImGuiInputTextState* obj, int idx) | ||||||
|  | { | ||||||
|  |     if ((obj->Flags & ImGuiInputTextFlags_Password) || idx <= 0) | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     bool prev_white = ImCharIsBlankW(obj->TextW[idx]); | ||||||
|  |     bool prev_separ = is_separator(obj->TextW[idx]); | ||||||
|  |     bool curr_white = ImCharIsBlankW(obj->TextW[idx - 1]); | ||||||
|  |     bool curr_separ = is_separator(obj->TextW[idx - 1]); | ||||||
|  |     return ((prev_white) && !(curr_separ || curr_white)) || (curr_separ && !prev_separ); | ||||||
|  | } | ||||||
| static int  STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx)   { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; } | static int  STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx)   { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; } | ||||||
| static int  STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx)   { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; } | static int  STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx)   { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; } | ||||||
| static int  STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx)   { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; } | static int  STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx)   { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user