From 2cec27a3f1630a12dab94c1186fbac5620ccd12a Mon Sep 17 00:00:00 2001
From: Mounir Tohami <53877170+WhalesState@users.noreply.github.com>
Date: Thu, 3 Aug 2023 08:38:20 +0000
Subject: [PATCH] Add shortcut handling to OptionButton
---
doc/classes/OptionButton.xml | 7 +++++++
scene/gui/option_button.cpp | 22 ++++++++++++++++++++++
scene/gui/option_button.h | 4 ++++
3 files changed, 33 insertions(+)
diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml
index 659f08d49a..4190ca1a41 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 8138a66f64..e05093b11c 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 7dcb3319c6..e29f14ad54 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 @@ protected:
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 @@ public:
PopupMenu *get_popup() const;
void show_popup();
+ void set_disable_shortcuts(bool p_disabled);
+
OptionButton(const String &p_text = String());
~OptionButton();
};