diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index e3959681624..4693607703e 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -2981,6 +2981,35 @@ void RichTextLabel::gui_input(const Ref &p_event) { if (m.is_valid()) { local_mouse_pos = get_local_mouse_position(); last_clamped_mouse_pos = local_mouse_pos.clamp(Vector2(), get_size()); + + Item *c_item = nullptr; + bool outside = false; + + // Update meta hovering. + _find_click(main, local_mouse_pos, nullptr, nullptr, &c_item, nullptr, &outside, true); + Variant meta; + ItemMeta *item_meta; + ItemMeta *prev_meta = meta_hovering; + if (c_item && !outside && _find_meta(c_item, &meta, &item_meta)) { + if (meta_hovering != item_meta) { + if (meta_hovering) { + emit_signal(SNAME("meta_hover_ended"), current_meta); + } + meta_hovering = item_meta; + current_meta = meta; + emit_signal(SNAME("meta_hover_started"), meta); + if ((item_meta && item_meta->underline == META_UNDERLINE_ON_HOVER) || (prev_meta && prev_meta->underline == META_UNDERLINE_ON_HOVER)) { + queue_redraw(); + } + } + } else if (meta_hovering) { + meta_hovering = nullptr; + emit_signal(SNAME("meta_hover_ended"), current_meta); + current_meta = false; + if (prev_meta->underline == META_UNDERLINE_ON_HOVER) { + queue_redraw(); + } + } } } @@ -3067,32 +3096,6 @@ void RichTextLabel::_update_selection() { queue_accessibility_update(); queue_redraw(); } - - // Update meta hovering. - _find_click(main, local_mouse_pos, nullptr, nullptr, &c_item, nullptr, &outside, true); - Variant meta; - ItemMeta *item_meta; - ItemMeta *prev_meta = meta_hovering; - if (c_item && !outside && _find_meta(c_item, &meta, &item_meta)) { - if (meta_hovering != item_meta) { - if (meta_hovering) { - emit_signal(SNAME("meta_hover_ended"), current_meta); - } - meta_hovering = item_meta; - current_meta = meta; - emit_signal(SNAME("meta_hover_started"), meta); - if ((item_meta && item_meta->underline == META_UNDERLINE_ON_HOVER) || (prev_meta && prev_meta->underline == META_UNDERLINE_ON_HOVER)) { - queue_redraw(); - } - } - } else if (meta_hovering) { - meta_hovering = nullptr; - emit_signal(SNAME("meta_hover_ended"), current_meta); - current_meta = false; - if (prev_meta->underline == META_UNDERLINE_ON_HOVER) { - queue_redraw(); - } - } } String RichTextLabel::get_tooltip(const Point2 &p_pos) const {