diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml
index c914fd4d46..64f4724197 100644
--- a/doc/classes/Control.xml
+++ b/doc/classes/Control.xml
@@ -141,6 +141,13 @@
[b]Note:[/b] If this method returns an empty [String] and [method _make_custom_tooltip] is not overridden, no tooltip is displayed.
+
+
+
+
+ Return the auto-translation mode at the given [param at_position]. If not implemented, the [member tooltip_auto_translate_mode] property will be used instead.
+
+
diff --git a/editor/settings/editor_autoload_settings.cpp b/editor/settings/editor_autoload_settings.cpp
index a80c394f01..e744e47cc5 100644
--- a/editor/settings/editor_autoload_settings.cpp
+++ b/editor/settings/editor_autoload_settings.cpp
@@ -521,6 +521,7 @@ void EditorAutoloadSettings::update_autoload() {
TreeItem *item = tree->create_item(root);
item->set_text(0, name);
+ item->set_auto_translate_mode(0, AUTO_TRANSLATE_MODE_DISABLED); // For tooltip.
item->set_editable(0, true);
item->set_text(1, ResourceUID::ensure_path(scr_path));
diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp
index 0907b12b6c..e5a50aa3dd 100644
--- a/scene/gui/control.cpp
+++ b/scene/gui/control.cpp
@@ -3952,6 +3952,15 @@ Node::AutoTranslateMode Control::get_tooltip_auto_translate_mode() const {
return data.tooltip_auto_translate_mode;
}
+Node::AutoTranslateMode Control::get_tooltip_auto_translate_mode_at(const Vector2 &p_at) const {
+ ERR_READ_THREAD_GUARD_V(AUTO_TRANSLATE_MODE_INHERIT);
+ AutoTranslateMode auto_translating;
+ if (GDVIRTUAL_CALL(_get_tooltip_auto_translate_mode_at, p_at, auto_translating)) {
+ return auto_translating;
+ }
+ return get_tooltip_auto_translate_mode();
+}
+
// Extra properties.
void Control::set_tooltip_text(const String &p_hint) {
@@ -4756,6 +4765,7 @@ void Control::_bind_methods() {
GDVIRTUAL_BIND(_structured_text_parser, "args", "text");
GDVIRTUAL_BIND(_get_minimum_size);
GDVIRTUAL_BIND(_get_tooltip, "at_position");
+ GDVIRTUAL_BIND(_get_tooltip_auto_translate_mode_at, "at_position");
GDVIRTUAL_BIND(_get_drag_data, "at_position");
GDVIRTUAL_BIND(_can_drop_data, "at_position", "data");
diff --git a/scene/gui/control.h b/scene/gui/control.h
index ce29d07ede..338c99f669 100644
--- a/scene/gui/control.h
+++ b/scene/gui/control.h
@@ -435,6 +435,7 @@ protected:
GDVIRTUAL2RC(TypedArray, _structured_text_parser, Array, String)
GDVIRTUAL0RC(Vector2, _get_minimum_size)
GDVIRTUAL1RC(String, _get_tooltip, Vector2)
+ GDVIRTUAL1RC(AutoTranslateMode, _get_tooltip_auto_translate_mode_at, Vector2)
GDVIRTUAL1R(Variant, _get_drag_data, Vector2)
GDVIRTUAL2RC(bool, _can_drop_data, Vector2, Variant)
@@ -790,6 +791,7 @@ public:
void set_tooltip_auto_translate_mode(AutoTranslateMode p_mode);
AutoTranslateMode get_tooltip_auto_translate_mode() const;
+ virtual AutoTranslateMode get_tooltip_auto_translate_mode_at(const Vector2 &p_at) const;
// Extra properties.
diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp
index 488066cc5c..f1ec3b3d6b 100644
--- a/scene/gui/item_list.cpp
+++ b/scene/gui/item_list.cpp
@@ -2077,6 +2077,14 @@ String ItemList::get_tooltip(const Point2 &p_pos) const {
return Control::get_tooltip(p_pos);
}
+Node::AutoTranslateMode ItemList::get_tooltip_auto_translate_mode_at(const Point2 &p_at) const {
+ int closest = get_item_at_position(p_at, true);
+ if (closest != -1) {
+ return items[closest].auto_translate_mode;
+ }
+ return Control::get_tooltip_auto_translate_mode_at(p_at);
+}
+
void ItemList::sort_items_by_text() {
items.sort();
queue_accessibility_update();
diff --git a/scene/gui/item_list.h b/scene/gui/item_list.h
index 6ddb06c360..7890148dd6 100644
--- a/scene/gui/item_list.h
+++ b/scene/gui/item_list.h
@@ -325,6 +325,7 @@ public:
int find_metadata(const Variant &p_metadata) const;
virtual String get_tooltip(const Point2 &p_pos) const override;
+ virtual AutoTranslateMode get_tooltip_auto_translate_mode_at(const Point2 &p_at) const override;
int get_item_at_position(const Point2 &p_pos, bool p_exact = false) const;
bool is_pos_at_end_of_items(const Point2 &p_pos) const;
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index 5065feff1d..4712057436 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -6691,6 +6691,26 @@ String Tree::get_tooltip(const Point2 &p_pos) const {
return Control::get_tooltip(p_pos);
}
+Node::AutoTranslateMode Tree::get_tooltip_auto_translate_mode_at(const Point2 &p_at) const {
+ Point2 pos = p_at - theme_cache.panel_style->get_offset();
+ pos.y -= _get_title_button_height();
+
+ // `pos.y` less than 0 indicates we're in the header.
+ if (pos.y < 0) {
+ // Columns don't have auto-translate mode, so return the default.
+ return Control::get_tooltip_auto_translate_mode_at(p_at);
+ }
+
+ TreeItem *it;
+ int col, index, section;
+ _find_button_at_pos(p_at, it, col, index, section);
+
+ if (it) {
+ return it->get_auto_translate_mode(col);
+ }
+ return Control::get_tooltip_auto_translate_mode_at(p_at);
+}
+
void Tree::set_cursor_can_exit_tree(bool p_enable) {
cursor_can_exit_tree = p_enable;
}
diff --git a/scene/gui/tree.h b/scene/gui/tree.h
index 4ab32ee531..e23b0d14f8 100644
--- a/scene/gui/tree.h
+++ b/scene/gui/tree.h
@@ -834,6 +834,7 @@ public:
virtual void gui_input(const Ref &p_event) override;
virtual String get_tooltip(const Point2 &p_pos) const override;
+ virtual AutoTranslateMode get_tooltip_auto_translate_mode_at(const Point2 &p_at) const override;
virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override;
virtual Variant get_drag_data(const Point2 &p_point) override;
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index 676060281c..964ae08bab 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -1675,7 +1675,7 @@ void Viewport::_gui_show_tooltip_at(const Point2i &p_pos) {
gui.tooltip_label = memnew(Label);
gui.tooltip_label->set_theme_type_variation(SNAME("TooltipLabel"));
gui.tooltip_label->set_text(gui.tooltip_text);
- gui.tooltip_label->set_auto_translate_mode(tooltip_owner->get_tooltip_auto_translate_mode());
+ gui.tooltip_label->set_auto_translate_mode(tooltip_owner->get_tooltip_auto_translate_mode_at(tooltip_owner->get_global_transform_with_canvas().affine_inverse().xform(gui.last_mouse_pos)));
base_tooltip = gui.tooltip_label;
panel->connect(SceneStringName(mouse_entered), callable_mp(this, &Viewport::_gui_cancel_tooltip));
}