diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml index 659f08d49adf..4190ca1a41a3 100644 --- a/doc/classes/OptionButton.xml +++ b/doc/classes/OptionButton.xml @@ -148,6 +148,13 @@ Passing [code]-1[/code] as the index deselects any currently selected item. + + + + + If [code]true[/code], shortcuts are disabled and cannot be used to trigger the button. + + diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index 8138a66f640c..e05093b11c27 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -30,10 +30,26 @@ #include "option_button.h" +#include "core/os/keyboard.h" #include "core/string/print_string.h" static const int NONE_SELECTED = -1; +void OptionButton::shortcut_input(const Ref &p_event) { + ERR_FAIL_COND(p_event.is_null()); + + if (disable_shortcuts) { + return; + } + + if (p_event->is_pressed() && !p_event->is_echo() && !is_disabled() && is_visible_in_tree() && popup->activate_item_by_event(p_event, false)) { + accept_event(); + return; + } + + Button::shortcut_input(p_event); +} + Size2 OptionButton::get_minimum_size() const { Size2 minsize; if (fit_to_longest_item) { @@ -573,6 +589,7 @@ void OptionButton::_bind_methods() { ClassDB::bind_method(D_METHOD("is_fit_to_longest_item"), &OptionButton::is_fit_to_longest_item); ClassDB::bind_method(D_METHOD("set_allow_reselect", "allow"), &OptionButton::set_allow_reselect); ClassDB::bind_method(D_METHOD("get_allow_reselect"), &OptionButton::get_allow_reselect); + ClassDB::bind_method(D_METHOD("set_disable_shortcuts", "disabled"), &OptionButton::set_disable_shortcuts); // "selected" property must come after "item_count", otherwise GH-10213 occurs. ADD_ARRAY_COUNT("Items", "item_count", "set_item_count", "get_item_count", "popup/item_"); @@ -583,9 +600,14 @@ void OptionButton::_bind_methods() { ADD_SIGNAL(MethodInfo("item_focused", PropertyInfo(Variant::INT, "index"))); } +void OptionButton::set_disable_shortcuts(bool p_disabled) { + disable_shortcuts = p_disabled; +} + OptionButton::OptionButton(const String &p_text) : Button(p_text) { set_toggle_mode(true); + set_process_shortcut_input(true); set_text_alignment(HORIZONTAL_ALIGNMENT_LEFT); set_action_mode(ACTION_MODE_BUTTON_PRESS); diff --git a/scene/gui/option_button.h b/scene/gui/option_button.h index 7dcb3319c62e..e29f14ad54a7 100644 --- a/scene/gui/option_button.h +++ b/scene/gui/option_button.h @@ -37,6 +37,7 @@ class OptionButton : public Button { GDCLASS(OptionButton, Button); + bool disable_shortcuts = false; PopupMenu *popup = nullptr; int current = -1; bool fit_to_longest_item = true; @@ -79,6 +80,7 @@ class OptionButton : public Button { void _get_property_list(List *p_list) const; void _validate_property(PropertyInfo &p_property) const; static void _bind_methods(); + virtual void shortcut_input(const Ref &p_event) override; public: // ATTENTION: This is used by the POT generator's scene parser. If the number of properties returned by `_get_items()` ever changes, @@ -129,6 +131,8 @@ class OptionButton : public Button { PopupMenu *get_popup() const; void show_popup(); + void set_disable_shortcuts(bool p_disabled); + OptionButton(const String &p_text = String()); ~OptionButton(); };