diff options
author | Thomas Martitz <kugel@rockbox.org> | 2013-05-06 07:20:40 +0200 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2014-03-03 15:14:16 +0100 |
commit | 05a67d021c8fbb10b2654f8378b549901dd4c520 (patch) | |
tree | 23d0fa787d7373bf2ea08d1678cff47306a1a55d /apps | |
parent | 20e114c1a0f086e432f374fe0ecebf014a571448 (diff) | |
download | rockbox-05a67d021c8fbb10b2654f8378b549901dd4c520.tar.gz rockbox-05a67d021c8fbb10b2654f8378b549901dd4c520.zip |
Touchscreen: Show a line separator in lists.
This patch adds a configurable line separator between list items, very
similar to lists in Android. Additionally, below the list item there is a
thicker line. It can be disabled in the settings. Its color can
be configured as well.
Remote and monochrome displays are explicitly unsupported. If there is desire
this can be changed but it doesn't seem useful to me.
Change-Id: I005313b0d8f5ecd15864bf20e66ea4e3390d8b7d
Diffstat (limited to 'apps')
-rw-r--r-- | apps/gui/bitmap/list.c | 13 | ||||
-rw-r--r-- | apps/gui/line.c | 30 | ||||
-rw-r--r-- | apps/gui/line.h | 5 | ||||
-rw-r--r-- | apps/lang/english.lang | 28 | ||||
-rw-r--r-- | apps/menus/theme_menu.c | 17 | ||||
-rw-r--r-- | apps/settings.h | 7 | ||||
-rw-r--r-- | apps/settings_list.c | 11 |
7 files changed, 98 insertions, 13 deletions
diff --git a/apps/gui/bitmap/list.c b/apps/gui/bitmap/list.c index f1def9007d..97eefce9db 100644 --- a/apps/gui/bitmap/list.c +++ b/apps/gui/bitmap/list.c | |||
@@ -106,6 +106,13 @@ static bool draw_title(struct screen *display, struct gui_synclist *list) | |||
106 | line.height = list->line_height[screen]; | 106 | line.height = list->line_height[screen]; |
107 | title_text_vp->height = line.height; | 107 | title_text_vp->height = line.height; |
108 | 108 | ||
109 | #if LCD_DEPTH > 1 | ||
110 | /* XXX: Do we want to support the separator on remote displays? */ | ||
111 | if (display->screen_type == SCREEN_MAIN && global_settings.list_separator_height != 0) | ||
112 | line.separator_height = abs(global_settings.list_separator_height) | ||
113 | + (lcd_get_dpi() > 200 ? 2 : 1); | ||
114 | #endif | ||
115 | |||
109 | #ifdef HAVE_LCD_COLOR | 116 | #ifdef HAVE_LCD_COLOR |
110 | if (list->title_color >= 0) | 117 | if (list->title_color >= 0) |
111 | line.style |= (STYLE_COLORED|list->title_color); | 118 | line.style |= (STYLE_COLORED|list->title_color); |
@@ -154,7 +161,11 @@ void list_draw(struct screen *display, struct gui_synclist *list) | |||
154 | 161 | ||
155 | linedes.height = list->line_height[screen]; | 162 | linedes.height = list->line_height[screen]; |
156 | linedes.nlines = list->selected_size; | 163 | linedes.nlines = list->selected_size; |
157 | 164 | #if LCD_DEPTH > 1 | |
165 | /* XXX: Do we want to support the separator on remote displays? */ | ||
166 | if (display->screen_type == SCREEN_MAIN) | ||
167 | linedes.separator_height = abs(global_settings.list_separator_height); | ||
168 | #endif | ||
158 | start = list_start_item; | 169 | start = list_start_item; |
159 | end = start + nb_lines; | 170 | end = start + nb_lines; |
160 | 171 | ||
diff --git a/apps/gui/line.c b/apps/gui/line.c index 55100f715c..4a51c6e307 100644 --- a/apps/gui/line.c +++ b/apps/gui/line.c | |||
@@ -305,6 +305,28 @@ static void style_line(struct screen *display, | |||
305 | int style = line->style; | 305 | int style = line->style; |
306 | int width = display->getwidth(); | 306 | int width = display->getwidth(); |
307 | int height = line->height == -1 ? display->getcharheight() : line->height; | 307 | int height = line->height == -1 ? display->getcharheight() : line->height; |
308 | int bar_height = height; | ||
309 | |||
310 | /* mask out gradient and colorbar styles for non-color displays */ | ||
311 | if (display->depth < 16 && (style & (STYLE_COLORBAR|STYLE_GRADIENT))) | ||
312 | { | ||
313 | style &= ~(STYLE_COLORBAR|STYLE_GRADIENT); | ||
314 | style |= STYLE_INVERT; | ||
315 | } | ||
316 | |||
317 | if (line->separator_height > 0 && (line->line == line->nlines-1)) | ||
318 | { | ||
319 | int sep_height = MIN(line->separator_height, height); | ||
320 | display->set_drawmode(DRMODE_FG); | ||
321 | #if LCD_DEPTH > 1 | ||
322 | display->set_foreground(global_settings.list_separator_color); | ||
323 | #endif | ||
324 | display->fillrect(x, y + height - sep_height, width, sep_height); | ||
325 | bar_height -= sep_height; | ||
326 | #if LCD_DEPTH > 1 | ||
327 | display->set_foreground(global_settings.fg_color); | ||
328 | #endif | ||
329 | } | ||
308 | 330 | ||
309 | /* mask out gradient and colorbar styles for non-color displays */ | 331 | /* mask out gradient and colorbar styles for non-color displays */ |
310 | if (display->depth < 16) | 332 | if (display->depth < 16) |
@@ -322,7 +344,7 @@ static void style_line(struct screen *display, | |||
322 | #ifdef HAVE_LCD_COLOR | 344 | #ifdef HAVE_LCD_COLOR |
323 | case STYLE_GRADIENT: | 345 | case STYLE_GRADIENT: |
324 | display->set_drawmode(DRMODE_FG); | 346 | display->set_drawmode(DRMODE_FG); |
325 | display->gradient_fillrect_part(x, y, width, height, | 347 | display->gradient_fillrect_part(x, y, width, bar_height, |
326 | line->line_color, | 348 | line->line_color, |
327 | line->line_end_color, | 349 | line->line_end_color, |
328 | height*line->nlines, | 350 | height*line->nlines, |
@@ -331,16 +353,16 @@ static void style_line(struct screen *display, | |||
331 | case STYLE_COLORBAR: | 353 | case STYLE_COLORBAR: |
332 | display->set_drawmode(DRMODE_FG); | 354 | display->set_drawmode(DRMODE_FG); |
333 | display->set_foreground(line->line_color); | 355 | display->set_foreground(line->line_color); |
334 | display->fillrect(x, y, width - x, height); | 356 | display->fillrect(x, y, width - x, bar_height); |
335 | break; | 357 | break; |
336 | #endif | 358 | #endif |
337 | case STYLE_INVERT: | 359 | case STYLE_INVERT: |
338 | display->set_drawmode(DRMODE_FG); | 360 | display->set_drawmode(DRMODE_FG); |
339 | display->fillrect(x, y, width - x, height); | 361 | display->fillrect(x, y, width - x, bar_height); |
340 | break; | 362 | break; |
341 | case STYLE_DEFAULT: default: | 363 | case STYLE_DEFAULT: default: |
342 | display->set_drawmode(DRMODE_BG | DRMODE_INVERSEVID); | 364 | display->set_drawmode(DRMODE_BG | DRMODE_INVERSEVID); |
343 | display->fillrect(x, y, width - x, height); | 365 | display->fillrect(x, y, width - x, bar_height); |
344 | break; | 366 | break; |
345 | case STYLE_NONE: | 367 | case STYLE_NONE: |
346 | break; | 368 | break; |
diff --git a/apps/gui/line.h b/apps/gui/line.h index 9a0769de35..c14f04d9a2 100644 --- a/apps/gui/line.h +++ b/apps/gui/line.h | |||
@@ -74,11 +74,14 @@ struct line_desc { | |||
74 | enum line_styles style; | 74 | enum line_styles style; |
75 | /* whether the line can scroll */ | 75 | /* whether the line can scroll */ |
76 | bool scroll; | 76 | bool scroll; |
77 | /* height of the line separator (in pixels). 0 to disable drawing | ||
78 | * of the separator */ | ||
79 | int8_t separator_height; | ||
77 | }; | 80 | }; |
78 | 81 | ||
79 | /* default initializer, can be used for static initialitation also. | 82 | /* default initializer, can be used for static initialitation also. |
80 | * This initializer will result in single lines without style that don't scroll */ | 83 | * This initializer will result in single lines without style that don't scroll */ |
81 | #define LINE_DESC_DEFINIT { .style = STYLE_DEFAULT, .height = -1, .line = 0, .nlines = 1, .scroll = false } | 84 | #define LINE_DESC_DEFINIT { .style = STYLE_DEFAULT, .height = -1, .separator_height = 0, .line = 0, .nlines = 1, .scroll = false } |
82 | 85 | ||
83 | /** | 86 | /** |
84 | * Print a line at a given pixel postion, using decoration information from | 87 | * Print a line at a given pixel postion, using decoration information from |
diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 0778ab74d3..9914b160f1 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang | |||
@@ -12926,6 +12926,34 @@ | |||
12926 | </voice> | 12926 | </voice> |
12927 | </phrase> | 12927 | </phrase> |
12928 | <phrase> | 12928 | <phrase> |
12929 | id: LANG_LIST_SEPARATOR | ||
12930 | desc: line between lines in lists | ||
12931 | user: core | ||
12932 | <source> | ||
12933 | *: "Line Separator" | ||
12934 | </source> | ||
12935 | <dest> | ||
12936 | *: "Line Separator" | ||
12937 | </dest> | ||
12938 | <voice> | ||
12939 | *: "Line Separator" | ||
12940 | </voice> | ||
12941 | </phrase> | ||
12942 | <phrase> | ||
12943 | id: LANG_LIST_SEPARATOR_COLOR | ||
12944 | desc: line between lines in lists | ||
12945 | user: core | ||
12946 | <source> | ||
12947 | *: "Line Separator Colour" | ||
12948 | </source> | ||
12949 | <dest> | ||
12950 | *: "Line Separator Colour" | ||
12951 | </dest> | ||
12952 | <voice> | ||
12953 | *: "Line Separator Colour" | ||
12954 | </voice> | ||
12955 | </phrase> | ||
12956 | <phrase> | ||
12929 | id: LANG_SHORTCUTS | 12957 | id: LANG_SHORTCUTS |
12930 | desc: Title in the shortcuts menu | 12958 | desc: Title in the shortcuts menu |
12931 | user: core | 12959 | user: core |
diff --git a/apps/menus/theme_menu.c b/apps/menus/theme_menu.c index 93511f8197..f64ded1615 100644 --- a/apps/menus/theme_menu.c +++ b/apps/menus/theme_menu.c | |||
@@ -68,6 +68,7 @@ enum Colors { | |||
68 | COLOR_LSS, | 68 | COLOR_LSS, |
69 | COLOR_LSE, | 69 | COLOR_LSE, |
70 | COLOR_LST, | 70 | COLOR_LST, |
71 | COLOR_SEP, | ||
71 | COLOR_COUNT | 72 | COLOR_COUNT |
72 | }; | 73 | }; |
73 | static struct colour_info | 74 | static struct colour_info |
@@ -80,6 +81,7 @@ static struct colour_info | |||
80 | [COLOR_LSS] = {&global_settings.lss_color, LANG_SELECTOR_START_COLOR}, | 81 | [COLOR_LSS] = {&global_settings.lss_color, LANG_SELECTOR_START_COLOR}, |
81 | [COLOR_LSE] = {&global_settings.lse_color, LANG_SELECTOR_END_COLOR}, | 82 | [COLOR_LSE] = {&global_settings.lse_color, LANG_SELECTOR_END_COLOR}, |
82 | [COLOR_LST] = {&global_settings.lst_color, LANG_SELECTOR_TEXT_COLOR}, | 83 | [COLOR_LST] = {&global_settings.lst_color, LANG_SELECTOR_TEXT_COLOR}, |
84 | [COLOR_SEP] = {&global_settings.list_separator_color, LANG_LIST_SEPARATOR_COLOR}, | ||
83 | }; | 85 | }; |
84 | 86 | ||
85 | /** | 87 | /** |
@@ -91,7 +93,7 @@ static int set_color_func(void* color) | |||
91 | /* Don't let foreground be set the same as background and vice-versa */ | 93 | /* Don't let foreground be set the same as background and vice-versa */ |
92 | if (c == COLOR_BG) | 94 | if (c == COLOR_BG) |
93 | banned_color = *colors[COLOR_FG].setting; | 95 | banned_color = *colors[COLOR_FG].setting; |
94 | else if (c == COLOR_FG) | 96 | else if (c == COLOR_FG || c == COLOR_SEP) |
95 | banned_color = *colors[COLOR_BG].setting; | 97 | banned_color = *colors[COLOR_BG].setting; |
96 | 98 | ||
97 | old_color = *colors[c].setting; | 99 | old_color = *colors[c].setting; |
@@ -113,6 +115,7 @@ static int reset_color(void) | |||
113 | global_settings.lss_color = LCD_DEFAULT_LS; | 115 | global_settings.lss_color = LCD_DEFAULT_LS; |
114 | global_settings.lse_color = LCD_DEFAULT_BG; | 116 | global_settings.lse_color = LCD_DEFAULT_BG; |
115 | global_settings.lst_color = LCD_DEFAULT_FG; | 117 | global_settings.lst_color = LCD_DEFAULT_FG; |
118 | global_settings.list_separator_color = LCD_DARKGRAY; | ||
116 | 119 | ||
117 | settings_save(); | 120 | settings_save(); |
118 | settings_apply(false); | 121 | settings_apply(false); |
@@ -129,6 +132,8 @@ MENUITEM_FUNCTION(set_lse_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_END_COLOR) | |||
129 | set_color_func, (void*)COLOR_LSE, NULL, Icon_NOICON); | 132 | set_color_func, (void*)COLOR_LSE, NULL, Icon_NOICON); |
130 | MENUITEM_FUNCTION(set_lst_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_TEXT_COLOR), | 133 | MENUITEM_FUNCTION(set_lst_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_TEXT_COLOR), |
131 | set_color_func, (void*)COLOR_LST, NULL, Icon_NOICON); | 134 | set_color_func, (void*)COLOR_LST, NULL, Icon_NOICON); |
135 | MENUITEM_FUNCTION(set_sep_col, MENU_FUNC_USEPARAM, ID2P(LANG_LIST_SEPARATOR_COLOR), | ||
136 | set_color_func, (void*)COLOR_SEP, NULL, Icon_NOICON); | ||
132 | MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS), | 137 | MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS), |
133 | reset_color, NULL, NULL, Icon_NOICON); | 138 | reset_color, NULL, NULL, Icon_NOICON); |
134 | 139 | ||
@@ -140,7 +145,7 @@ MAKE_MENU(lss_settings, ID2P(LANG_SELECTOR_COLOR_MENU), | |||
140 | /* now the actual menu */ | 145 | /* now the actual menu */ |
141 | MAKE_MENU(colors_settings, ID2P(LANG_COLORS_MENU), | 146 | MAKE_MENU(colors_settings, ID2P(LANG_COLORS_MENU), |
142 | NULL, Icon_Display_menu, | 147 | NULL, Icon_Display_menu, |
143 | &lss_settings, | 148 | &lss_settings, &set_sep_col, |
144 | &set_bg_col, &set_fg_col, &reset_colors | 149 | &set_bg_col, &set_fg_col, &reset_colors |
145 | ); | 150 | ); |
146 | 151 | ||
@@ -388,6 +393,9 @@ MENUITEM_FUNCTION(browse_themes, MENU_FUNC_USEPARAM, | |||
388 | #ifdef HAVE_LCD_BITMAP | 393 | #ifdef HAVE_LCD_BITMAP |
389 | MENUITEM_SETTING(cursor_style, &global_settings.cursor_style, NULL); | 394 | MENUITEM_SETTING(cursor_style, &global_settings.cursor_style, NULL); |
390 | #endif | 395 | #endif |
396 | #if LCD_DEPTH > 1 | ||
397 | MENUITEM_SETTING(sep_menu, &global_settings.list_separator_height, NULL); | ||
398 | #endif | ||
391 | 399 | ||
392 | MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU), | 400 | MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU), |
393 | NULL, Icon_Wps, | 401 | NULL, Icon_Wps, |
@@ -418,8 +426,11 @@ MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU), | |||
418 | #ifdef HAVE_LCD_BITMAP | 426 | #ifdef HAVE_LCD_BITMAP |
419 | &bars_menu, | 427 | &bars_menu, |
420 | &cursor_style, | 428 | &cursor_style, |
429 | #if LCD_DEPTH > 1 | ||
430 | &sep_menu, | ||
421 | #endif | 431 | #endif |
422 | #ifdef HAVE_LCD_COLOR | 432 | #ifdef HAVE_LCD_COLOR |
423 | &colors_settings, | 433 | &colors_settings, |
424 | #endif | 434 | #endif |
425 | ); | 435 | #endif /* HAVE_LCD_BITMAP */ |
436 | ); | ||
diff --git a/apps/settings.h b/apps/settings.h index 62ae038385..5b876d3e67 100644 --- a/apps/settings.h +++ b/apps/settings.h | |||
@@ -531,12 +531,15 @@ struct user_settings | |||
531 | #ifdef HAVE_LCD_BITMAP | 531 | #ifdef HAVE_LCD_BITMAP |
532 | int scrollbar; /* SCROLLBAR_* enum values */ | 532 | int scrollbar; /* SCROLLBAR_* enum values */ |
533 | int scrollbar_width; | 533 | int scrollbar_width; |
534 | #endif | ||
535 | 534 | ||
536 | #ifdef HAVE_TOUCHSCREEN | 535 | #ifdef HAVE_TOUCHSCREEN |
537 | int list_line_padding; | 536 | int list_line_padding; |
538 | #endif | 537 | #endif |
539 | 538 | #if LCD_DEPTH > 1 | |
539 | int list_separator_height; /* -1=auto (== 1 currently), 0=disabled, X=height in pixels */ | ||
540 | int list_separator_color; | ||
541 | #endif | ||
542 | #endif | ||
540 | /* goto current song when exiting WPS */ | 543 | /* goto current song when exiting WPS */ |
541 | bool browse_current; /* 1=goto current song, | 544 | bool browse_current; /* 1=goto current song, |
542 | 0=goto previous location */ | 545 | 0=goto previous location */ |
diff --git a/apps/settings_list.c b/apps/settings_list.c index 9b1ec4427f..681a3ab05b 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c | |||
@@ -282,6 +282,7 @@ static const char graphic_numeric[] = "graphic,numeric"; | |||
282 | #define DEFAULT_THEME_SELECTOR_START LCD_RGBPACK(0xff, 0xeb, 0x9c) | 282 | #define DEFAULT_THEME_SELECTOR_START LCD_RGBPACK(0xff, 0xeb, 0x9c) |
283 | #define DEFAULT_THEME_SELECTOR_END LCD_RGBPACK(0xb5, 0x8e, 0x00) | 283 | #define DEFAULT_THEME_SELECTOR_END LCD_RGBPACK(0xb5, 0x8e, 0x00) |
284 | #define DEFAULT_THEME_SELECTOR_TEXT LCD_RGBPACK(0x00, 0x00, 0x00) | 284 | #define DEFAULT_THEME_SELECTOR_TEXT LCD_RGBPACK(0x00, 0x00, 0x00) |
285 | #define DEFAULT_THEME_SEPARATOR LCD_RGBPACK(0x80, 0x80, 0x80) | ||
285 | 286 | ||
286 | #define DEFAULT_BACKDROP BACKDROP_DIR "/cabbiev2.bmp" | 287 | #define DEFAULT_BACKDROP BACKDROP_DIR "/cabbiev2.bmp" |
287 | 288 | ||
@@ -323,7 +324,6 @@ static const char graphic_numeric[] = "graphic,numeric"; | |||
323 | #define DEFAULT_TAGCACHE_SCAN_PATHS "/" | 324 | #define DEFAULT_TAGCACHE_SCAN_PATHS "/" |
324 | #endif | 325 | #endif |
325 | 326 | ||
326 | #ifdef HAVE_TOUCHSCREEN | ||
327 | 327 | ||
328 | static const char* list_pad_formatter(char *buffer, size_t buffer_size, | 328 | static const char* list_pad_formatter(char *buffer, size_t buffer_size, |
329 | int val, const char *unit) | 329 | int val, const char *unit) |
@@ -348,7 +348,6 @@ static int32_t list_pad_getlang(int value, int unit) | |||
348 | } | 348 | } |
349 | } | 349 | } |
350 | 350 | ||
351 | #endif /* HAVE_TOUCHSCREEN */ | ||
352 | static const char* formatter_unit_0_is_off(char *buffer, size_t buffer_size, | 351 | static const char* formatter_unit_0_is_off(char *buffer, size_t buffer_size, |
353 | int val, const char *unit) | 352 | int val, const char *unit) |
354 | { | 353 | { |
@@ -910,6 +909,14 @@ const struct settings_list settings[] = { | |||
910 | list_pad_getlang, NULL, 16, | 909 | list_pad_getlang, NULL, 16, |
911 | -1,0,2,4,6,8,10,12,16,20,24,28,32,38,44,50), | 910 | -1,0,2,4,6,8,10,12,16,20,24,28,32,38,44,50), |
912 | #endif | 911 | #endif |
912 | #if LCD_DEPTH > 1 | ||
913 | TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, list_separator_height, LANG_LIST_SEPARATOR, | ||
914 | 0, "list separator height", "auto,off", UNIT_PIXEL, | ||
915 | list_pad_formatter, list_pad_getlang, NULL, 15, | ||
916 | -1,0,1,2,3,4,5,7,9,11,13,16,20,25,30), | ||
917 | {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.list_separator_color,-1, | ||
918 | INT(DEFAULT_THEME_SEPARATOR),"list separator color",NULL,UNUSED}, | ||
919 | #endif | ||
913 | #if CONFIG_KEYPAD == RECORDER_PAD | 920 | #if CONFIG_KEYPAD == RECORDER_PAD |
914 | OFFON_SETTING(F_THEMESETTING,buttonbar, LANG_BUTTON_BAR ,true,"buttonbar", NULL), | 921 | OFFON_SETTING(F_THEMESETTING,buttonbar, LANG_BUTTON_BAR ,true,"buttonbar", NULL), |
915 | #endif | 922 | #endif |