From eda80390d5afc4346d2e64a256762df7df30bb17 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Sun, 15 Aug 2010 14:13:36 +0000 Subject: A bunch of new features for the bar type tags (%pb, %pv, %bl, etc): * the bar orientation (horiz/vert) is now chosen based on the width and heigt values (or can be forced). * the fill direction can now be inverted (fill right to left, or top to bottom is considered inverted) * It can now draw a slider type bar instead of a fill type (or indeed a slider with a fill type) To configure the new bar, any (or all) of the following params can be used after the bmp filename (order makes no difference either): invert - cause the bar to fill in the inverted direction vertical - draw a vertical bar (not needed if the height > width) horizontal - draw a horizontal bar (this is obviously the default) nofill - dont draw the filling bar (this still draws the outline, obviously pointless without the slider param) slider - draw an image for the slider. The next param MUST be the label of the image to draw. No option to use a subimage here, so the whole image needs to be the image you want on the slider. example: %pb(0,0,-,-,-,nofill, slider, slider_image, invert) - draw a boring horizontal progressbar which doesnt fill and only draws the image "slider_image" which moves right to left. the slider type might need some tweaking. let us know how it goes git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27821 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_display.c | 77 +++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 8 deletions(-) (limited to 'apps/gui/skin_engine/skin_display.c') diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index 53b568ad53..8e08343d82 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -129,7 +129,10 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) struct wps_state *state = gwps->state; struct mp3entry *id3 = state->id3; int y = pb->y, height = pb->height; - unsigned long length, elapsed; + unsigned long length, end; + int flags = HORIZONTAL; + + int drawn_length, drawn_end; if (height < 0) height = font_get(vp->font)->height; @@ -148,39 +151,62 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) int minvol = sound_min(SOUND_VOLUME); int maxvol = sound_max(SOUND_VOLUME); length = maxvol-minvol; - elapsed = global_settings.volume-minvol; + end = global_settings.volume-minvol; } else if (pb->type == SKIN_TOKEN_BATTERY_PERCENTBAR) { length = 100; - elapsed = battery_level(); + end = battery_level(); } #if CONFIG_TUNER else if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF)) { int min = fm_region_data[global_settings.fm_region].freq_min; - elapsed = radio_current_frequency() - min; + end = radio_current_frequency() - min; length = fm_region_data[global_settings.fm_region].freq_max - min; } #endif else if (id3 && id3->length) { length = id3->length; - elapsed = id3->elapsed + state->ff_rewind_count; + end = id3->elapsed + state->ff_rewind_count; } else { length = 1; - elapsed = 0; + end = 0; + } + + if (pb->nofill) + { + drawn_length = 1; + drawn_end = 0; + } + else + { + drawn_length = length; + drawn_end = end; + } + + if (!pb->horizontal) + { + /* we want to fill upwards which is technically inverted. */ + flags = VERTICAL|INVERTFILL; + } + + if (pb->invert_fill_direction) + { + flags ^= INVERTFILL; } + if (pb->have_bitmap_pb) gui_bitmap_scrollbar_draw(display, &pb->bm, pb->x, y, pb->width, pb->bm.height, - length, 0, elapsed, HORIZONTAL); + drawn_length, 0, drawn_end, flags); else gui_scrollbar_draw(display, pb->x, y, pb->width, height, - length, 0, elapsed, HORIZONTAL); + drawn_length, 0, drawn_end, flags); if (pb->type == SKIN_TOKEN_PROGRESSBAR) { @@ -201,6 +227,41 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) { presets_draw_markers(display, pb->x, y, pb->width, height); } +#endif + } + + if (pb->slider) + { + int x = pb->x, y = pb->y; + int width = pb->width; + int height = pb->height; + struct gui_img *img = pb->slider; + + if (flags&VERTICAL) + { + y += pb->height*end/length; + height = img->bm.height; + } + else + { + x += pb->width*end/length; + width = img->bm.width; + } +#if LCD_DEPTH > 1 + if(img->bm.format == FORMAT_MONO) { +#endif + display->mono_bitmap_part(img->bm.data, + 0, 0, + img->bm.width, x, + y, width, height); +#if LCD_DEPTH > 1 + } else { + display->transparent_bitmap_part((fb_data *)img->bm.data, + 0, 0, + STRIDE(display->screen_type, + img->bm.width, img->bm.height), + x, y, width, height); + } #endif } } -- cgit