diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2020-12-10 13:57:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-10 13:57:56 +0100 |
commit | 2ac8c3b6dc211ed7cf62b9971a3c8eaadad7a3b2 (patch) | |
tree | 1b822d07a51956e1055b0404018a1aeb2043225b | |
parent | 9aec0ad3b3ed3cf80c0774b96c3c8005d1a441bf (diff) | |
parent | bb39088201c721d60d97bdd48a3062da7320b078 (diff) |
Merge pull request #44265 from YeldhamDev/popupmenu_circle_back_disabled
Allow to circle back in 'PopupMenu' even if the first/last item is non-selectable
-rw-r--r-- | scene/gui/popup_menu.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index bfbb3cb3f3..07f03ad40e 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -238,6 +238,7 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { search_from = 0; } + bool match_found = false; for (int i = search_from; i < items.size(); i++) { if (!items[i].separator && !items[i].disabled) { mouse_over = i; @@ -245,15 +246,31 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { _scroll_to_item(i); control->update(); set_input_as_handled(); + 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); + _scroll_to_item(i); + control->update(); + set_input_as_handled(); + 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 (!items[i].separator && !items[i].disabled) { mouse_over = i; @@ -261,9 +278,24 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { _scroll_to_item(i); control->update(); set_input_as_handled(); + 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); + _scroll_to_item(i); + control->update(); + set_input_as_handled(); + break; + } + } + } } else if (p_event->is_action("ui_left") && p_event->is_pressed()) { Node *n = get_parent(); if (n && Object::cast_to<PopupMenu>(n)) { |