Index: apps/gui/gwps-common.c =================================================================== --- apps/gui/gwps-common.c (revision 17668) +++ apps/gui/gwps-common.c (working copy) @@ -494,37 +494,37 @@ #ifdef HAVE_LCD_BITMAP -static void draw_progressbar(struct gui_wps *gwps, int line) +static void draw_progressbar(struct gui_wps *gwps, int line, + struct progressbar *pb) { - struct wps_data *data = gwps->data; struct screen *display = gwps->display; struct wps_state *state = gwps->state; int h = font_get(display->getfont())->height; int sb_y; - if (data->progress_top < 0) + if (pb->top < 0) sb_y = line*h + display->getymargin() + - ((h > data->progress_height + 1) - ? (h - data->progress_height) / 2 : 1); + ((h > pb->height + 1) + ? (h - pb->height) / 2 : 1); else - sb_y = data->progress_top; + sb_y = pb->top; - if (!data->progress_end) - data->progress_end=display->getwidth(); + if (!pb->end) + pb->end=display->getwidth(); - if (gwps->data->progressbar.have_bitmap_pb) - gui_bitmap_scrollbar_draw(display, data->progressbar.bm, - data->progress_start, sb_y, - data->progress_end-data->progress_start, - data->progressbar.bm.height, + if (pb->have_bitmap_pb) + gui_bitmap_scrollbar_draw(display, pb->bm, + pb->start, sb_y, + pb->end-pb->start, + pb->bm.height, state->id3->length ? state->id3->length : 1, 0, state->id3->length ? state->id3->elapsed + state->ff_rewind_count : 0, HORIZONTAL); else - gui_scrollbar_draw(display, data->progress_start, sb_y, - data->progress_end-data->progress_start, - data->progress_height, + gui_scrollbar_draw(display, pb->start, sb_y, + pb->end-pb->start, + pb->height, state->id3->length ? state->id3->length : 1, 0, state->id3->length ? state->id3->elapsed + state->ff_rewind_count : 0, @@ -533,14 +533,14 @@ #ifdef AB_REPEAT_ENABLE if ( ab_repeat_mode_enabled() && state->id3->length != 0 ) ab_draw_markers(display, state->id3->length, - data->progress_start, data->progress_end, sb_y, - data->progress_height); + pb->start, pb->end, sb_y, + pb->height); #endif if ( cuesheet_is_enabled() && state->id3->cuesheet_type ) cue_draw_markers(display, state->id3->length, - data->progress_start, data->progress_end, - sb_y+1, data->progress_height-2); + pb->start, pb->end, + sb_y+1, pb->height-2); } /* clears the area where the image was shown */ @@ -1608,7 +1608,24 @@ *buf++ = 0; cur_align_start = buf; break; - + case WPS_VIEWPORT_ENABLE: + { + char label = data->tokens[i].value.i; + int j; + char temp = VP_DRAW_HIDEABLE; + for(j=0;jnum_viewports;j++) + { + temp = VP_DRAW_HIDEABLE; + if ((data->viewports[j].hidden_flags&VP_DRAW_HIDEABLE) && + (data->viewports[j].label == label)) + { + if (data->viewports[j].hidden_flags&VP_DRAW_WASHIDDEN) + temp |= VP_DRAW_WASHIDDEN; + data->viewports[j].hidden_flags = temp; + } + } + } + break; default: { /* get the value of the tag and copy it to the buffer */ @@ -1932,6 +1949,7 @@ int v, line, i, subline_idx; unsigned char flags; char linebuf[MAX_PATH]; + unsigned char called_refresh_mode = refresh_mode; struct align_pos align; align.left = NULL; @@ -1981,15 +1999,22 @@ state->ff_rewind_count = ffwd_offset; + /* disable any viewports which are conditionally displayed */ for (v = 0; v < data->num_viewports; v++) { - display->set_viewport(&data->viewports[v].vp); - - if (refresh_mode == WPS_REFRESH_ALL) + if (data->viewports[v].hidden_flags&VP_DRAW_HIDEABLE) { - display->clear_viewport(); + if (data->viewports[v].hidden_flags&VP_DRAW_HIDDEN) + data->viewports[v].hidden_flags |= VP_DRAW_WASHIDDEN; + else + data->viewports[v].hidden_flags |= VP_DRAW_HIDDEN; } + } + for (v = 0; v < data->num_viewports; v++) + { + display->set_viewport(&data->viewports[v].vp); + #ifdef HAVE_LCD_BITMAP /* Set images to not to be displayed */ for (i = 0; i < MAX_IMAGES; i++) @@ -1997,7 +2022,26 @@ data->img[i].display = -1; } #endif - + /* dont redraw the viewport if its disabled */ + if ((data->viewports[v].hidden_flags&VP_DRAW_HIDDEN)) + { + if (!(data->viewports[v].hidden_flags&VP_DRAW_WASHIDDEN)) + display->scroll_stop(&data->viewports[v].vp); + data->viewports[v].hidden_flags |= VP_DRAW_WASHIDDEN; + continue; + } + else if ((((data->viewports[v].hidden_flags&VP_DRAW_HIDDEN) == 0) && + (data->viewports[v].hidden_flags&(VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE)) + == (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE))) + { + refresh_mode = WPS_REFRESH_ALL; + data->viewports[v].hidden_flags = VP_DRAW_HIDEABLE; + } + if (refresh_mode == WPS_REFRESH_ALL) + { + display->clear_viewport(); + } + for (line = data->viewports[v].first_line; line <= data->viewports[v].last_line; line++) { @@ -2025,7 +2069,9 @@ { /* the progressbar should be alone on its line */ update_line = false; - draw_progressbar(gwps, line - data->viewports[v].first_line); + if (data->viewports[v].pb) + draw_progressbar(gwps, line - data->viewports[v].first_line, + data->viewports[v].pb); } /* peakmeter */ @@ -2074,6 +2120,7 @@ else write_line(display, &align, line - data->viewports[v].first_line, false); } + refresh_mode = called_refresh_mode; } Index: apps/gui/wps_debug.c =================================================================== --- apps/gui/wps_debug.c (revision 17668) +++ apps/gui/wps_debug.c (working copy) @@ -431,6 +431,10 @@ snprintf(buf, bufsize, "pitch value"); break; #endif + case WPS_VIEWPORT_ENABLE: + snprintf(buf, bufsize, "enable VP:%d", + token->value.i); + break; default: snprintf(buf, bufsize, "FIXME (code: %d)", Index: apps/gui/gwps.h =================================================================== --- apps/gui/gwps.h (revision 17668) +++ apps/gui/gwps.h (working copy) @@ -70,7 +70,13 @@ bool always_display; /* not using the preload/display mechanism */ }; -struct prog_img{ /*progressbar image*/ +struct progressbar { + /* regular pb */ + short top; + short height; + short start; + short end; + /*progressbar image*/ struct bitmap bm; bool have_bitmap_pb; }; @@ -85,6 +91,7 @@ #ifdef HAVE_LCD_BITMAP #define MAX_IMAGES (26*2) /* a-z and A-Z */ +#define MAX_PRGRESSBARS 3 /* The image buffer is big enough to store one full-screen native bitmap, plus two full-screen mono bitmaps. */ @@ -271,8 +278,11 @@ #if (CONFIG_LED == LED_VIRTUAL) || defined(HAVE_REMOTE_LCD) /* Virtual LED */ - WPS_TOKEN_VLED_HDD + WPS_TOKEN_VLED_HDD, #endif + + /* Viewport display */ + WPS_VIEWPORT_ENABLE }; struct wps_token { @@ -325,7 +335,7 @@ struct wps_viewport { struct viewport vp; /* The LCD viewport struct */ - + struct progressbar *pb; /* Indexes of the first and last lines belonging to this viewport in the lines[] array */ int first_line, last_line; @@ -338,17 +348,15 @@ { #ifdef HAVE_LCD_BITMAP struct gui_img img[MAX_IMAGES]; - struct prog_img progressbar; unsigned char img_buf[IMG_BUFSIZE]; unsigned char* img_buf_ptr; int img_buf_free; bool wps_sb_tag; bool show_sb_on_wps; - short progress_top; - short progress_height; - short progress_start; - short progress_end; + struct progressbar progressbar[MAX_PRGRESSBARS]; + short progressbar_count; + bool peak_meter_enabled; #ifdef HAVE_ALBUMART Index: apps/gui/wps_parser.c =================================================================== --- apps/gui/wps_parser.c (revision 17668) +++ apps/gui/wps_parser.c (working copy) @@ -80,13 +80,13 @@ #ifdef HAVE_LCD_BITMAP #if LCD_DEPTH > 1 -#define MAX_BITMAPS (MAX_IMAGES+2) /* WPS images + pbar bitmap + backdrop */ +#define MAX_BITMAPS (MAX_IMAGES+MAX_PRGRESSBARS+1) /* WPS images + pbar bitmap + backdrop */ #else -#define MAX_BITMAPS (MAX_IMAGES+1) /* WPS images + pbar bitmap */ +#define MAX_BITMAPS (MAX_IMAGES+MAX_PRGRESSBARS) /* WPS images + pbar bitmap */ #endif #define PROGRESSBAR_BMP MAX_IMAGES -#define BACKDROP_BMP (MAX_IMAGES+1) +#define BACKDROP_BMP (MAX_BITMAPS-1) /* pointers to the bitmap filenames in the WPS source */ static const char *bmp_names[MAX_BITMAPS]; @@ -129,6 +129,8 @@ struct wps_token *token, struct wps_data *wps_data); #ifdef HAVE_LCD_BITMAP +static int parse_viewport_display(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data); static int parse_viewport(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); static int parse_leftmargin(const char *wps_bufptr, @@ -317,13 +319,14 @@ parse_image_display }, { WPS_TOKEN_IMAGE_DISPLAY, "x", 0, parse_image_load }, - { WPS_TOKEN_IMAGE_PROGRESS_BAR, "P", 0, parse_image_special }, #ifdef HAVE_ALBUMART { WPS_NO_TOKEN, "Cl", 0, parse_albumart_load }, { WPS_TOKEN_ALBUMART_DISPLAY, "C", WPS_REFRESH_STATIC, parse_albumart_conditional }, #endif + { WPS_VIEWPORT_ENABLE, "Ve", WPS_REFRESH_STATIC, + parse_viewport_display }, { WPS_NO_TOKEN, "V", 0, parse_viewport }, #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) @@ -536,6 +539,26 @@ return skip_end_of_line(wps_bufptr); } +static int parse_viewport_display(const char *wps_bufptr, + struct wps_token *token, + struct wps_data *wps_data) +{ + (void)wps_data; + char letter = wps_bufptr[0]; + + if (letter < 'a' || letter > ('a' + WPS_MAX_VIEWPORTS)) + { + /* invalid viewport tag */ + return WPS_ERROR_INVALID_PARAM; + } + + /* for these to work, this tag needs to be before %V + so set token->value.i to the letter and change that + to the viewports index when its loaded */ + token->value.i = letter; + return 1; +} + static int parse_viewport(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data) @@ -545,17 +568,34 @@ int depth; (void)token; /* Kill warnings */ + + if (wps_data->num_viewports >= WPS_MAX_VIEWPORTS) + return WPS_ERROR_INVALID_PARAM; - if (*wps_bufptr != '|') + wps_data->num_viewports++; + + /* check for the optional letter to signify its a hideable viewport */ + /* %Vl|