Index: apps/gui/list.c =================================================================== --- apps/gui/list.c (revision 23358) +++ apps/gui/list.c (working copy) @@ -109,6 +109,14 @@ return list->title != NULL && viewport_get_nb_lines(list->parent[screen])>2; } + +static int list_get_nb_lines(struct gui_synclist *list, enum screen_type screen) +{ + struct viewport vp = *list->parent[screen]; + if (list_display_title(list, screen)) + vp.height -= font_get(list->parent[screen]->font)->height; + return viewport_get_nb_lines(&vp); +} #else static struct viewport parent[NB_SCREENS] = { @@ -121,6 +129,8 @@ }, }; #define list_display_title(l, i) false +#define list_get_nb_lines(list, screen) \ + viewport_get_nb_lines((list)->parent[screen]); #endif /* @@ -243,68 +253,58 @@ static void gui_list_put_selection_on_screen(struct gui_synclist * gui_list, enum screen_type screen) { - int nb_lines; + int nb_lines = list_get_nb_lines(gui_list, screen); + int bottom = MAX(0, gui_list->nb_items - nb_lines); + int new_start_item = gui_list->start_item[screen]; int difference = gui_list->selected_item - gui_list->start_item[screen]; - struct viewport vp = *gui_list->parent[screen]; -#ifdef HAVE_LCD_BITMAP - if (list_display_title(gui_list, screen)) - vp.height -= font_get(gui_list->parent[screen]->font)->height; -#endif - nb_lines = viewport_get_nb_lines(&vp); - - /* edge case,, selected last item */ + + /* edge case, selected last item */ if (gui_list->selected_item == gui_list->nb_items -1) { - gui_list->start_item[screen] = MAX(0, gui_list->nb_items - nb_lines); + new_start_item = bottom; } /* selected first item */ else if (gui_list->selected_item == 0) { - gui_list->start_item[screen] = 0; + new_start_item = 0; } else if (difference < SCROLL_LIMIT) /* list moved up */ { if (global_settings.scroll_paginated) { - if (gui_list->start_item[screen] > gui_list->selected_item) - { - gui_list->start_item[screen] = (gui_list->selected_item/nb_lines) - *nb_lines; - } - if (gui_list->nb_items <= nb_lines) - gui_list->start_item[screen] = 0; + if (new_start_item > gui_list->selected_item) + new_start_item = (gui_list->selected_item/nb_lines)*nb_lines; } else { - int top_of_screen = gui_list->selected_item - SCROLL_LIMIT + 1; - int temp = MIN(top_of_screen, gui_list->nb_items - nb_lines); - gui_list->start_item[screen] = MAX(0, temp); + new_start_item = gui_list->selected_item - SCROLL_LIMIT + 1; } } else if (difference > nb_lines - SCROLL_LIMIT) /* list moved down */ { - int bottom = gui_list->nb_items - nb_lines; /* always move the screen if selection isnt "visible" */ if (gui_list->show_selection_marker == false) { - if (bottom < 0) - bottom = 0; - gui_list->start_item[screen] = MIN(bottom, gui_list->start_item[screen] + - 2*gui_list->selected_size); + new_start_item += 2*gui_list->selected_size; } else if (global_settings.scroll_paginated) { - if (gui_list->start_item[screen] + nb_lines <= gui_list->selected_item) - gui_list->start_item[screen] = MIN(bottom, gui_list->selected_item); + if (new_start_item + nb_lines <= gui_list->selected_item) + new_start_item = (gui_list->selected_item/nb_lines)*nb_lines; } else { - int top_of_screen = gui_list->selected_item + SCROLL_LIMIT - nb_lines; - int temp = MAX(0, top_of_screen); - gui_list->start_item[screen] = MIN(bottom, temp); + new_start_item = gui_list->selected_item + SCROLL_LIMIT - nb_lines; } } + if (new_start_item < 0) + gui_list->start_item[screen] = 0; + else if (new_start_item > bottom) + gui_list->start_item[screen] = bottom; + else + gui_list->start_item[screen] = new_start_item; } + /* * Selects an item in the list * - gui_list : the list structure @@ -346,12 +346,7 @@ int i, nb_lines, screen_top; FOR_NB_SCREENS(i) { - struct viewport vp = *gui_list->parent[i]; -#ifdef HAVE_LCD_BITMAP - if (list_display_title(gui_list, i)) - vp.height -= font_get(gui_list->parent[i]->font)->height; -#endif - nb_lines = viewport_get_nb_lines(&vp); + nb_lines = list_get_nb_lines(gui_list, i); if (offset > 0) { screen_top = gui_list->nb_items-nb_lines; @@ -480,22 +475,14 @@ static void gui_synclist_select_next_page(struct gui_synclist * lists, enum screen_type screen) { - int nb_lines = viewport_get_nb_lines(lists->parent[screen]); -#ifdef HAVE_LCD_BITMAP - if(list_display_title(lists, screen)) - nb_lines--; -#endif + int nb_lines = list_get_nb_lines(lists, screen); gui_list_select_at_offset(lists, nb_lines); } static void gui_synclist_select_previous_page(struct gui_synclist * lists, enum screen_type screen) { - int nb_lines = viewport_get_nb_lines(lists->parent[screen]); -#ifdef HAVE_LCD_BITMAP - if(list_display_title(lists, screen)) - nb_lines--; -#endif + int nb_lines = list_get_nb_lines(lists, screen); gui_list_select_at_offset(lists, -nb_lines); } @@ -783,12 +770,8 @@ bool gui_synclist_item_is_onscreen(struct gui_synclist *lists, enum screen_type screen, int item) { - struct viewport vp = *lists->parent[screen]; -#ifdef HAVE_LCD_BITMAP - if (list_display_title(lists, screen)) - vp.height -= font_get(lists->parent[screen]->font)->height; -#endif - return item <= (lists->start_item[screen] + viewport_get_nb_lines(&vp)); + int nb_lines = list_get_nb_lines(lists, screen); + return (unsigned)(item - lists->start_item[screen]) < (unsigned) nb_lines; } /* Simple use list implementation */