瀏覽代碼

Display a count of matches when searching in the code editor

Fixes #14513
Bojidar Marinov 6 年之前
父節點
當前提交
862369f842
共有 2 個文件被更改,包括 42 次插入1 次删除
  1. 40 1
      editor/code_editor.cpp
  2. 2 0
      editor/code_editor.h

+ 40 - 1
editor/code_editor.cpp

@@ -161,7 +161,8 @@ bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col)
 		result_line = line;
 		result_col = col;
 
-		set_error("");
+		_update_results_count();
+		set_error(vformat(TTR("Found %d matches(s)."), results_count));
 	} else {
 		result_line = -1;
 		result_col = -1;
@@ -184,6 +185,8 @@ void FindReplaceBar::_replace() {
 		text_edit->insert_text_at_cursor(get_replace_text());
 
 		text_edit->end_complex_operation();
+
+		results_count = -1;
 	}
 
 	search_current();
@@ -271,6 +274,7 @@ void FindReplaceBar::_replace_all() {
 	set_error(vformat(TTR("Replaced %d occurrence(s)."), rc));
 
 	text_edit->call_deferred("connect", "text_changed", this, "_editor_text_changed");
+	results_count = -1;
 }
 
 void FindReplaceBar::_get_search_from(int &r_line, int &r_col) {
@@ -297,6 +301,36 @@ void FindReplaceBar::_get_search_from(int &r_line, int &r_col) {
 	}
 }
 
+void FindReplaceBar::_update_results_count() {
+	if (results_count != -1)
+		return;
+
+	results_count = 0;
+
+	String searched = get_search_text();
+	if (searched.empty()) return;
+
+	String full_text = text_edit->get_text();
+
+	int from_pos = 0;
+
+	while (true) {
+		int pos = is_case_sensitive() ? full_text.find(searched, from_pos) : full_text.findn(searched, from_pos);
+		if (pos == -1) break;
+
+		if (is_whole_words()) {
+			from_pos++; // Making sure we won't hit the same match next time, if we get out via a continue.
+			if (pos > 0 && !is_symbol(full_text[pos - 1]))
+				continue;
+			if (pos + searched.length() < full_text.length() && !is_symbol(full_text[pos + searched.length()]))
+				continue;
+		}
+
+		results_count++;
+		from_pos = pos + searched.length();
+	}
+}
+
 bool FindReplaceBar::search_current() {
 
 	uint32_t flags = 0;
@@ -420,11 +454,13 @@ void FindReplaceBar::popup_replace() {
 
 void FindReplaceBar::_search_options_changed(bool p_pressed) {
 
+	results_count = -1;
 	search_current();
 }
 
 void FindReplaceBar::_editor_text_changed() {
 
+	results_count = -1;
 	if (is_visible_in_tree()) {
 		preserve_cursor = true;
 		search_current();
@@ -434,6 +470,7 @@ void FindReplaceBar::_editor_text_changed() {
 
 void FindReplaceBar::_search_text_changed(const String &p_text) {
 
+	results_count = -1;
 	search_current();
 }
 
@@ -486,6 +523,7 @@ void FindReplaceBar::set_error(const String &p_label) {
 
 void FindReplaceBar::set_text_edit(TextEdit *p_text_edit) {
 
+	results_count = -1;
 	text_edit = p_text_edit;
 	text_edit->connect("text_changed", this, "_editor_text_changed");
 }
@@ -512,6 +550,7 @@ void FindReplaceBar::_bind_methods() {
 
 FindReplaceBar::FindReplaceBar() {
 
+	results_count = -1;
 	replace_all_mode = false;
 	preserve_cursor = false;
 

+ 2 - 0
editor/code_editor.h

@@ -83,11 +83,13 @@ class FindReplaceBar : public HBoxContainer {
 
 	int result_line;
 	int result_col;
+	int results_count;
 
 	bool replace_all_mode;
 	bool preserve_cursor;
 
 	void _get_search_from(int &r_line, int &r_col);
+	void _update_results_count();
 
 	void _show_search();
 	void _hide_bar();