summaryrefslogtreecommitdiff
path: root/apps/gui/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/list.c')
-rw-r--r--apps/gui/list.c55
1 files changed, 29 insertions, 26 deletions
diff --git a/apps/gui/list.c b/apps/gui/list.c
index 27032378c3..c393340c57 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -78,25 +78,6 @@ void list_init(void)
78 add_event(GUI_EVENT_THEME_CHANGED, false, list_force_reinit); 78 add_event(GUI_EVENT_THEME_CHANGED, false, list_force_reinit);
79} 79}
80 80
81#ifdef HAVE_TOUCHSCREEN
82static int line_height_from_lcd_dpi(const struct viewport *vp)
83{
84 /* the 4/12 factor is designed for reasonable item size on a 160dpi screen */
85 return MAX(lcd_get_dpi()*4/12, (int)font_get(vp->font)->height);
86}
87#endif
88
89static int list_line_height(const struct viewport *vp)
90{
91#ifdef HAVE_TOUCHSCREEN
92 if (global_settings.list_line_padding == -1)
93 return line_height_from_lcd_dpi(vp);
94 return font_get(vp->font)->height + global_settings.list_line_padding;
95#else
96 return font_get(vp->font)->height;
97#endif
98}
99
100static void list_init_viewports(struct gui_synclist *list) 81static void list_init_viewports(struct gui_synclist *list)
101{ 82{
102 bool parent_used = (*list->parent == &parent[SCREEN_MAIN]); 83 bool parent_used = (*list->parent == &parent[SCREEN_MAIN]);
@@ -127,29 +108,50 @@ static struct viewport parent[NB_SCREENS] =
127#endif 108#endif
128 109
129#ifdef HAVE_LCD_BITMAP 110#ifdef HAVE_LCD_BITMAP
111static int list_nb_lines(struct gui_synclist *list, enum screen_type screen)
112{
113 struct viewport *vp = list->parent[screen];
114 return vp->height / list->line_height[screen];
115}
116
130bool list_display_title(struct gui_synclist *list, enum screen_type screen) 117bool list_display_title(struct gui_synclist *list, enum screen_type screen)
131{ 118{
132 return list->title != NULL && 119 return list->title != NULL &&
133 !sb_set_title_text(list->title, list->title_icon, screen) && 120 !sb_set_title_text(list->title, list->title_icon, screen) &&
134 viewport_get_nb_lines(list->parent[screen]) > 2; 121 list_nb_lines(list, screen) > 2;
135} 122}
136 123
137static int list_get_nb_lines(struct gui_synclist *list, enum screen_type screen) 124int list_get_nb_lines(struct gui_synclist *list, enum screen_type screen)
138{ 125{
139 struct viewport *vp = list->parent[screen];
140 int lines = skinlist_get_line_count(screen, list); 126 int lines = skinlist_get_line_count(screen, list);
141 if (lines < 0) 127 if (lines < 0)
142 { 128 {
143 lines = viewport_get_nb_lines(vp); 129 lines = list_nb_lines(list, screen);
144 if (list_display_title(list, screen)) 130 if (list_display_title(list, screen))
145 lines -= 1; 131 lines -= 1;
146 } 132 }
147 return lines; 133 return lines;
148} 134}
135
136void list_init_item_height(struct gui_synclist *list, enum screen_type screen)
137{
138 struct viewport *vp = list->parent[screen];
139#ifdef HAVE_TOUCHSCREEN
140 /* the 4/12 factor is designed for reasonable item size on a 160dpi screen */
141 if (global_settings.list_line_padding == -1)
142 list->line_height[screen] = MAX(lcd_get_dpi()*4/12, (int)font_get(vp->font)->height);
143 else
144 list->line_height[screen] = font_get(vp->font)->height + global_settings.list_line_padding;
145#else
146 list->line_height[screen] = font_get(vp->font)->height;
147#endif
148}
149
149#else 150#else
150#define list_display_title(l, i) false 151#define list_display_title(l, i) false
151#define list_get_nb_lines(list, screen) \ 152#define list_get_nb_lines(list, screen) \
152 viewport_get_nb_lines((list)->parent[(screen)]); 153 viewport_get_nb_lines((list)->parent[(screen)]);
154#define list_init_item_height(l, i)
153#endif 155#endif
154 156
155/* 157/*
@@ -187,6 +189,8 @@ void gui_synclist_init(struct gui_synclist * gui_list,
187 gui_list->parent[i] = &parent[i]; 189 gui_list->parent[i] = &parent[i];
188 } 190 }
189 list_init_viewports(gui_list); 191 list_init_viewports(gui_list);
192 FOR_NB_SCREENS(i)
193 list_init_item_height(gui_list, i);
190 gui_list->limit_scroll = false; 194 gui_list->limit_scroll = false;
191 gui_list->data = data; 195 gui_list->data = data;
192 gui_list->scroll_all = scroll_all; 196 gui_list->scroll_all = scroll_all;
@@ -253,6 +257,8 @@ void gui_synclist_draw(struct gui_synclist *gui_list)
253 if (list_is_dirty(gui_list)) 257 if (list_is_dirty(gui_list))
254 { 258 {
255 list_init_viewports(gui_list); 259 list_init_viewports(gui_list);
260 FOR_NB_SCREENS(i)
261 list_init_item_height(gui_list, i);
256 gui_synclist_select_item(gui_list, gui_list->selected_item); 262 gui_synclist_select_item(gui_list, gui_list->selected_item);
257 } 263 }
258 FOR_NB_SCREENS(i) 264 FOR_NB_SCREENS(i)
@@ -502,9 +508,6 @@ void gui_synclist_set_viewport_defaults(struct viewport *vp,
502 enum screen_type screen) 508 enum screen_type screen)
503{ 509{
504 viewport_set_defaults(vp, screen); 510 viewport_set_defaults(vp, screen);
505#ifdef HAVE_LCD_BITMAP
506 vp->line_height = list_line_height(vp);
507#endif
508#ifdef HAVE_BUTTONBAR 511#ifdef HAVE_BUTTONBAR
509 if (screens[screen].has_buttonbar) 512 if (screens[screen].has_buttonbar)
510 vp->height -= BUTTONBAR_HEIGHT; 513 vp->height -= BUTTONBAR_HEIGHT;