소스 검색

[3.x] Add deselect() to RichTextLabel

ConteZero 3 년 전
부모
커밋
5e714051ea
3개의 변경된 파일20개의 추가작업 그리고 17개의 파일을 삭제
  1. 6 0
      doc/classes/RichTextLabel.xml
  2. 13 17
      scene/gui/rich_text_label.cpp
  3. 1 0
      scene/gui/rich_text_label.h

+ 6 - 0
doc/classes/RichTextLabel.xml

@@ -48,6 +48,12 @@
 				Clears the tag stack and sets [member bbcode_text] to an empty string.
 			</description>
 		</method>
+		<method name="deselect">
+			<return type="void" />
+			<description>
+				Clears the current selection.
+			</description>
+		</method>
 		<method name="get_content_height" qualifiers="const">
 			<return type="int" />
 			<description>

+ 13 - 17
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<InputEvent> 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<InputEvent> 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<InputEvent> 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);

+ 1 - 0
scene/gui/rich_text_label.h

@@ -476,6 +476,7 @@ public:
 	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);