summaryrefslogtreecommitdiff
path: root/apps/gui
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui')
-rw-r--r--apps/gui/bitmap/list.c31
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);