浏览代码

Merge pull request #4076 from Paulb23/word_highlighting

Highlight all occurrences of selected word
Rémi Verschelde 9 年之前
父节点
当前提交
63aafb3f48
共有 4 个文件被更改,包括 65 次插入0 次删除
  1. 55 0
      scene/gui/text_edit.cpp
  2. 5 0
      scene/gui/text_edit.h
  3. 2 0
      tools/editor/editor_settings.cpp
  4. 3 0
      tools/editor/plugins/script_editor_plugin.cpp

+ 55 - 0
scene/gui/text_edit.cpp

@@ -643,6 +643,12 @@ void TextEdit::_notification(int p_what) {
 			int deregion=0; //force it to clear inrgion
 			int deregion=0; //force it to clear inrgion
 			Point2 cursor_pos;
 			Point2 cursor_pos;
 
 
+			// get the highlighted words
+			String highlighted_text;
+			if (is_selection_active()) {
+				highlighted_text = get_selection_text();
+			}
+
 			for (int i=0;i<visible_rows;i++) {
 			for (int i=0;i<visible_rows;i++) {
 
 
 				int line=i+cursor.line_ofs;
 				int line=i+cursor.line_ofs;
@@ -659,6 +665,12 @@ void TextEdit::_notification(int p_what) {
 				bool in_keyword=false;
 				bool in_keyword=false;
 				Color keyword_color;
 				Color keyword_color;
 
 
+				// check if line contains highlighted word
+				int highlighted_text_col = -1;
+				if (is_selection_active()) {
+					highlighted_text_col = _get_column_pos_of_word(highlighted_text, str, 0);
+				}
+
 				if (cache.line_number_w) {
 				if (cache.line_number_w) {
 					Color fcol = cache.font_color;
 					Color fcol = cache.font_color;
 					fcol.a*=0.4;
 					fcol.a*=0.4;
@@ -798,6 +810,20 @@ void TextEdit::_notification(int p_what) {
 						VisualServer::get_singleton()->canvas_item_add_rect(ci,Rect2(Point2i( char_ofs+char_margin, ofs_y ), Size2i(char_w,get_row_height())),cache.selection_color);
 						VisualServer::get_singleton()->canvas_item_add_rect(ci,Rect2(Point2i( char_ofs+char_margin, ofs_y ), Size2i(char_w,get_row_height())),cache.selection_color);
 					}
 					}
 
 
+					if (highlight_all_occurrences) {
+						if (highlighted_text_col != -1) {
+
+							// if we are at the end check for new word on same line
+							if (j > highlighted_text_col+highlighted_text.length()) {
+								highlighted_text_col = _get_column_pos_of_word(highlighted_text, str, j);
+							}
+
+							bool in_highlighted_word = (j >= highlighted_text_col && j < highlighted_text_col+highlighted_text.length());
+							if (in_highlighted_word) {
+								VisualServer::get_singleton()->canvas_item_add_rect(ci,Rect2(Point2i( char_ofs+char_margin, ofs_y ), Size2i(char_w, get_row_height())),cache.word_highlighted_color);
+							}
+						}
+					}
 
 
 					if (brace_matching_enabled) {
 					if (brace_matching_enabled) {
 						if ( (brace_open_match_line==line && brace_open_match_column==j) ||
 						if ( (brace_open_match_line==line && brace_open_match_column==j) ||
@@ -2921,6 +2947,7 @@ void TextEdit::_update_caches() {
 	cache.current_line_color=get_color("current_line_color");
 	cache.current_line_color=get_color("current_line_color");
 	cache.breakpoint_color=get_color("breakpoint_color");
 	cache.breakpoint_color=get_color("breakpoint_color");
 	cache.brace_mismatch_color=get_color("brace_mismatch_color");
 	cache.brace_mismatch_color=get_color("brace_mismatch_color");
+	cache.word_highlighted_color=get_color("word_highlighted_color");
 	cache.line_spacing=get_constant("line_spacing");
 	cache.line_spacing=get_constant("line_spacing");
 	cache.row_height = cache.font->get_height() + cache.line_spacing;
 	cache.row_height = cache.font->get_height() + cache.line_spacing;
 	cache.tab_icon=get_icon("tab");
 	cache.tab_icon=get_icon("tab");
@@ -3182,6 +3209,34 @@ String TextEdit::get_word_under_cursor() const {
 	return text[cursor.line].substr(prev_cc, next_cc-prev_cc);
 	return text[cursor.line].substr(prev_cc, next_cc-prev_cc);
 }
 }
 
 
+void TextEdit::set_highlight_all_occurrences(const bool p_enabled) {
+	highlight_all_occurrences = p_enabled;
+	update();
+}
+
+int TextEdit::_get_column_pos_of_word(const String &p_key, const String &p_search, int p_from_column) {
+	int col = -1;
+
+	if (p_key.length() > 0 && p_search.length() > 0) {
+		if (p_from_column < 0 || p_from_column > p_search.length()) {
+			p_from_column = 0;
+		}
+
+		// match case
+		col = p_search.findn(p_key, p_from_column);
+
+		// whole words only
+		if (col != -1) {
+			if (col > 0 && _is_text_char(p_search[col-1])) {
+				col = -1;
+		} else if (_is_text_char(p_search[col+p_key.length()])) {
+				col = -1;
+			}
+		}
+	}
+	return col;
+}
+
 DVector<int> TextEdit::_search_bind(const String &p_key,uint32_t p_search_flags, int p_from_line,int p_from_column) const {
 DVector<int> TextEdit::_search_bind(const String &p_key,uint32_t p_search_flags, int p_from_line,int p_from_column) const {
 
 
 	int col,line;
 	int col,line;

+ 5 - 0
scene/gui/text_edit.h

@@ -81,6 +81,7 @@ class TextEdit : public Control  {
 		Color breakpoint_color;
 		Color breakpoint_color;
 		Color current_line_color;
 		Color current_line_color;
 		Color brace_mismatch_color;
 		Color brace_mismatch_color;
+		Color word_highlighted_color;
 
 
 		int row_height;
 		int row_height;
 		int line_spacing;
 		int line_spacing;
@@ -212,6 +213,7 @@ class TextEdit : public Control  {
 	bool undo_enabled;
 	bool undo_enabled;
 	bool line_numbers;
 	bool line_numbers;
 
 
+	bool highlight_all_occurrences;
 	bool scroll_past_end_of_file_enabled;
 	bool scroll_past_end_of_file_enabled;
 	bool auto_brace_completion_enabled;
 	bool auto_brace_completion_enabled;
 	bool brace_matching_enabled;
 	bool brace_matching_enabled;
@@ -270,6 +272,8 @@ class TextEdit : public Control  {
 	String _base_get_text(int p_from_line, int p_from_column,int p_to_line,int p_to_column) const;
 	String _base_get_text(int p_from_line, int p_from_column,int p_to_line,int p_to_column) const;
 	void _base_remove_text(int p_from_line, int p_from_column,int p_to_line,int p_to_column);
 	void _base_remove_text(int p_from_line, int p_from_column,int p_to_line,int p_to_column);
 
 
+	int _get_column_pos_of_word(const String &p_key, const String &p_search, int p_from_column);
+
 	DVector<int> _search_bind(const String &p_key,uint32_t p_search_flags, int p_from_line,int p_from_column) const;
 	DVector<int> _search_bind(const String &p_key,uint32_t p_search_flags, int p_from_line,int p_from_column) const;
 
 
 	void _clear();
 	void _clear();
@@ -364,6 +368,7 @@ public:
 	void select(int p_from_line,int p_from_column,int p_to_line,int p_to_column);
 	void select(int p_from_line,int p_from_column,int p_to_line,int p_to_column);
 	void deselect();
 	void deselect();
 
 
+	void set_highlight_all_occurrences(const bool p_enabled);
 	bool is_selection_active() const;
 	bool is_selection_active() const;
 	int get_selection_from_line() const;
 	int get_selection_from_line() const;
     int get_selection_from_column() const;
     int get_selection_from_column() const;

+ 2 - 0
tools/editor/editor_settings.cpp

@@ -403,7 +403,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
 	set("text_editor/selection_color",Color::html("7b5dbe"));
 	set("text_editor/selection_color",Color::html("7b5dbe"));
 	set("text_editor/brace_mismatch_color",Color(1,0.2,0.2));
 	set("text_editor/brace_mismatch_color",Color(1,0.2,0.2));
 	set("text_editor/current_line_color",Color(0.3,0.5,0.8,0.15));
 	set("text_editor/current_line_color",Color(0.3,0.5,0.8,0.15));
+	set("text_editor/word_highlighted_color",Color(0.8,0.9,0.9,0.15));
 
 
+	set("text_editor/highlight_all_occurrences", true);
 	set("text_editor/scroll_past_end_of_file", false);
 	set("text_editor/scroll_past_end_of_file", false);
 
 
 	set("text_editor/tab_size", 4);
 	set("text_editor/tab_size", 4);

+ 3 - 0
tools/editor/plugins/script_editor_plugin.cpp

@@ -292,6 +292,7 @@ void ScriptTextEditor::_load_theme_settings() {
 	get_text_edit()->add_color_override("selection_color",EDITOR_DEF("text_editor/selection_color",Color(0.2,0.2,1)));
 	get_text_edit()->add_color_override("selection_color",EDITOR_DEF("text_editor/selection_color",Color(0.2,0.2,1)));
 	get_text_edit()->add_color_override("brace_mismatch_color",EDITOR_DEF("text_editor/brace_mismatch_color",Color(1,0.2,0.2)));
 	get_text_edit()->add_color_override("brace_mismatch_color",EDITOR_DEF("text_editor/brace_mismatch_color",Color(1,0.2,0.2)));
 	get_text_edit()->add_color_override("current_line_color",EDITOR_DEF("text_editor/current_line_color",Color(0.3,0.5,0.8,0.15)));
 	get_text_edit()->add_color_override("current_line_color",EDITOR_DEF("text_editor/current_line_color",Color(0.3,0.5,0.8,0.15)));
+	get_text_edit()->add_color_override("word_highlighted_color",EDITOR_DEF("text_editor/word_highlighted_color",Color(0.8,0.9,0.9,0.15)));
 
 
 	Color keyword_color= EDITOR_DEF("text_editor/keyword_color",Color(0.5,0.0,0.2));
 	Color keyword_color= EDITOR_DEF("text_editor/keyword_color",Color(0.5,0.0,0.2));
 
 
@@ -1931,6 +1932,7 @@ void ScriptEditor::edit(const Ref<Script>& p_script) {
 	ste->get_text_edit()->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/scroll_past_end_of_file"));
 	ste->get_text_edit()->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/scroll_past_end_of_file"));
 	ste->get_text_edit()->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/auto_brace_complete"));
 	ste->get_text_edit()->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/auto_brace_complete"));
 	ste->get_text_edit()->set_tab_size(EditorSettings::get_singleton()->get("text_editor/tab_size"));
 	ste->get_text_edit()->set_tab_size(EditorSettings::get_singleton()->get("text_editor/tab_size"));
+	ste->get_text_edit()->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlight_all_occurrences"));
 	ste->get_text_edit()->set_callhint_settings(
 	ste->get_text_edit()->set_callhint_settings(
 		EditorSettings::get_singleton()->get("text_editor/put_callhint_tooltip_below_current_line"),
 		EditorSettings::get_singleton()->get("text_editor/put_callhint_tooltip_below_current_line"),
 		EditorSettings::get_singleton()->get("text_editor/callhint_tooltip_offset"));
 		EditorSettings::get_singleton()->get("text_editor/callhint_tooltip_offset"));
@@ -2069,6 +2071,7 @@ void ScriptEditor::_editor_settings_changed() {
 		ste->get_text_edit()->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/auto_brace_complete"));
 		ste->get_text_edit()->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/auto_brace_complete"));
 		ste->get_text_edit()->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/scroll_past_end_of_file"));
 		ste->get_text_edit()->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/scroll_past_end_of_file"));
 		ste->get_text_edit()->set_tab_size(EditorSettings::get_singleton()->get("text_editor/tab_size"));
 		ste->get_text_edit()->set_tab_size(EditorSettings::get_singleton()->get("text_editor/tab_size"));
+		ste->get_text_edit()->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlight_all_occurrences"));
 	}
 	}
 
 
 }
 }