forked from len0rd/rockbox
list: improvement to move and show selection in multi-line lists.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24195 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
669afd093d
commit
67470c890a
2 changed files with 45 additions and 52 deletions
|
@ -153,7 +153,8 @@ void list_draw(struct screen *display, struct gui_synclist *list)
|
||||||
else
|
else
|
||||||
vp.x += list_text_vp->width;
|
vp.x += list_text_vp->width;
|
||||||
display->set_viewport(&vp);
|
display->set_viewport(&vp);
|
||||||
gui_scrollbar_draw(display, VP_IS_RTL(&vp) ? 1 : 0, 0, SCROLLBAR_WIDTH-1, vp.height,
|
gui_scrollbar_draw(display,
|
||||||
|
(scrollbar_in_left? 0: 1), 0, SCROLLBAR_WIDTH-1, vp.height,
|
||||||
list->nb_items, list_start_item, list_start_item + end-start,
|
list->nb_items, list_start_item, list_start_item + end-start,
|
||||||
VERTICAL);
|
VERTICAL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,12 +40,6 @@
|
||||||
#include "viewport.h"
|
#include "viewport.h"
|
||||||
#include "appevents.h"
|
#include "appevents.h"
|
||||||
|
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
|
||||||
#define SCROLL_LIMIT 1
|
|
||||||
#else
|
|
||||||
#define SCROLL_LIMIT (nb_lines<3?1:2)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The minimum number of pending button events in queue before starting
|
/* The minimum number of pending button events in queue before starting
|
||||||
* to limit list drawing interval.
|
* to limit list drawing interval.
|
||||||
*/
|
*/
|
||||||
|
@ -100,6 +94,17 @@ static void list_init_viewports(struct gui_synclist *list)
|
||||||
list_need_reinit = false;
|
list_need_reinit = false;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
static struct viewport parent[NB_SCREENS] =
|
||||||
|
{
|
||||||
|
[SCREEN_MAIN] =
|
||||||
|
{
|
||||||
|
.x = 0,
|
||||||
|
.y = 0,
|
||||||
|
.width = LCD_WIDTH,
|
||||||
|
.height = LCD_HEIGHT
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
#define list_init_viewports(a)
|
#define list_init_viewports(a)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -118,16 +123,6 @@ static int list_get_nb_lines(struct gui_synclist *list, enum screen_type screen)
|
||||||
return viewport_get_nb_lines(&vp);
|
return viewport_get_nb_lines(&vp);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static struct viewport parent[NB_SCREENS] =
|
|
||||||
{
|
|
||||||
[SCREEN_MAIN] =
|
|
||||||
{
|
|
||||||
.x = 0,
|
|
||||||
.y = 0,
|
|
||||||
.width = LCD_WIDTH,
|
|
||||||
.height = LCD_HEIGHT
|
|
||||||
},
|
|
||||||
};
|
|
||||||
#define list_display_title(l, i) false
|
#define list_display_title(l, i) false
|
||||||
#define list_get_nb_lines(list, screen) \
|
#define list_get_nb_lines(list, screen) \
|
||||||
viewport_get_nb_lines((list)->parent[(screen)]);
|
viewport_get_nb_lines((list)->parent[(screen)]);
|
||||||
|
@ -256,46 +251,39 @@ static void gui_list_put_selection_on_screen(struct gui_synclist * gui_list,
|
||||||
int bottom = MAX(0, gui_list->nb_items - nb_lines);
|
int bottom = MAX(0, gui_list->nb_items - nb_lines);
|
||||||
int new_start_item = gui_list->start_item[screen];
|
int new_start_item = gui_list->start_item[screen];
|
||||||
int difference = gui_list->selected_item - gui_list->start_item[screen];
|
int difference = gui_list->selected_item - gui_list->start_item[screen];
|
||||||
|
#ifdef HAVE_LCD_CHARCELLS
|
||||||
|
const int scroll_limit_up = 0;
|
||||||
|
const int scroll_limit_down = 1;
|
||||||
|
#else
|
||||||
|
const int scroll_limit_up = (nb_lines < gui_list->selected_size+2 ? 0:1);
|
||||||
|
const int scroll_limit_down = (scroll_limit_up+gui_list->selected_size);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* edge case, selected last item */
|
|
||||||
if (gui_list->selected_item == gui_list->nb_items -1)
|
|
||||||
{
|
|
||||||
new_start_item = bottom;
|
|
||||||
}
|
|
||||||
/* selected first item */
|
|
||||||
else if (gui_list->selected_item == 0)
|
|
||||||
{
|
|
||||||
new_start_item = 0;
|
|
||||||
}
|
|
||||||
else if (difference < SCROLL_LIMIT) /* list moved up */
|
|
||||||
{
|
|
||||||
if (global_settings.scroll_paginated)
|
|
||||||
{
|
|
||||||
if (new_start_item > gui_list->selected_item)
|
|
||||||
new_start_item = (gui_list->selected_item/nb_lines)*nb_lines;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
new_start_item = gui_list->selected_item - SCROLL_LIMIT + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (difference > nb_lines - SCROLL_LIMIT) /* list moved down */
|
|
||||||
{
|
|
||||||
/* always move the screen if selection isnt "visible" */
|
|
||||||
if (gui_list->show_selection_marker == false)
|
if (gui_list->show_selection_marker == false)
|
||||||
{
|
{
|
||||||
new_start_item += 2*gui_list->selected_size;
|
new_start_item = gui_list->selected_item;
|
||||||
|
}
|
||||||
|
else if (gui_list->selected_size >= nb_lines)
|
||||||
|
{
|
||||||
|
new_start_item = gui_list->selected_item;
|
||||||
}
|
}
|
||||||
else if (global_settings.scroll_paginated)
|
else if (global_settings.scroll_paginated)
|
||||||
{
|
{
|
||||||
if (new_start_item + nb_lines <= gui_list->selected_item)
|
nb_lines -= nb_lines%gui_list->selected_size;
|
||||||
new_start_item = (gui_list->selected_item/nb_lines)*nb_lines;
|
if (difference < 0 || difference >= nb_lines)
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
new_start_item = gui_list->selected_item + SCROLL_LIMIT - nb_lines;
|
new_start_item = gui_list->selected_item -
|
||||||
|
(gui_list->selected_item%nb_lines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (difference <= scroll_limit_up) /* list moved up */
|
||||||
|
{
|
||||||
|
new_start_item = gui_list->selected_item - scroll_limit_up;
|
||||||
|
}
|
||||||
|
else if (difference > nb_lines - scroll_limit_down) /* list moved down */
|
||||||
|
{
|
||||||
|
new_start_item = gui_list->selected_item + scroll_limit_down - nb_lines;
|
||||||
|
}
|
||||||
if (new_start_item < 0)
|
if (new_start_item < 0)
|
||||||
gui_list->start_item[screen] = 0;
|
gui_list->start_item[screen] = 0;
|
||||||
else if (new_start_item > bottom)
|
else if (new_start_item > bottom)
|
||||||
|
@ -326,10 +314,10 @@ static void gui_list_select_at_offset(struct gui_synclist * gui_list,
|
||||||
if (gui_list->selected_size > 1)
|
if (gui_list->selected_size > 1)
|
||||||
{
|
{
|
||||||
offset *= gui_list->selected_size;
|
offset *= gui_list->selected_size;
|
||||||
/* always select the first item of multi-line lists */
|
|
||||||
offset -= offset%gui_list->selected_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new_selection = gui_list->selected_item + offset;
|
new_selection = gui_list->selected_item + offset;
|
||||||
|
|
||||||
if (new_selection >= gui_list->nb_items)
|
if (new_selection >= gui_list->nb_items)
|
||||||
{
|
{
|
||||||
gui_list->selected_item = gui_list->limit_scroll ?
|
gui_list->selected_item = gui_list->limit_scroll ?
|
||||||
|
@ -475,6 +463,8 @@ static void gui_synclist_select_next_page(struct gui_synclist * lists,
|
||||||
enum screen_type screen)
|
enum screen_type screen)
|
||||||
{
|
{
|
||||||
int nb_lines = list_get_nb_lines(lists, screen);
|
int nb_lines = list_get_nb_lines(lists, screen);
|
||||||
|
if (lists->selected_size > 1)
|
||||||
|
nb_lines = MAX(1, nb_lines/lists->selected_size);
|
||||||
gui_list_select_at_offset(lists, nb_lines);
|
gui_list_select_at_offset(lists, nb_lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,6 +472,8 @@ static void gui_synclist_select_previous_page(struct gui_synclist * lists,
|
||||||
enum screen_type screen)
|
enum screen_type screen)
|
||||||
{
|
{
|
||||||
int nb_lines = list_get_nb_lines(lists, screen);
|
int nb_lines = list_get_nb_lines(lists, screen);
|
||||||
|
if (lists->selected_size > 1)
|
||||||
|
nb_lines = MAX(1, nb_lines/lists->selected_size);
|
||||||
gui_list_select_at_offset(lists, -nb_lines);
|
gui_list_select_at_offset(lists, -nb_lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue