2
0
Эх сурвалжийг харах

Fix whole word search missing occurences

Bernhard Liebl 7 жил өмнө
parent
commit
3af5dfbbf3
1 өөрчлөгдсөн 29 нэмэгдсэн , 16 устгасан
  1. 29 16
      scene/gui/text_edit.cpp

+ 29 - 16
scene/gui/text_edit.cpp

@@ -4467,31 +4467,44 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l
 
 		int pos_from = 0;
 		int last_pos = -1;
-		while ((last_pos = (p_search_flags & SEARCH_MATCH_CASE) ? text_line.find(p_key, pos_from) : text_line.findn(p_key, pos_from)) != -1) {
 
-			if (p_search_flags & SEARCH_BACKWARDS) {
+		while (true) {
 
-				if (last_pos > from_column)
-					break;
-				pos = last_pos;
+			while ((last_pos = (p_search_flags & SEARCH_MATCH_CASE) ? text_line.find(p_key, pos_from) : text_line.findn(p_key, pos_from)) != -1) {
 
-			} else {
+				if (p_search_flags & SEARCH_BACKWARDS) {
 
-				if (last_pos >= from_column) {
+					if (last_pos > from_column)
+						break;
 					pos = last_pos;
-					break;
+
+				} else {
+
+					if (last_pos >= from_column) {
+						pos = last_pos;
+						break;
+					}
 				}
+
+				pos_from = last_pos + p_key.length();
 			}
 
-			pos_from = last_pos + p_key.length();
-		}
+			bool is_match = true;
+
+			if (pos != -1 && (p_search_flags & SEARCH_WHOLE_WORDS)) {
+				//validate for whole words
+				if (pos > 0 && _is_text_char(text_line[pos - 1]))
+					is_match = false;
+				else if (pos + p_key.length() < text_line.length() && _is_text_char(text_line[pos + p_key.length()]))
+					is_match = false;
+			}
+
+			if (is_match || last_pos == -1 || pos == -1) {
+				break;
+			}
 
-		if (pos != -1 && (p_search_flags & SEARCH_WHOLE_WORDS)) {
-			//validate for whole words
-			if (pos > 0 && _is_text_char(text_line[pos - 1]))
-				pos = -1;
-			else if (_is_text_char(text_line[pos + p_key.length()]))
-				pos = -1;
+			pos_from = pos + 1;
+			pos = -1;
 		}
 
 		if (pos != -1)