summaryrefslogtreecommitdiff
path: root/scene/gui
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui')
-rw-r--r--scene/gui/text_edit.cpp58
-rw-r--r--scene/gui/text_edit.h5
-rw-r--r--scene/gui/tree.cpp10
3 files changed, 72 insertions, 1 deletions
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index b80597560d..0fc8e39fef 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -643,6 +643,9 @@ void TextEdit::_notification(int p_what) {
int deregion=0; //force it to clear inrgion
Point2 cursor_pos;
+ // get the highlighted words
+ String highlighted_text = get_selection_text();
+
for (int i=0;i<visible_rows;i++) {
int line=i+cursor.line_ofs;
@@ -659,6 +662,12 @@ void TextEdit::_notification(int p_what) {
bool in_keyword=false;
Color keyword_color;
+ // check if line contains highlighted word
+ int highlighted_text_col = -1;
+ if (highlighted_text.length() != 0) {
+ highlighted_text_col = _get_column_pos_of_word(highlighted_text, str, 0);
+ }
+
if (cache.line_number_w) {
Color fcol = cache.font_color;
fcol.a*=0.4;
@@ -798,6 +807,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);
}
+ 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_open_match_line==line && brace_open_match_column==j) ||
@@ -2921,6 +2944,7 @@ void TextEdit::_update_caches() {
cache.current_line_color=get_color("current_line_color");
cache.breakpoint_color=get_color("breakpoint_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.row_height = cache.font->get_height() + cache.line_spacing;
cache.tab_icon=get_icon("tab");
@@ -3182,6 +3206,40 @@ String TextEdit::get_word_under_cursor() const {
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;
+ }
+
+ while (col == -1 && p_from_column <= p_search.length()) {
+ // match case
+ col = p_search.findn(p_key, p_from_column);
+
+ // whole words only
+ if (col != -1) {
+ p_from_column=col;
+
+ 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;
+ }
+ }
+
+ p_from_column+=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 {
int col,line;
diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h
index d38c57804d..86696ca5a5 100644
--- a/scene/gui/text_edit.h
+++ b/scene/gui/text_edit.h
@@ -81,6 +81,7 @@ class TextEdit : public Control {
Color breakpoint_color;
Color current_line_color;
Color brace_mismatch_color;
+ Color word_highlighted_color;
int row_height;
int line_spacing;
@@ -212,6 +213,7 @@ class TextEdit : public Control {
bool undo_enabled;
bool line_numbers;
+ bool highlight_all_occurrences;
bool scroll_past_end_of_file_enabled;
bool auto_brace_completion_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;
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;
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 deselect();
+ void set_highlight_all_occurrences(const bool p_enabled);
bool is_selection_active() const;
int get_selection_from_line() const;
int get_selection_from_column() const;
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index 483aa47f35..718206dee1 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -2750,6 +2750,15 @@ void Tree::clear() {
ERR_FAIL_COND(blocked>0);
}
+ if (pressing_for_editor) {
+ if (range_drag_enabled) {
+ range_drag_enabled = false;
+ Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
+ warp_mouse(range_drag_capture_pos);
+ }
+ pressing_for_editor = false;
+ }
+
if (root) {
memdelete( root );
root = NULL;
@@ -2759,7 +2768,6 @@ void Tree::clear() {
edited_item=NULL;
popup_edited_item=NULL;
selected_item=NULL;
- pressing_for_editor=false;
update();
};