diff --git a/doc/classes/BaseButton.xml b/doc/classes/BaseButton.xml index 18dccfa5a98..13b23d70b76 100644 --- a/doc/classes/BaseButton.xml +++ b/doc/classes/BaseButton.xml @@ -75,6 +75,7 @@ If [code]true[/code], the button will add information about its shortcut in the tooltip. + [b]Note:[/b] This property does nothing when the tooltip control is customized using [method Control._make_custom_tooltip]. If [code]true[/code], the button is in toggle mode. Makes the button flip state between pressed and unpressed each time its area is clicked. diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index 72299f788d6..34f50954932 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -32,6 +32,7 @@ #include "core/config/project_settings.h" #include "core/os/keyboard.h" +#include "scene/gui/label.h" #include "scene/main/window.h" void BaseButton::_unpress_group() { @@ -390,16 +391,31 @@ void BaseButton::shortcut_input(const Ref &p_event) { } } -String BaseButton::get_tooltip(const Point2 &p_pos) const { - String tooltip = Control::get_tooltip(p_pos); - if (shortcut_in_tooltip && shortcut.is_valid() && shortcut->has_valid_event()) { - String text = shortcut->get_name() + " (" + shortcut->get_as_text() + ")"; - if (!tooltip.is_empty() && shortcut->get_name().nocasecmp_to(tooltip) != 0) { - text += "\n" + atr(tooltip); - } - tooltip = text; +Control *BaseButton::make_custom_tooltip(const String &p_text) const { + Control *control = Control::make_custom_tooltip(p_text); + if (control) { + return control; } - return tooltip; + if (!shortcut_in_tooltip || shortcut.is_null() || !shortcut->has_valid_event()) { + return nullptr; // Use the default tooltip label. + } + + String text = atr(shortcut->get_name()) + " (" + shortcut->get_as_text() + ")"; + if (!p_text.is_empty() && shortcut->get_name().nocasecmp_to(p_text) != 0) { + text += "\n" + atr(p_text); + } + + // Make a label similar to the default tooltip label. + // Auto translation is disabled because we already did that manually above. + // + // We can't customize the tooltip text by overriding `get_tooltip()` + // because otherwise user-defined `_make_custom_tooltip()` would receive + // the translated and annotated text. + Label *label = memnew(Label(text)); + label->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED); + label->set_theme_type_variation(SNAME("TooltipLabel")); + + return label; } void BaseButton::set_button_group(const Ref &p_group) { diff --git a/scene/gui/base_button.h b/scene/gui/base_button.h index a8d5cee44ca..8405acb21db 100644 --- a/scene/gui/base_button.h +++ b/scene/gui/base_button.h @@ -134,7 +134,7 @@ public: void set_shortcut(const Ref &p_shortcut); Ref get_shortcut() const; - virtual String get_tooltip(const Point2 &p_pos) const override; + virtual Control *make_custom_tooltip(const String &p_text) const override; void set_button_group(const Ref &p_group); Ref get_button_group() const;