(GLUI) Fix scroll position calculation

This commit is contained in:
jdgleaver 2019-11-01 17:04:49 +00:00
parent eb2a881d55
commit 697d16dd01
1 changed files with 42 additions and 13 deletions

View File

@ -1954,31 +1954,60 @@ static void materialui_compute_entries_box(materialui_handle_t* mui, int width,
/* Compute the scroll value depending on the highlighted entry */ /* Compute the scroll value depending on the highlighted entry */
static float materialui_get_scroll(materialui_handle_t *mui) static float materialui_get_scroll(materialui_handle_t *mui)
{ {
unsigned i, width, height = 0; file_list_t *list = menu_entries_get_selection_buf_ptr(0);
float half, sum = 0; materialui_node_t *node = NULL;
size_t selection = menu_navigation_get_selection(); size_t selection = menu_navigation_get_selection();
file_list_t *list = menu_entries_get_selection_buf_ptr(0); unsigned header_height = menu_display_get_header_height();
unsigned width = 0;
unsigned height = 0;
float view_centre = 0.0f;
float selection_centre = 0.0f;
size_t i;
if (!mui) if (!mui || !list)
return 0; return 0;
/* Get current window size */
video_driver_get_size(&width, &height); video_driver_get_size(&width, &height);
half = height / 2; /* Get the vertical midpoint of the actual
* list view - i.e. account for header +
* navigation bar */
view_centre =
(float)(height - header_height - mui->nav_bar_layout_height) / 2.0f;
/* Get the vertical midpoint of the currently
* selected entry */
/* > Account for entries *before* current selection */
for (i = 0; i < selection; i++) for (i = 0; i < selection; i++)
{ {
materialui_node_t *node = (materialui_node_t*) node = (materialui_node_t*)file_list_get_userdata_at_offset(list, i);
file_list_get_userdata_at_offset(list, i);
if (node) /* If this ever happens, the scroll position
sum += node->entry_height; * will be entirely wrong... */
if (!node)
continue;
selection_centre += node->entry_height;
} }
if (sum < half) /* > Account for current selection */
return 0; node = (materialui_node_t*)file_list_get_userdata_at_offset(list, selection);
if (node)
selection_centre += node->entry_height / 2.0f;
return sum - half; /* If selected entry is near the beginning of the list
* (such that it fits within the first half of the
* list view when the list is rendered from the start),
* scroll position can be reset to zero */
if (selection_centre < view_centre)
return 0.0f;
/* ...Otherwise, set the scroll position such that the
* centre of the selected item is at the centre of the
* list view */
return selection_centre - view_centre;
} }
static void materialui_layout( static void materialui_layout(