From 5e714051ea2d45047269b565af412f6a47c7e76d Mon Sep 17 00:00:00 2001 From: ConteZero Date: Mon, 4 Apr 2022 22:46:13 +0200 Subject: [PATCH] [3.x] Add deselect() to RichTextLabel --- doc/classes/RichTextLabel.xml | 6 ++++++ scene/gui/rich_text_label.cpp | 30 +++++++++++++----------------- scene/gui/rich_text_label.h | 1 + 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml index a71c26332094..5f639bf12add 100644 --- a/doc/classes/RichTextLabel.xml +++ b/doc/classes/RichTextLabel.xml @@ -48,6 +48,12 @@ Clears the tag stack and sets [member bbcode_text] to an empty string. + + + + Clears the current selection. + + diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index e4461384f5d5..6c5b206d0007 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -1068,8 +1068,7 @@ void RichTextLabel::_notification(int p_what) { } break; case NOTIFICATION_FOCUS_EXIT: { if (deselect_on_focus_loss_enabled) { - selection.active = false; - update(); + deselect(); } } break; case Control::NOTIFICATION_DRAG_END: { @@ -1177,9 +1176,7 @@ void RichTextLabel::_gui_input(Ref p_event) { selection.from_char = '\0'; selection.to = nullptr; selection.to_char = '\0'; - selection.active = false; - - update(); + deselect(); } } } @@ -1224,14 +1221,11 @@ void RichTextLabel::_gui_input(Ref p_event) { selection.click = item; selection.click_char = line; if (_is_click_inside_selection()) { - selection.active = false; selection.from = nullptr; selection.from_char = '\0'; selection.to = nullptr; selection.to_char = '\0'; - selection.active = false; - - update(); + deselect(); } } if (selection.enabled && OS::get_singleton()->has_feature("primary_clipboard")) { @@ -1367,8 +1361,7 @@ void RichTextLabel::_gui_input(Ref p_event) { if (selection.from_char > selection.to_char) { swap = true; } else if (selection.from_char == selection.to_char) { - selection.active = false; - update(); + deselect(); return; } } @@ -2008,9 +2001,8 @@ void RichTextLabel::clear() { main->lines.clear(); main->lines.resize(1); main->first_invalid_line = 0; - update(); selection.click = nullptr; - selection.active = false; + deselect(); current_idx = 1; if (scroll_follow) { scroll_following = true; @@ -2538,8 +2530,7 @@ void RichTextLabel::set_selection_enabled(bool p_enabled) { selection.enabled = p_enabled; if (!p_enabled) { if (selection.active) { - selection.active = false; - update(); + deselect(); } set_focus_mode(FOCUS_NONE); } else { @@ -2550,8 +2541,7 @@ void RichTextLabel::set_selection_enabled(bool p_enabled) { void RichTextLabel::set_deselect_on_focus_loss_enabled(const bool p_enabled) { deselect_on_focus_loss_enabled = p_enabled; if (p_enabled && selection.active && !has_focus()) { - selection.active = false; - update(); + deselect(); } } @@ -2670,6 +2660,11 @@ String RichTextLabel::get_selected_text() { return text; } +void RichTextLabel::deselect() { + selection.active = false; + update(); +} + void RichTextLabel::selection_copy() { String text = get_selected_text(); @@ -2820,6 +2815,7 @@ void RichTextLabel::_bind_methods() { ClassDB::bind_method(D_METHOD("pop"), &RichTextLabel::pop); ClassDB::bind_method(D_METHOD("clear"), &RichTextLabel::clear); + ClassDB::bind_method(D_METHOD("deselect"), &RichTextLabel::deselect); ClassDB::bind_method(D_METHOD("set_meta_underline", "enable"), &RichTextLabel::set_meta_underline); ClassDB::bind_method(D_METHOD("is_meta_underlined"), &RichTextLabel::is_meta_underlined); diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index c80e2b91076a..d1de4b33d6f7 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -476,6 +476,7 @@ class RichTextLabel : public Control { void selection_copy(); void set_deselect_on_focus_loss_enabled(const bool p_enabled); bool is_deselect_on_focus_loss_enabled() const; + void deselect(); Error parse_bbcode(const String &p_bbcode); Error append_bbcode(const String &p_bbcode);