diff options
author | Noshyaar <poommetee@protonmail.com> | 2018-01-01 18:51:35 +0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-01 18:51:35 +0700 |
commit | a6328011d85ea285f974d354ce4e30cf8e3456de (patch) | |
tree | 05aa46a82702cd7440aa145b83a24b0b503bdeec /scene/gui | |
parent | 52deb679df547ea9634cf2cc337fa98905bb12fb (diff) | |
parent | b80bc553dd52259eee4c25eb7652020e75d9e814 (diff) |
Merge pull request #14973 from poke1024/docs-word-selection
Double-click word selection for RichTextLabel (i.e. docs)
Diffstat (limited to 'scene/gui')
-rw-r--r-- | scene/gui/rich_text_label.cpp | 28 | ||||
-rw-r--r-- | scene/gui/text_edit.cpp | 46 |
2 files changed, 37 insertions, 37 deletions
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 6fbc58a38a..7fe8a01cda 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -815,7 +815,35 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { } } } + } else if (b->is_pressed() && b->is_doubleclick() && selection.enabled) { + //doubleclick: select word + int line = 0; + Item *item = NULL; + bool outside; + + _find_click(main, b->get_position(), &item, &line, &outside); + + while (item && item->type != ITEM_TEXT) { + + item = _get_next_item(item, true); + } + + if (item && item->type == ITEM_TEXT) { + + String itext = static_cast<ItemText *>(item)->text; + + int beg, end; + if (select_word(itext, line, beg, end)) { + + selection.from = item; + selection.to = item; + selection.from_char = beg; + selection.to_char = end - 1; + selection.active = true; + update(); + } + } } else if (!b->is_pressed()) { selection.click = NULL; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 0fba4a6f94..cd3d7f5d3e 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -42,14 +42,14 @@ #define TAB_PIXELS -static bool _is_text_char(CharType c) { +inline bool _is_symbol(CharType c) { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; + return is_symbol(c); } -static bool _is_symbol(CharType c) { +static bool _is_text_char(CharType c) { - return c != '_' && ((c >= '!' && c <= '/') || (c >= ':' && c <= '@') || (c >= '[' && c <= '`') || (c >= '{' && c <= '~') || c == '\t' || c == ' '); + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; } static bool _is_whitespace(CharType c) { @@ -1956,7 +1956,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } else if (mb->is_doubleclick() && text[cursor.line].length()) { - //doubleclick select world + //doubleclick select word selection.selecting_mode = Selection::MODE_WORD; _update_selection_mode_word(); last_dblclk = OS::get_singleton()->get_ticks_msec(); @@ -5212,12 +5212,8 @@ String TextEdit::get_word_at_pos(const Vector2 &p_pos) const { String s = text[row]; if (s.length() == 0) return ""; - int beg = CLAMP(col, 0, s.length()); - int end = beg; - - if (s[beg] > 32 || beg == s.length()) { - - bool symbol = beg < s.length() && _is_symbol(s[beg]); //not sure if right but most editors behave like this + int beg, end; + if (select_word(s, col, beg, end)) { bool inside_quotes = false; int qbegin = 0, qend = 0; @@ -5236,16 +5232,6 @@ String TextEdit::get_word_at_pos(const Vector2 &p_pos) const { } } - while (beg > 0 && s[beg - 1] > 32 && (symbol == _is_symbol(s[beg - 1]))) { - beg--; - } - while (end < s.length() && s[end + 1] > 32 && (symbol == _is_symbol(s[end + 1]))) { - end++; - } - - if (end < s.length()) - end += 1; - return s.substr(beg, end - beg); } @@ -5262,22 +5248,8 @@ String TextEdit::get_tooltip(const Point2 &p_pos) const { String s = text[row]; if (s.length() == 0) return Control::get_tooltip(p_pos); - int beg = CLAMP(col, 0, s.length()); - int end = beg; - - if (s[beg] > 32 || beg == s.length()) { - - bool symbol = beg < s.length() && _is_symbol(s[beg]); //not sure if right but most editors behave like this - - while (beg > 0 && s[beg - 1] > 32 && (symbol == _is_symbol(s[beg - 1]))) { - beg--; - } - while (end < s.length() && s[end + 1] > 32 && (symbol == _is_symbol(s[end + 1]))) { - end++; - } - - if (end < s.length()) - end += 1; + int beg, end; + if (select_word(s, col, beg, end)) { String tt = tooltip_obj->call(tooltip_func, s.substr(beg, end - beg), tooltip_ud); |