diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/gui/bitmap/list.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/apps/gui/bitmap/list.c b/apps/gui/bitmap/list.c index 2b59fc8489..4aaecc7eab 100644 --- a/apps/gui/bitmap/list.c +++ b/apps/gui/bitmap/list.c | |||
@@ -309,22 +309,23 @@ unsigned gui_synclist_do_touchpad(struct gui_synclist * gui_list, struct viewpor | |||
309 | /* Scroll bar */ | 309 | /* Scroll bar */ |
310 | else | 310 | else |
311 | { | 311 | { |
312 | int new_selection, nb_lines; | 312 | int nb_lines = viewport_get_nb_lines(&list_text[SCREEN_MAIN]); |
313 | int height, size; | ||
314 | nb_lines = viewport_get_nb_lines(&list_text[SCREEN_MAIN]); | ||
315 | if (nb_lines < gui_list->nb_items) | 313 | if (nb_lines < gui_list->nb_items) |
316 | { | 314 | { |
317 | height = nb_lines * font_get(parent->font)->height; | 315 | int scrollbar_size = nb_lines * font_get(parent->font)->height; |
318 | size = height / gui_list->nb_items; | 316 | int actual_y = y - list_text[SCREEN_MAIN].y; |
319 | new_selection = ((y-list_text[SCREEN_MAIN].y)*(gui_list->nb_items-nb_lines))/(height-size); | ||
320 | 317 | ||
321 | if (new_selection - gui_list->start_item[SCREEN_MAIN] > (nb_lines/2)) | 318 | int new_selection = (actual_y * gui_list->nb_items) / scrollbar_size; |
322 | new_selection = gui_list->start_item[SCREEN_MAIN]+(nb_lines/2); | 319 | |
323 | else if (new_selection > gui_list->nb_items-nb_lines) | 320 | int start_item = new_selection - nb_lines/2; |
324 | new_selection = gui_list->nb_items-nb_lines; | 321 | if(start_item < 0) |
322 | start_item = 0; | ||
323 | else if(start_item > gui_list->nb_items - nb_lines) | ||
324 | start_item = gui_list->nb_items - nb_lines; | ||
325 | 325 | ||
326 | gui_list->start_item[SCREEN_MAIN] = start_item; | ||
326 | gui_synclist_select_item(gui_list, new_selection); | 327 | gui_synclist_select_item(gui_list, new_selection); |
327 | gui_list->start_item[SCREEN_MAIN] = new_selection; | 328 | |
328 | return ACTION_REDRAW; | 329 | return ACTION_REDRAW; |
329 | } | 330 | } |
330 | } | 331 | } |
@@ -346,6 +347,7 @@ unsigned gui_synclist_do_touchpad(struct gui_synclist * gui_list, struct viewpor | |||
346 | if (y > list_text[SCREEN_MAIN].y) | 347 | if (y > list_text[SCREEN_MAIN].y) |
347 | { | 348 | { |
348 | int line_height, actual_y; | 349 | int line_height, actual_y; |
350 | static int last_y = 0; | ||
349 | 351 | ||
350 | actual_y = y - list_text[SCREEN_MAIN].y; | 352 | actual_y = y - list_text[SCREEN_MAIN].y; |
351 | line_height = font_get(parent->font)->height; | 353 | line_height = font_get(parent->font)->height; |
@@ -354,13 +356,12 @@ unsigned gui_synclist_do_touchpad(struct gui_synclist * gui_list, struct viewpor | |||
354 | if(actual_y%line_height == 0) /* Pressed a border */ | 356 | if(actual_y%line_height == 0) /* Pressed a border */ |
355 | return ACTION_NONE; | 357 | return ACTION_NONE; |
356 | 358 | ||
357 | if(actual_y >= line_height*gui_list->nb_items) /* Pressed below the list */ | 359 | if (gui_list->start_item[SCREEN_MAIN]+line > gui_list->nb_items) /* Pressed below the list*/ |
358 | return ACTION_NONE; | 360 | return ACTION_NONE; |
359 | 361 | ||
362 | last_y = actual_y; | ||
360 | if (line != gui_list->selected_item - gui_list->start_item[SCREEN_MAIN] && button ^ BUTTON_REL) | 363 | if (line != gui_list->selected_item - gui_list->start_item[SCREEN_MAIN] && button ^ BUTTON_REL) |
361 | { | 364 | { |
362 | if (gui_list->start_item[SCREEN_MAIN]+line > gui_list->nb_items) | ||
363 | return ACTION_NONE; | ||
364 | if(button & BUTTON_REPEAT) | 365 | if(button & BUTTON_REPEAT) |
365 | scrolling = true; | 366 | scrolling = true; |
366 | gui_synclist_select_item(gui_list, gui_list->start_item[SCREEN_MAIN]+line); | 367 | gui_synclist_select_item(gui_list, gui_list->start_item[SCREEN_MAIN]+line); |