Index: apps/gui/gwps.h =================================================================== --- apps/gui/gwps.h.orig +++ apps/gui/gwps.h @@ -52,6 +52,11 @@ #define WPS_ALBUMART_INCREASE 8 /* increase if smaller */ #define WPS_ALBUMART_DECREASE 16 /* decrease if larger */ +/* progressbar types */ +#define NORMAL 0 +#define BITMAP 1 +#define SLIDER 2 + /* wps_data*/ #ifdef HAVE_LCD_BITMAP @@ -70,6 +75,7 @@ struct gui_img{ struct prog_img{ /*progressbar image*/ struct bitmap bm; bool have_bitmap_pb; + short pb_type; }; #endif @@ -197,6 +203,7 @@ enum wps_token_type { /* Image */ WPS_TOKEN_IMAGE_BACKDROP, WPS_TOKEN_IMAGE_PROGRESS_BAR, + WPS_TOKEN_SLIDER_PROGRESS_BAR, WPS_TOKEN_IMAGE_PRELOAD, WPS_TOKEN_IMAGE_PRELOAD_DISPLAY, WPS_TOKEN_IMAGE_DISPLAY, Index: apps/gui/wps_parser.c =================================================================== --- apps/gui/wps_parser.c.orig +++ apps/gui/wps_parser.c @@ -287,6 +287,7 @@ static const struct wps_tag all_tags[] = { WPS_TOKEN_IMAGE_DISPLAY, "x", 0, parse_image_load }, { WPS_TOKEN_IMAGE_PROGRESS_BAR, "P", 0, parse_image_special }, + { WPS_TOKEN_SLIDER_PROGRESS_BAR, "S", 0, parse_image_special }, #if (LCD_DEPTH > 1) || (defined(HAVE_LCD_REMOTE) && (LCD_REMOTE_DEPTH > 1)) { WPS_TOKEN_IMAGE_BACKDROP, "X", 0, parse_image_special }, #endif @@ -495,6 +496,13 @@ static int parse_image_special(const cha { /* format: %P|filename.bmp| */ bmp_names[PROGRESSBAR_BMP] = wps_bufptr + 1; + wps_data->progressbar.pb_type=BITMAP; + } + else if (token->type == WPS_TOKEN_SLIDER_PROGRESS_BAR) + { + /* format: %S|filename.bmp| */ + bmp_names[PROGRESSBAR_BMP] = wps_bufptr + 1; + wps_data->progressbar.pb_type=SLIDER; } #if LCD_DEPTH > 1 else if (token->type == WPS_TOKEN_IMAGE_BACKDROP) @@ -1103,7 +1111,7 @@ static void wps_images_clear(struct wps_ data->img[i].display = false; data->img[i].always_display = false; } - data->progressbar.have_bitmap_pb = false; + data->progressbar.pb_type = NORMAL; } #endif Index: apps/gui/wps_debug.c =================================================================== --- apps/gui/wps_debug.c.orig +++ apps/gui/wps_debug.c @@ -227,6 +227,10 @@ static void dump_wps_tokens(struct wps_d snprintf(buf, sizeof(buf), "progressbar bitmap"); break; + case WPS_TOKEN_SLIDER_PROGRESS_BAR: + snprintf(buf, sizeof(buf), "progressbar slider"); + break; + case WPS_TOKEN_PEAKMETER: snprintf(buf, sizeof(buf), "peakmeter"); break; Index: apps/gui/gwps-common.c =================================================================== --- apps/gui/gwps-common.c.orig +++ apps/gui/gwps-common.c @@ -460,6 +460,28 @@ void display_keylock_text(bool locked) #ifdef HAVE_LCD_BITMAP +static void slider_progressbar_draw(struct screen * screen, struct bitmap bm, + int pb_x, int pb_y, int pb_width, + long total_length, long progress) +{ + int slider_x = pb_x + (pb_width - bm.width) * progress / total_length; + + screen->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + screen->fillrect(pb_x, pb_y, pb_width, bm.height); + + screen->set_drawmode(DRMODE_FG); +#if LCD_DEPTH > 1 + if(bm.format == FORMAT_MONO) { +#endif + screen->mono_bitmap(bm.data, slider_x, pb_y, bm.width, bm.height); +#if LCD_DEPTH > 1 + } else { + screen->transparent_bitmap((fb_data *)bm.data, slider_x, + pb_y, bm.width, bm.height); + } +#endif +} + static void draw_progressbar(struct gui_wps *gwps, int line) { struct wps_data *data = gwps->data; @@ -478,7 +500,7 @@ static void draw_progressbar(struct gui_ if (!data->progress_end) data->progress_end=display->width; - if (gwps->data->progressbar.have_bitmap_pb) + if (gwps->data->progressbar.pb_type==BITMAP) gui_bitmap_scrollbar_draw(display, data->progressbar.bm, data->progress_start, sb_y, data->progress_end-data->progress_start, @@ -487,6 +509,13 @@ static void draw_progressbar(struct gui_ state->id3->length ? state->id3->elapsed + state->ff_rewind_count : 0, HORIZONTAL); + else if (gwps->data->progressbar.pb_type==SLIDER) + slider_progressbar_draw(display, data->progressbar.bm, + data->progress_start, sb_y, + data->progress_end-data->progress_start, + state->id3->length?state->id3->length:1, + state->id3->length?state->id3->elapsed + state->ff_rewind_count:0); + else gui_scrollbar_draw(display, data->progress_start, sb_y, data->progress_end-data->progress_start,