diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml
index 09f7d66f4..2134a7bab 100644
--- a/doc/classes/OptionButton.xml
+++ b/doc/classes/OptionButton.xml
@@ -97,7 +97,7 @@
- Returns the ID of the selected item, or [code]0[/code] if no item is selected.
+ Returns the ID of the selected item, or [code]-1[/code] if no item is selected.
@@ -125,6 +125,7 @@
Selects an item by index and makes it the current item. This will work even if the item is disabled.
+ Passing [code]-1[/code] as the index deselects any currently selected item.
diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp
index 5568f279e..14d487a10 100644
--- a/scene/gui/option_button.cpp
+++ b/scene/gui/option_button.cpp
@@ -34,6 +34,8 @@
#include "scene/gui/popup_menu.h"
#include "scene/gui/shortcut.h"
+static const int NONE_SELECTED = -1;
+
Size2 OptionButton::get_minimum_size() const {
Size2 minsize = Button::get_minimum_size();
@@ -175,6 +177,10 @@ Ref OptionButton::get_item_icon(int p_idx) const {
}
int OptionButton::get_item_id(int p_idx) const {
+ if (p_idx == NONE_SELECTED) {
+ return NONE_SELECTED;
+ }
+
return popup->get_item_id(p_idx);
}
@@ -205,27 +211,34 @@ void OptionButton::add_separator() {
void OptionButton::clear() {
popup->clear();
set_text("");
- current = -1;
+ current = NONE_SELECTED;
}
void OptionButton::_select(int p_which, bool p_emit) {
- if (p_which < 0) {
- return;
- }
if (p_which == current) {
return;
}
- ERR_FAIL_INDEX(p_which, popup->get_item_count());
+ if (p_which == NONE_SELECTED) {
+ for (int i = 0; i < popup->get_item_count(); i++) {
+ popup->set_item_checked(i, false);
+ }
- for (int i = 0; i < popup->get_item_count(); i++) {
- popup->set_item_checked(i, i == p_which);
+ current = NONE_SELECTED;
+ set_text("");
+ set_icon(NULL);
+ } else {
+ ERR_FAIL_INDEX(p_which, popup->get_item_count());
+
+ for (int i = 0; i < popup->get_item_count(); i++) {
+ popup->set_item_checked(i, i == p_which);
+ }
+
+ current = p_which;
+ set_text(popup->get_item_text(current));
+ set_icon(popup->get_item_icon(current));
}
- current = p_which;
- set_text(popup->get_item_text(current));
- set_icon(popup->get_item_icon(current));
-
if (is_inside_tree() && p_emit) {
emit_signal("item_selected", current);
}
@@ -263,6 +276,10 @@ Variant OptionButton::get_selected_metadata() const {
void OptionButton::remove_item(int p_idx) {
popup->remove_item(p_idx);
+
+ if (current == p_idx) {
+ _select(NONE_SELECTED);
+ }
}
PopupMenu *OptionButton::get_popup() const {
diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp
index 0831e3e08..1b52bf1ba 100644
--- a/scene/gui/popup_menu.cpp
+++ b/scene/gui/popup_menu.cpp
@@ -686,7 +686,7 @@ void PopupMenu::_notification(int p_what) {
#define ITEM_SETUP_WITH_ACCEL(p_label, p_id, p_accel) \
item.text = p_label; \
item.xl_text = tr(p_label); \
- item.id = p_id == -1 ? items.size() : p_id; \
+ item.id = p_id == -1 ? items.size() - 1 : p_id; \
item.accel = p_accel;
void PopupMenu::add_item(const String &p_label, int p_id, uint32_t p_accel) {
@@ -759,7 +759,7 @@ void PopupMenu::add_multistate_item(const String &p_label, int p_max_states, int
_ref_shortcut(p_shortcut); \
item.text = p_shortcut->get_name(); \
item.xl_text = tr(item.text); \
- item.id = p_id == -1 ? items.size() : p_id; \
+ item.id = p_id == -1 ? items.size() - 1 : p_id; \
item.shortcut = p_shortcut; \
item.shortcut_is_global = p_global;
@@ -822,7 +822,7 @@ void PopupMenu::add_submenu_item(const String &p_label, const String &p_submenu,
Item item;
item.text = p_label;
item.xl_text = tr(p_label);
- item.id = p_id == -1 ? items.size() : p_id;
+ item.id = p_id == -1 ? items.size() - 1 : p_id;
item.submenu = p_submenu;
items.push_back(item);
update();