diff options
Diffstat (limited to 'apps/gui/list.c')
-rw-r--r-- | apps/gui/list.c | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/apps/gui/list.c b/apps/gui/list.c index 00d84cb446..b70cf424ee 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c | |||
@@ -61,7 +61,7 @@ static int force_list_reinit = false; | |||
61 | 61 | ||
62 | static void gui_list_select_at_offset(struct gui_synclist * gui_list, | 62 | static void gui_list_select_at_offset(struct gui_synclist * gui_list, |
63 | int offset); | 63 | int offset); |
64 | void list_draw(struct screen *display, struct viewport *parent, struct gui_synclist *list); | 64 | void list_draw(struct screen *display, struct gui_synclist *list); |
65 | 65 | ||
66 | #ifdef HAVE_LCD_BITMAP | 66 | #ifdef HAVE_LCD_BITMAP |
67 | static struct viewport parent[NB_SCREENS]; | 67 | static struct viewport parent[NB_SCREENS]; |
@@ -106,12 +106,13 @@ void list_init_viewports(struct gui_synclist *list) | |||
106 | #endif | 106 | #endif |
107 | 107 | ||
108 | #ifdef HAVE_LCD_BITMAP | 108 | #ifdef HAVE_LCD_BITMAP |
109 | bool list_display_title(struct gui_synclist *list, struct viewport *vp) | 109 | bool list_display_title(struct gui_synclist *list, enum screen_type screen) |
110 | { | 110 | { |
111 | return list->title != NULL && viewport_get_nb_lines(vp)>2; | 111 | return list->title != NULL && |
112 | viewport_get_nb_lines(list->parent[screen])>2; | ||
112 | } | 113 | } |
113 | #else | 114 | #else |
114 | #define list_display_title(l,v) false | 115 | #define list_display_title(l, i) false |
115 | #endif | 116 | #endif |
116 | 117 | ||
117 | /* | 118 | /* |
@@ -180,10 +181,11 @@ void gui_synclist_hide_selection_marker(struct gui_synclist * lists, bool hide) | |||
180 | 181 | ||
181 | 182 | ||
182 | #ifdef HAVE_LCD_BITMAP | 183 | #ifdef HAVE_LCD_BITMAP |
183 | int list_title_height(struct gui_synclist *list, struct viewport *vp); | 184 | int gui_list_get_item_offset(struct gui_synclist * gui_list, |
184 | 185 | int item_width, | |
185 | int gui_list_get_item_offset(struct gui_synclist * gui_list, int item_width, | 186 | int text_pos, |
186 | int text_pos, struct screen * display, struct viewport *vp) | 187 | struct screen * display, |
188 | struct viewport *vp) | ||
187 | { | 189 | { |
188 | int item_offset; | 190 | int item_offset; |
189 | 191 | ||
@@ -241,7 +243,7 @@ void gui_synclist_draw(struct gui_synclist *gui_list) | |||
241 | last_list = gui_list; | 243 | last_list = gui_list; |
242 | FOR_NB_SCREENS(i) | 244 | FOR_NB_SCREENS(i) |
243 | { | 245 | { |
244 | list_draw(&screens[i], gui_list->parent[i], gui_list); | 246 | list_draw(&screens[i], gui_list); |
245 | } | 247 | } |
246 | } | 248 | } |
247 | 249 | ||
@@ -253,8 +255,8 @@ static void gui_list_put_selection_on_screen(struct gui_synclist * gui_list, | |||
253 | int difference = gui_list->selected_item - gui_list->start_item[screen]; | 255 | int difference = gui_list->selected_item - gui_list->start_item[screen]; |
254 | struct viewport vp = *gui_list->parent[screen]; | 256 | struct viewport vp = *gui_list->parent[screen]; |
255 | #ifdef HAVE_LCD_BITMAP | 257 | #ifdef HAVE_LCD_BITMAP |
256 | if (list_display_title(gui_list, gui_list->parent[screen])) | 258 | if (list_display_title(gui_list, screen)) |
257 | vp.height -= list_title_height(gui_list,gui_list->parent[screen]); | 259 | vp.height -= font_get(gui_list->parent[screen]->font)->height; |
258 | #endif | 260 | #endif |
259 | nb_lines = viewport_get_nb_lines(&vp); | 261 | nb_lines = viewport_get_nb_lines(&vp); |
260 | 262 | ||
@@ -273,7 +275,10 @@ static void gui_list_put_selection_on_screen(struct gui_synclist * gui_list, | |||
273 | if (global_settings.scroll_paginated) | 275 | if (global_settings.scroll_paginated) |
274 | { | 276 | { |
275 | if (gui_list->start_item[screen] > gui_list->selected_item) | 277 | if (gui_list->start_item[screen] > gui_list->selected_item) |
276 | gui_list->start_item[screen] = (gui_list->selected_item/nb_lines)*nb_lines; | 278 | { |
279 | gui_list->start_item[screen] = (gui_list->selected_item/nb_lines) | ||
280 | *nb_lines; | ||
281 | } | ||
277 | if (gui_list->nb_items <= nb_lines) | 282 | if (gui_list->nb_items <= nb_lines) |
278 | gui_list->start_item[screen] = 0; | 283 | gui_list->start_item[screen] = 0; |
279 | } | 284 | } |
@@ -293,7 +298,7 @@ static void gui_list_put_selection_on_screen(struct gui_synclist * gui_list, | |||
293 | if (bottom < 0) | 298 | if (bottom < 0) |
294 | bottom = 0; | 299 | bottom = 0; |
295 | gui_list->start_item[screen] = MIN(bottom, gui_list->start_item[screen] + | 300 | gui_list->start_item[screen] = MIN(bottom, gui_list->start_item[screen] + |
296 | 2*gui_list->selected_size); | 301 | 2*gui_list->selected_size); |
297 | } | 302 | } |
298 | else if (global_settings.scroll_paginated) | 303 | else if (global_settings.scroll_paginated) |
299 | { | 304 | { |
@@ -351,8 +356,8 @@ static void gui_list_select_at_offset(struct gui_synclist * gui_list, | |||
351 | { | 356 | { |
352 | struct viewport vp = *gui_list->parent[i]; | 357 | struct viewport vp = *gui_list->parent[i]; |
353 | #ifdef HAVE_LCD_BITMAP | 358 | #ifdef HAVE_LCD_BITMAP |
354 | if (list_display_title(gui_list, gui_list->parent[i])) | 359 | if (list_display_title(gui_list, i)) |
355 | vp.height -= list_title_height(gui_list,gui_list->parent[i]); | 360 | vp.height -= font_get(gui_list->parent[i]->font)->height; |
356 | #endif | 361 | #endif |
357 | nb_lines = viewport_get_nb_lines(&vp); | 362 | nb_lines = viewport_get_nb_lines(&vp); |
358 | if (offset > 0) | 363 | if (offset > 0) |
@@ -578,11 +583,11 @@ void gui_synclist_speak_item(struct gui_synclist * lists) | |||
578 | extern intptr_t get_action_data(void); | 583 | extern intptr_t get_action_data(void); |
579 | #if defined(HAVE_TOUCHSCREEN) | 584 | #if defined(HAVE_TOUCHSCREEN) |
580 | /* this needs to be fixed if we ever get more than 1 touchscreen on a target */ | 585 | /* this needs to be fixed if we ever get more than 1 touchscreen on a target */ |
581 | unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct viewport *parent); | 586 | unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list); |
582 | #endif | 587 | #endif |
583 | 588 | ||
584 | bool gui_synclist_do_button(struct gui_synclist * lists, | 589 | bool gui_synclist_do_button(struct gui_synclist * lists, |
585 | unsigned *actionptr, enum list_wrap wrap) | 590 | int *actionptr, enum list_wrap wrap) |
586 | { | 591 | { |
587 | int action = *actionptr; | 592 | int action = *actionptr; |
588 | #ifdef HAVE_LCD_BITMAP | 593 | #ifdef HAVE_LCD_BITMAP |
@@ -621,7 +626,7 @@ bool gui_synclist_do_button(struct gui_synclist * lists, | |||
621 | 626 | ||
622 | #if defined(HAVE_TOUCHSCREEN) | 627 | #if defined(HAVE_TOUCHSCREEN) |
623 | if (action == ACTION_TOUCHSCREEN) | 628 | if (action == ACTION_TOUCHSCREEN) |
624 | action = *actionptr = gui_synclist_do_touchscreen(lists, &parent[SCREEN_MAIN]); | 629 | action = *actionptr = gui_synclist_do_touchscreen(lists); |
625 | #endif | 630 | #endif |
626 | 631 | ||
627 | switch (wrap) | 632 | switch (wrap) |
@@ -791,8 +796,8 @@ bool gui_synclist_item_is_onscreen(struct gui_synclist *lists, | |||
791 | { | 796 | { |
792 | struct viewport vp = *lists->parent[screen]; | 797 | struct viewport vp = *lists->parent[screen]; |
793 | #ifdef HAVE_LCD_BITMAP | 798 | #ifdef HAVE_LCD_BITMAP |
794 | if (list_display_title(lists, lists->parent[screen])) | 799 | if (list_display_title(lists, screen)) |
795 | vp.height -= list_title_height(lists, lists->parent[screen]); | 800 | vp.height -= font_get(lists->parent[screen]->font)->height; |
796 | #endif | 801 | #endif |
797 | return item <= (lists->start_item[screen] + viewport_get_nb_lines(&vp)); | 802 | return item <= (lists->start_item[screen] + viewport_get_nb_lines(&vp)); |
798 | } | 803 | } |
@@ -888,7 +893,6 @@ bool simplelist_show_list(struct simplelist_info *info) | |||
888 | 893 | ||
889 | while(1) | 894 | while(1) |
890 | { | 895 | { |
891 | gui_syncstatusbar_draw(&statusbars, true); | ||
892 | list_do_action(CONTEXT_STD, info->timeout, | 896 | list_do_action(CONTEXT_STD, info->timeout, |
893 | &lists, &action, wrap); | 897 | &lists, &action, wrap); |
894 | 898 | ||
@@ -900,14 +904,16 @@ bool simplelist_show_list(struct simplelist_info *info) | |||
900 | { | 904 | { |
901 | bool stdok = action==ACTION_STD_OK; | 905 | bool stdok = action==ACTION_STD_OK; |
902 | action = info->action_callback(action, &lists); | 906 | action = info->action_callback(action, &lists); |
903 | if (stdok && action == ACTION_STD_CANCEL) /* callback asked us to exit */ | 907 | if (stdok && action == ACTION_STD_CANCEL) |
904 | { | 908 | { |
909 | /* callback asked us to exit */ | ||
905 | info->selection = gui_synclist_get_sel_pos(&lists); | 910 | info->selection = gui_synclist_get_sel_pos(&lists); |
906 | break; | 911 | break; |
907 | } | 912 | } |
908 | 913 | ||
909 | if (info->get_name == NULL) | 914 | if (info->get_name == NULL) |
910 | gui_synclist_set_nb_items(&lists, simplelist_line_count*info->selection_size); | 915 | gui_synclist_set_nb_items(&lists, |
916 | simplelist_line_count*info->selection_size); | ||
911 | } | 917 | } |
912 | if (action == ACTION_STD_CANCEL) | 918 | if (action == ACTION_STD_CANCEL) |
913 | { | 919 | { |
@@ -918,7 +924,10 @@ bool simplelist_show_list(struct simplelist_info *info) | |||
918 | (old_line_count != simplelist_line_count)) | 924 | (old_line_count != simplelist_line_count)) |
919 | { | 925 | { |
920 | if (info->get_name == NULL) | 926 | if (info->get_name == NULL) |
921 | gui_synclist_set_nb_items(&lists, simplelist_line_count*info->selection_size); | 927 | { |
928 | gui_synclist_set_nb_items(&lists, | ||
929 | simplelist_line_count*info->selection_size); | ||
930 | } | ||
922 | gui_synclist_draw(&lists); | 931 | gui_synclist_draw(&lists); |
923 | old_line_count = simplelist_line_count; | 932 | old_line_count = simplelist_line_count; |
924 | } | 933 | } |