Browse Source

Merge pull request #22870 from semtri/godot-issue-7620

Fix richtextlabel meta links shouldn't open when swiping to scroll
Rémi Verschelde 6 years ago
parent
commit
01fa0673a4
2 changed files with 23 additions and 6 deletions
  1. 22 6
      scene/gui/rich_text_label.cpp
  2. 1 0
      scene/gui/rich_text_label.h

+ 22 - 6
scene/gui/rich_text_label.cpp

@@ -777,6 +777,7 @@ void RichTextLabel::_update_scroll() {
 		main->first_invalid_line = 0; //invalidate ALL
 		_validate_line_caches(main);
 	}
+	scroll_updated = true;
 }
 
 void RichTextLabel::_notification(int p_what) {
@@ -929,6 +930,7 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) {
 			if (true) {
 
 				if (b->is_pressed() && !b->is_doubleclick()) {
+					scroll_updated = false;
 					int line = 0;
 					Item *item = NULL;
 
@@ -937,12 +939,7 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) {
 
 					if (item) {
 
-						Variant meta;
-						if (!outside && _find_meta(item, &meta)) {
-							//meta clicked
-
-							emit_signal("meta_clicked", meta);
-						} else if (selection.enabled) {
+						if (selection.enabled) {
 
 							selection.click = item;
 							selection.click_char = line;
@@ -991,6 +988,24 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) {
 				} else if (!b->is_pressed()) {
 
 					selection.click = NULL;
+
+					if (!b->is_doubleclick() && !scroll_updated) {
+						int line = 0;
+						Item *item = NULL;
+
+						bool outside;
+						_find_click(main, b->get_position(), &item, &line, &outside);
+
+						if (item) {
+
+							Variant meta;
+							if (!outside && _find_meta(item, &meta)) {
+								//meta clicked
+
+								emit_signal("meta_clicked", meta);
+							}
+						}
+					}
 				}
 			}
 		}
@@ -2324,6 +2339,7 @@ RichTextLabel::RichTextLabel() {
 	updating_scroll = false;
 	scroll_active = true;
 	scroll_w = 0;
+	scroll_updated = false;
 
 	vscroll = memnew(VScrollBar);
 	add_child(vscroll);

+ 1 - 0
scene/gui/rich_text_label.h

@@ -225,6 +225,7 @@ private:
 	bool scroll_following;
 	bool scroll_active;
 	int scroll_w;
+	bool scroll_updated;
 	bool updating_scroll;
 	int current_idx;
 	int visible_line_count;