summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/skin_engine/skin_display.c58
-rw-r--r--apps/gui/skin_engine/skin_parser.c3
-rw-r--r--apps/gui/skin_engine/wps_internals.h1
-rw-r--r--manual/appendix/wps_tags.tex8
4 files changed, 48 insertions, 22 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 24e976d393..1418d91b57 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -131,7 +131,7 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
struct viewport *vp = pb->vp;
struct wps_state *state = skin_get_global_state();
struct mp3entry *id3 = state->id3;
- int y = pb->y, height = pb->height;
+ int x = pb->x, y = pb->y, width = pb->width, height = pb->height;
unsigned long length, end;
int flags = HORIZONTAL;
@@ -194,29 +194,48 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
flags |= INNER_NOFILL;
}
- if (pb->have_bitmap_pb)
- gui_bitmap_scrollbar_draw(display, &pb->bm,
- pb->x, y, pb->width, height,
- length, 0, end, flags);
- else
- gui_scrollbar_draw(display, pb->x, y, pb->width, height,
- length, 0, end, flags);
+ if (pb->slider)
+ {
+ struct gui_img *img = pb->slider;
+ /* clear the slider */
+ screen_clear_area(display, x, y, width, height);
+
+ /* shrink the bar so the slider is inside bounds */
+ if (flags&HORIZONTAL)
+ {
+ width -= img->bm.width;
+ x += img->bm.width / 2;
+ }
+ else
+ {
+ height -= img->bm.height;
+ y += img->bm.height / 2;
+ }
+ }
+ if (!pb->nobar)
+ {
+ if (pb->have_bitmap_pb)
+ gui_bitmap_scrollbar_draw(display, &pb->bm,
+ x, y, width, height,
+ length, 0, end, flags);
+ else
+ gui_scrollbar_draw(display, x, y, width, height,
+ length, 0, end, flags);
+ }
if (pb->slider)
{
int xoff = 0, yoff = 0;
- int w = pb->width, h = height;
+ int w = width, h = height;
struct gui_img *img = pb->slider;
if (flags&HORIZONTAL)
{
w = img->bm.width;
- xoff = pb->width * end / length;
+ xoff = width * end / length;
if (flags&INVERTFILL)
- xoff = pb->width - xoff;
-#if 0 /* maybe add this in later, make the slider bmp overlap abit */
+ xoff = width - xoff;
xoff -= w / 2;
-#endif
}
else
{
@@ -224,23 +243,21 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
yoff = height * end / length;
if (flags&INVERTFILL)
yoff = height - yoff;
-#if 0 /* maybe add this in later, make the slider bmp overlap abit */
yoff -= h / 2;
-#endif
}
#if LCD_DEPTH > 1
if(img->bm.format == FORMAT_MONO) {
#endif
display->mono_bitmap_part(img->bm.data,
0, 0, img->bm.width,
- pb->x + xoff, y + yoff, w, h);
+ x + xoff, y + yoff, w, h);
#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),
- pb->x + xoff, y + yoff, w, h);
+ x + xoff, y + yoff, w, h);
}
#endif
}
@@ -251,18 +268,17 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
{
#ifdef AB_REPEAT_ENABLE
if (ab_repeat_mode_enabled())
- ab_draw_markers(display, id3->length,
- pb->x, y, pb->width, height);
+ ab_draw_markers(display, id3->length, x, y, width, height);
#endif
if (id3->cuesheet)
cue_draw_markers(display, id3->cuesheet, id3->length,
- pb->x, y+1, pb->width, height-2);
+ x, y+1, width, height-2);
}
#if 0 /* disable for now CONFIG_TUNER */
else if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF))
{
- presets_draw_markers(display, pb->x, y, pb->width, height);
+ presets_draw_markers(display, x, y, width, height);
}
#endif
}
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 5c169c81de..f5923747ab 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -600,6 +600,7 @@ static int parse_progressbar_tag(struct skin_element* element,
pb->bm.data = NULL; /* no bitmap specified */
pb->follow_lang_direction = follow_lang_direction > 0;
pb->nofill = false;
+ pb->nobar = false;
pb->slider = NULL;
pb->invert_fill_direction = false;
pb->horizontal = true;
@@ -676,6 +677,8 @@ static int parse_progressbar_tag(struct skin_element* element,
pb->invert_fill_direction = true;
else if (!strcmp(param->data.text, "nofill"))
pb->nofill = true;
+ else if (!strcmp(param->data.text, "nobar"))
+ pb->nobar = true;
else if (!strcmp(param->data.text, "slider"))
{
if (curr_param+1 < element->params_count)
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 7bd74b5636..16020a3590 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -109,6 +109,7 @@ struct progressbar {
bool invert_fill_direction;
bool nofill;
+ bool nobar;
struct gui_img *slider;
bool horizontal;
};
diff --git a/manual/appendix/wps_tags.tex b/manual/appendix/wps_tags.tex
index 92460e8b32..58d81e659d 100644
--- a/manual/appendix/wps_tags.tex
+++ b/manual/appendix/wps_tags.tex
@@ -650,16 +650,22 @@ Example:
\item[vertical] -- force the bar to be drawn vertically.
\item[invert] -- invert the draw direction (i.e. right to left, or top to
bottom).
- \item[slider] -- draw an preloaded image over the top of the bar. This must be
+ \item[slider] -- draw an preloaded image over the top of the bar so that
+ the centre of the image matches current position. This must be
followed by the label of the desired image.
\item[nofill] -- don't draw the fill bar, only the empty image (for the
desired effect use with the ``slider'' option).
+ \item[nobar] -- don't draw the bar entirely including frame (for use
+ with the ``slider'' option).
\end{description}
Example: \config{\%pb(0,0,-,-,-,nofill, slider, slider\_image, invert)} -- draw
a horizontal progressbar which doesn't fill and draws the image
``slider\_image'' which moves right to left.
+Note: if the slider option is used, the bar will be shrank so that the slider will fit
+ inside the specified width and height.
+
\section{Other Tags}
\begin{tagmap}
\config{\%(} & The character `('\\