Allow to circle back in 'PopupMenu' even if the first/last item is non-selectable

(cherry picked from commit bb39088201)
This commit is contained in:
Michael Alexsander 2020-12-10 09:32:02 -03:00 committed by Rémi Verschelde
parent c509ba9ff7
commit 4fe554933c
No known key found for this signature in database
GPG Key ID: C3336907360768E1
1 changed files with 30 additions and 0 deletions

View File

@ -221,6 +221,7 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
if (search_from >= items.size())
search_from = 0;
bool match_found = false;
for (int i = search_from; i < items.size(); i++) {
if (i < 0 || i >= items.size())
@ -232,15 +233,30 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
emit_signal("id_focused", i);
update();
accept_event();
match_found = true;
break;
}
}
if (!match_found) {
// If the last item is not selectable, try re-searching from the start.
for (int i = 0; i < search_from; i++) {
if (!items[i].separator && !items[i].disabled) {
mouse_over = i;
emit_signal("id_focused", i);
update();
accept_event();
break;
}
}
}
} else if (p_event->is_action("ui_up") && p_event->is_pressed()) {
int search_from = mouse_over - 1;
if (search_from < 0)
search_from = items.size() - 1;
bool match_found = false;
for (int i = search_from; i >= 0; i--) {
if (i >= items.size())
@ -252,9 +268,23 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
emit_signal("id_focused", i);
update();
accept_event();
match_found = true;
break;
}
}
if (!match_found) {
// If the first item is not selectable, try re-searching from the end.
for (int i = items.size() - 1; i >= search_from; i--) {
if (!items[i].separator && !items[i].disabled) {
mouse_over = i;
emit_signal("id_focused", i);
update();
accept_event();
break;
}
}
}
} else if (p_event->is_action("ui_left") && p_event->is_pressed()) {
Node *n = get_parent();