summaryrefslogtreecommitdiffstats
path: root/apps/gui/skin_engine/skin_display.c
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2010-08-15 14:13:36 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2010-08-15 14:13:36 +0000
commiteda80390d5afc4346d2e64a256762df7df30bb17 (patch)
treeb3f9fd726fdb1172b9f048cedb4bbb6808c03aa7 /apps/gui/skin_engine/skin_display.c
parentac2c69ccae5db7d5e22acf976910cdf3be84fe5a (diff)
downloadrockbox-eda80390d5afc4346d2e64a256762df7df30bb17.tar.gz
rockbox-eda80390d5afc4346d2e64a256762df7df30bb17.zip
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
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r--apps/gui/skin_engine/skin_display.c77
1 files changed, 69 insertions, 8 deletions
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)
{
@@ -203,6 +229,41 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
}
#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
+ }
}
/* clears the area where the image was shown */