From 2b8dbbccae979a22e27a26a5d4bfe90ecf50b2e5 Mon Sep 17 00:00:00 2001 From: Yogendra Manawat Date: Fri, 4 Aug 2023 22:54:20 +0530 Subject: [PATCH] Fix scrolling popup_menu On keyboard/controller input (cherry picked from commit a16fdb05aee82a52f631ad1e5209e65ab85d6c30) --- scene/gui/popup_menu.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 94690a49380..e28af630ce5 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -1798,14 +1798,16 @@ int PopupMenu::get_item_count() const { void PopupMenu::scroll_to_item(int p_idx) { ERR_FAIL_INDEX(p_idx, items.size()); - // Scroll item into view (upwards). - if (items[p_idx]._ofs_cache - scroll_container->get_v_scroll() < -control->get_position().y) { - scroll_container->set_v_scroll(items[p_idx]._ofs_cache + control->get_position().y); - } + // Calculate the position of the item relative to the visible area. + int item_y = items[p_idx]._ofs_cache; + int visible_height = scroll_container->get_size().height; + int relative_y = item_y - scroll_container->get_v_scroll(); - // Scroll item into view (downwards). - if (items[p_idx]._ofs_cache + items[p_idx]._height_cache - scroll_container->get_v_scroll() > -control->get_position().y + scroll_container->get_size().height) { - scroll_container->set_v_scroll(items[p_idx]._ofs_cache + items[p_idx]._height_cache + control->get_position().y); + // If item is not fully visible, adjust scroll. + if (relative_y < 0) { + scroll_container->set_v_scroll(item_y); + } else if (relative_y + items[p_idx]._height_cache > visible_height) { + scroll_container->set_v_scroll(item_y + items[p_idx]._height_cache - visible_height); } }