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) line.height = list->line_height[screen]; title_text_vp->height = line.height; +#if LCD_DEPTH > 1 + /* XXX: Do we want to support the separator on remote displays? */ + if (display->screen_type == SCREEN_MAIN && global_settings.list_separator_height != 0) + line.separator_height = abs(global_settings.list_separator_height) + + (lcd_get_dpi() > 200 ? 2 : 1); +#endif + #ifdef HAVE_LCD_COLOR if (list->title_color >= 0) line.style |= (STYLE_COLORED|list->title_color); @@ -154,7 +161,11 @@ void list_draw(struct screen *display, struct gui_synclist *list) linedes.height = list->line_height[screen]; linedes.nlines = list->selected_size; - +#if LCD_DEPTH > 1 + /* XXX: Do we want to support the separator on remote displays? */ + if (display->screen_type == SCREEN_MAIN) + linedes.separator_height = abs(global_settings.list_separator_height); +#endif start = list_start_item; end = start + nb_lines; 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, int style = line->style; int width = display->getwidth(); int height = line->height == -1 ? display->getcharheight() : line->height; + int bar_height = height; + + /* mask out gradient and colorbar styles for non-color displays */ + if (display->depth < 16 && (style & (STYLE_COLORBAR|STYLE_GRADIENT))) + { + style &= ~(STYLE_COLORBAR|STYLE_GRADIENT); + style |= STYLE_INVERT; + } + + if (line->separator_height > 0 && (line->line == line->nlines-1)) + { + int sep_height = MIN(line->separator_height, height); + display->set_drawmode(DRMODE_FG); +#if LCD_DEPTH > 1 + display->set_foreground(global_settings.list_separator_color); +#endif + display->fillrect(x, y + height - sep_height, width, sep_height); + bar_height -= sep_height; +#if LCD_DEPTH > 1 + display->set_foreground(global_settings.fg_color); +#endif + } /* mask out gradient and colorbar styles for non-color displays */ if (display->depth < 16) @@ -322,7 +344,7 @@ static void style_line(struct screen *display, #ifdef HAVE_LCD_COLOR case STYLE_GRADIENT: display->set_drawmode(DRMODE_FG); - display->gradient_fillrect_part(x, y, width, height, + display->gradient_fillrect_part(x, y, width, bar_height, line->line_color, line->line_end_color, height*line->nlines, @@ -331,16 +353,16 @@ static void style_line(struct screen *display, case STYLE_COLORBAR: display->set_drawmode(DRMODE_FG); display->set_foreground(line->line_color); - display->fillrect(x, y, width - x, height); + display->fillrect(x, y, width - x, bar_height); break; #endif case STYLE_INVERT: display->set_drawmode(DRMODE_FG); - display->fillrect(x, y, width - x, height); + display->fillrect(x, y, width - x, bar_height); break; case STYLE_DEFAULT: default: display->set_drawmode(DRMODE_BG | DRMODE_INVERSEVID); - display->fillrect(x, y, width - x, height); + display->fillrect(x, y, width - x, bar_height); break; case STYLE_NONE: 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 { enum line_styles style; /* whether the line can scroll */ bool scroll; + /* height of the line separator (in pixels). 0 to disable drawing + * of the separator */ + int8_t separator_height; }; /* default initializer, can be used for static initialitation also. * This initializer will result in single lines without style that don't scroll */ -#define LINE_DESC_DEFINIT { .style = STYLE_DEFAULT, .height = -1, .line = 0, .nlines = 1, .scroll = false } +#define LINE_DESC_DEFINIT { .style = STYLE_DEFAULT, .height = -1, .separator_height = 0, .line = 0, .nlines = 1, .scroll = false } /** * 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 @@ -12925,6 +12925,34 @@ *: "Cancel Sleep Timer" + + id: LANG_LIST_SEPARATOR + desc: line between lines in lists + user: core + + *: "Line Separator" + + + *: "Line Separator" + + + *: "Line Separator" + + + + id: LANG_LIST_SEPARATOR_COLOR + desc: line between lines in lists + user: core + + *: "Line Separator Colour" + + + *: "Line Separator Colour" + + + *: "Line Separator Colour" + + id: LANG_SHORTCUTS desc: Title in the shortcuts menu 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 { COLOR_LSS, COLOR_LSE, COLOR_LST, + COLOR_SEP, COLOR_COUNT }; static struct colour_info @@ -80,6 +81,7 @@ static struct colour_info [COLOR_LSS] = {&global_settings.lss_color, LANG_SELECTOR_START_COLOR}, [COLOR_LSE] = {&global_settings.lse_color, LANG_SELECTOR_END_COLOR}, [COLOR_LST] = {&global_settings.lst_color, LANG_SELECTOR_TEXT_COLOR}, + [COLOR_SEP] = {&global_settings.list_separator_color, LANG_LIST_SEPARATOR_COLOR}, }; /** @@ -91,7 +93,7 @@ static int set_color_func(void* color) /* Don't let foreground be set the same as background and vice-versa */ if (c == COLOR_BG) banned_color = *colors[COLOR_FG].setting; - else if (c == COLOR_FG) + else if (c == COLOR_FG || c == COLOR_SEP) banned_color = *colors[COLOR_BG].setting; old_color = *colors[c].setting; @@ -113,6 +115,7 @@ static int reset_color(void) global_settings.lss_color = LCD_DEFAULT_LS; global_settings.lse_color = LCD_DEFAULT_BG; global_settings.lst_color = LCD_DEFAULT_FG; + global_settings.list_separator_color = LCD_DARKGRAY; settings_save(); settings_apply(false); @@ -129,6 +132,8 @@ MENUITEM_FUNCTION(set_lse_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_END_COLOR) set_color_func, (void*)COLOR_LSE, NULL, Icon_NOICON); MENUITEM_FUNCTION(set_lst_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_TEXT_COLOR), set_color_func, (void*)COLOR_LST, NULL, Icon_NOICON); +MENUITEM_FUNCTION(set_sep_col, MENU_FUNC_USEPARAM, ID2P(LANG_LIST_SEPARATOR_COLOR), + set_color_func, (void*)COLOR_SEP, NULL, Icon_NOICON); MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS), reset_color, NULL, NULL, Icon_NOICON); @@ -140,7 +145,7 @@ MAKE_MENU(lss_settings, ID2P(LANG_SELECTOR_COLOR_MENU), /* now the actual menu */ MAKE_MENU(colors_settings, ID2P(LANG_COLORS_MENU), NULL, Icon_Display_menu, - &lss_settings, + &lss_settings, &set_sep_col, &set_bg_col, &set_fg_col, &reset_colors ); @@ -388,6 +393,9 @@ MENUITEM_FUNCTION(browse_themes, MENU_FUNC_USEPARAM, #ifdef HAVE_LCD_BITMAP MENUITEM_SETTING(cursor_style, &global_settings.cursor_style, NULL); #endif +#if LCD_DEPTH > 1 +MENUITEM_SETTING(sep_menu, &global_settings.list_separator_height, NULL); +#endif MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU), NULL, Icon_Wps, @@ -418,8 +426,11 @@ MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU), #ifdef HAVE_LCD_BITMAP &bars_menu, &cursor_style, +#if LCD_DEPTH > 1 + &sep_menu, #endif #ifdef HAVE_LCD_COLOR &colors_settings, #endif - ); +#endif /* HAVE_LCD_BITMAP */ +); 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 #ifdef HAVE_LCD_BITMAP int scrollbar; /* SCROLLBAR_* enum values */ int scrollbar_width; -#endif #ifdef HAVE_TOUCHSCREEN int list_line_padding; #endif - +#if LCD_DEPTH > 1 + int list_separator_height; /* -1=auto (== 1 currently), 0=disabled, X=height in pixels */ + int list_separator_color; +#endif +#endif /* goto current song when exiting WPS */ bool browse_current; /* 1=goto current song, 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"; #define DEFAULT_THEME_SELECTOR_START LCD_RGBPACK(0xff, 0xeb, 0x9c) #define DEFAULT_THEME_SELECTOR_END LCD_RGBPACK(0xb5, 0x8e, 0x00) #define DEFAULT_THEME_SELECTOR_TEXT LCD_RGBPACK(0x00, 0x00, 0x00) +#define DEFAULT_THEME_SEPARATOR LCD_RGBPACK(0x80, 0x80, 0x80) #define DEFAULT_BACKDROP BACKDROP_DIR "/cabbiev2.bmp" @@ -323,7 +324,6 @@ static const char graphic_numeric[] = "graphic,numeric"; #define DEFAULT_TAGCACHE_SCAN_PATHS "/" #endif -#ifdef HAVE_TOUCHSCREEN static const char* list_pad_formatter(char *buffer, size_t buffer_size, int val, const char *unit) @@ -348,7 +348,6 @@ static int32_t list_pad_getlang(int value, int unit) } } -#endif /* HAVE_TOUCHSCREEN */ static const char* formatter_unit_0_is_off(char *buffer, size_t buffer_size, int val, const char *unit) { @@ -910,6 +909,14 @@ const struct settings_list settings[] = { list_pad_getlang, NULL, 16, -1,0,2,4,6,8,10,12,16,20,24,28,32,38,44,50), #endif +#if LCD_DEPTH > 1 + TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, list_separator_height, LANG_LIST_SEPARATOR, + 0, "list separator height", "auto,off", UNIT_PIXEL, + list_pad_formatter, list_pad_getlang, NULL, 15, + -1,0,1,2,3,4,5,7,9,11,13,16,20,25,30), + {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.list_separator_color,-1, + INT(DEFAULT_THEME_SEPARATOR),"list separator color",NULL,UNUSED}, +#endif #if CONFIG_KEYPAD == RECORDER_PAD OFFON_SETTING(F_THEMESETTING,buttonbar, LANG_BUTTON_BAR ,true,"buttonbar", NULL), #endif diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h index b72989fdb5..673ce069af 100644 --- a/firmware/export/lcd.h +++ b/firmware/export/lcd.h @@ -114,7 +114,6 @@ struct scrollinfo; #define STRIDE(screen, w, h) (screen==SCREEN_MAIN?STRIDE_MAIN((w), \ (h)):STRIDE_REMOTE((w),(h))) - #ifdef HAVE_LCD_BITMAP #if LCD_DEPTH <=8 #if (LCD_PIXELFORMAT == VERTICAL_INTERLEAVED) \ diff --git a/wps/WPSLIST b/wps/WPSLIST index 3b10c3002b..3286b1eb8b 100644 --- a/wps/WPSLIST +++ b/wps/WPSLIST @@ -202,6 +202,11 @@ viewers iconset..+x2: icons/tango_small_viewers_mono.bmp show icons: on statusbar: top ui viewport: - +# Touchscreen: whether to show line separators or not. Default to yes only on touchscreen targets. +list separator height: 0 +list separator height..+&touchscreen: auto +list separator color: 808080 + diff --git a/wps/wpsbuild.pl b/wps/wpsbuild.pl index d6d8085449..52492f6b71 100755 --- a/wps/wpsbuild.pl +++ b/wps/wpsbuild.pl @@ -55,6 +55,8 @@ my $font; my $remotefont; my $fgcolor; my $bgcolor; +my $sepcolor; +my $sep; my $statusbar; my $remotestatusbar; my $author; @@ -291,6 +293,9 @@ MOO push @out, "line selector start color: $lineselectstart\n" if($lineselectstart); push @out, "line selector end color: $lineselectend\n" if($lineselectend);; push @out, "line selector text color: $lineselecttextcolor\n" if($lineselecttextcolor); + # list separator actually depends on HAVE_TOUCSCREEN + push @out, "list separator height: $sep\n" if($sep); + push @out, "list separator color: $sepcolor\n" if($sepcolor); } push @out, "font: $font\n" if (defined($font)); @@ -430,6 +435,8 @@ while() { undef $remotefont; undef $fgcolor; undef $bgcolor; + undef $sepcolor; + undef $sep; undef $statusbar; undef $remotestatusbar; undef $author; @@ -502,6 +509,12 @@ while() { elsif($l =~ /^Background Color: *(.*)/i) { $bgcolor = $1; } + elsif($_ = check_res_feature($l, "list separator color")) { + $sepcolor = $_; + } + elsif($_ = check_res_feature($l, "list separator height")) { + $sep = $_; + } elsif($l =~ /^line selector start color: *(.*)/i) { $lineselectstart = $1; }