Просмотр исходного кода

Fix scrolling popup_menu On keyboard/controller input

(cherry picked from commit a16fdb05aee82a52f631ad1e5209e65ab85d6c30)
Yogendra Manawat 2 лет назад
Родитель
Сommit
2b8dbbccae
1 измененных файлов с 10 добавлено и 8 удалено
  1. 10 8
      scene/gui/popup_menu.cpp

+ 10 - 8
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);
-	}
-
-	// 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);
+	// 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();
+
+	// 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);
 	}
 }