forked from len0rd/rockbox
Rework how progressbars are managed so you can have as many bars in a viewport as you want (!).
Change %pv (volume) to be able to be drawn in the same style as %pb (using a line or a bmp). %pv - no change, %pv|bmp|x|y|width|height| exactly like %pb DO NOT use %?pv|....| because it will draw when you dont want it to! git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25584 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
9d633740a4
commit
4421746357
4 changed files with 39 additions and 22 deletions
|
|
@ -26,6 +26,7 @@
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "rbunicode.h"
|
#include "rbunicode.h"
|
||||||
|
#include "sound.h"
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -115,28 +116,35 @@ void skin_statusbar_changed(struct gui_wps *skin)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_progressbar(struct gui_wps *gwps,
|
static void draw_progressbar(struct gui_wps *gwps,
|
||||||
struct skin_viewport *wps_vp)
|
struct progressbar *pb)
|
||||||
{
|
{
|
||||||
struct screen *display = gwps->display;
|
struct screen *display = gwps->display;
|
||||||
|
struct viewport *vp = pb->vp;
|
||||||
struct wps_state *state = gwps->state;
|
struct wps_state *state = gwps->state;
|
||||||
struct progressbar *pb = wps_vp->pb;
|
|
||||||
struct mp3entry *id3 = state->id3;
|
struct mp3entry *id3 = state->id3;
|
||||||
int y = pb->y, height = pb->height;
|
int y = pb->y, height = pb->height;
|
||||||
unsigned long length, elapsed;
|
unsigned long length, elapsed;
|
||||||
|
|
||||||
if (height < 0)
|
if (height < 0)
|
||||||
height = font_get(wps_vp->vp.font)->height;
|
height = font_get(vp->font)->height;
|
||||||
|
|
||||||
if (y < 0)
|
if (y < 0)
|
||||||
{
|
{
|
||||||
int line_height = font_get(wps_vp->vp.font)->height;
|
int line_height = font_get(vp->font)->height;
|
||||||
/* center the pb in the line, but only if the line is higher than the pb */
|
/* center the pb in the line, but only if the line is higher than the pb */
|
||||||
int center = (line_height-height)/2;
|
int center = (line_height-height)/2;
|
||||||
/* if Y was not set calculate by font height,Y is -line_number-1 */
|
/* if Y was not set calculate by font height,Y is -line_number-1 */
|
||||||
y = (-y -1)*line_height + (0 > center ? 0 : center);
|
y = (-y -1)*line_height + (0 > center ? 0 : center);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id3 && id3->length)
|
if (pb->type == WPS_TOKEN_VOLUMEBAR)
|
||||||
|
{
|
||||||
|
int minvol = sound_min(SOUND_VOLUME);
|
||||||
|
int maxvol = sound_max(SOUND_VOLUME);
|
||||||
|
length = maxvol-minvol;
|
||||||
|
elapsed = global_settings.volume-minvol;
|
||||||
|
}
|
||||||
|
else if (id3 && id3->length)
|
||||||
{
|
{
|
||||||
length = id3->length;
|
length = id3->length;
|
||||||
elapsed = id3->elapsed + state->ff_rewind_count;
|
elapsed = id3->elapsed + state->ff_rewind_count;
|
||||||
|
|
@ -155,7 +163,7 @@ static void draw_progressbar(struct gui_wps *gwps,
|
||||||
gui_scrollbar_draw(display, pb->x, y, pb->width, height,
|
gui_scrollbar_draw(display, pb->x, y, pb->width, height,
|
||||||
length, 0, elapsed, HORIZONTAL);
|
length, 0, elapsed, HORIZONTAL);
|
||||||
|
|
||||||
if (id3 && id3->length)
|
if (pb->type == WPS_TOKEN_PROGRESSBAR && id3 && id3->length)
|
||||||
{
|
{
|
||||||
#ifdef AB_REPEAT_ENABLE
|
#ifdef AB_REPEAT_ENABLE
|
||||||
if (ab_repeat_mode_enabled())
|
if (ab_repeat_mode_enabled())
|
||||||
|
|
@ -1248,9 +1256,15 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
|
||||||
/* progressbar */
|
/* progressbar */
|
||||||
if (vp_refresh_mode & WPS_REFRESH_PLAYER_PROGRESS)
|
if (vp_refresh_mode & WPS_REFRESH_PLAYER_PROGRESS)
|
||||||
{
|
{
|
||||||
if (skin_viewport->pb)
|
struct skin_token_list *bar = gwps->data->progressbars;
|
||||||
|
while (bar)
|
||||||
{
|
{
|
||||||
draw_progressbar(gwps, skin_viewport);
|
struct progressbar *thisbar = (struct progressbar*)bar->token->value.data;
|
||||||
|
if (thisbar->vp == &skin_viewport->vp)
|
||||||
|
{
|
||||||
|
draw_progressbar(gwps, thisbar);
|
||||||
|
}
|
||||||
|
bar = bar->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Now display any images in this viewport */
|
/* Now display any images in this viewport */
|
||||||
|
|
|
||||||
|
|
@ -322,7 +322,8 @@ static const struct wps_tag all_tags[] = {
|
||||||
{ WPS_TOKEN_PROGRESSBAR, "pb", WPS_REFRESH_PLAYER_PROGRESS,
|
{ WPS_TOKEN_PROGRESSBAR, "pb", WPS_REFRESH_PLAYER_PROGRESS,
|
||||||
parse_progressbar },
|
parse_progressbar },
|
||||||
|
|
||||||
{ WPS_TOKEN_VOLUME, "pv", WPS_REFRESH_DYNAMIC, NULL },
|
{ WPS_TOKEN_VOLUME, "pv", WPS_REFRESH_DYNAMIC,
|
||||||
|
parse_progressbar },
|
||||||
|
|
||||||
{ WPS_TOKEN_TRACK_ELAPSED_PERCENT, "px", WPS_REFRESH_DYNAMIC, NULL },
|
{ WPS_TOKEN_TRACK_ELAPSED_PERCENT, "px", WPS_REFRESH_DYNAMIC, NULL },
|
||||||
{ WPS_TOKEN_TRACK_TIME_ELAPSED, "pc", WPS_REFRESH_DYNAMIC, NULL },
|
{ WPS_TOKEN_TRACK_TIME_ELAPSED, "pc", WPS_REFRESH_DYNAMIC, NULL },
|
||||||
|
|
@ -900,7 +901,6 @@ static int parse_viewport(const char *wps_bufptr,
|
||||||
/* %Vl|<label>|<rest of tags>| */
|
/* %Vl|<label>|<rest of tags>| */
|
||||||
skin_vp->hidden_flags = 0;
|
skin_vp->hidden_flags = 0;
|
||||||
skin_vp->label = VP_NO_LABEL;
|
skin_vp->label = VP_NO_LABEL;
|
||||||
skin_vp->pb = NULL;
|
|
||||||
skin_vp->lines = NULL;
|
skin_vp->lines = NULL;
|
||||||
if (curr_line)
|
if (curr_line)
|
||||||
{
|
{
|
||||||
|
|
@ -1153,6 +1153,7 @@ static int parse_progressbar(const char *wps_bufptr,
|
||||||
line_num++;
|
line_num++;
|
||||||
line = line->next;
|
line = line->next;
|
||||||
}
|
}
|
||||||
|
pb->vp = vp;
|
||||||
pb->have_bitmap_pb = false;
|
pb->have_bitmap_pb = false;
|
||||||
pb->bm.data = NULL; /* no bitmap specified */
|
pb->bm.data = NULL; /* no bitmap specified */
|
||||||
pb->follow_lang_direction = follow_lang_direction > 0;
|
pb->follow_lang_direction = follow_lang_direction > 0;
|
||||||
|
|
@ -1163,8 +1164,8 @@ static int parse_progressbar(const char *wps_bufptr,
|
||||||
pb->width = vp->width;
|
pb->width = vp->width;
|
||||||
pb->height = SYSFONT_HEIGHT-2;
|
pb->height = SYSFONT_HEIGHT-2;
|
||||||
pb->y = -line_num - 1; /* Will be computed during the rendering */
|
pb->y = -line_num - 1; /* Will be computed during the rendering */
|
||||||
|
if (token->type == WPS_TOKEN_VOLUME)
|
||||||
curr_vp->pb = pb;
|
return 0; /* dont add it, let the regular token handling do the work */
|
||||||
add_to_ll_chain(&wps_data->progressbars, item);
|
add_to_ll_chain(&wps_data->progressbars, item);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1220,19 +1221,20 @@ static int parse_progressbar(const char *wps_bufptr,
|
||||||
else
|
else
|
||||||
pb->y = -line_num - 1; /* Will be computed during the rendering */
|
pb->y = -line_num - 1; /* Will be computed during the rendering */
|
||||||
|
|
||||||
curr_vp->pb = pb;
|
|
||||||
add_to_ll_chain(&wps_data->progressbars, item);
|
add_to_ll_chain(&wps_data->progressbars, item);
|
||||||
|
if (token->type == WPS_TOKEN_VOLUME)
|
||||||
|
token->type = WPS_TOKEN_VOLUMEBAR;
|
||||||
|
pb->type = token->type;
|
||||||
/* Skip the rest of the line */
|
/* Skip the rest of the line */
|
||||||
return skip_end_of_line(wps_bufptr)-1;
|
return skip_end_of_line(wps_bufptr)-1;
|
||||||
#else
|
#else
|
||||||
(void)token;
|
(void)token;
|
||||||
|
|
||||||
if (*(wps_bufptr-1) == 'f')
|
if (token->type != WPS_TOKEN_VOLUME)
|
||||||
wps_data->full_line_progressbar = true;
|
{
|
||||||
else
|
wps_data->full_line_progressbar =
|
||||||
wps_data->full_line_progressbar = false;
|
token->type == WPS_TOKEN_PLAYER_PROGRESSBAR;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -2205,7 +2207,6 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
|
||||||
|
|
||||||
/* Initialise the first (default) viewport */
|
/* Initialise the first (default) viewport */
|
||||||
curr_vp->label = VP_DEFAULT_LABEL;
|
curr_vp->label = VP_DEFAULT_LABEL;
|
||||||
curr_vp->pb = NULL;
|
|
||||||
curr_vp->hidden_flags = 0;
|
curr_vp->hidden_flags = 0;
|
||||||
curr_vp->lines = NULL;
|
curr_vp->lines = NULL;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -202,6 +202,7 @@ enum wps_token_type {
|
||||||
#endif
|
#endif
|
||||||
/* Volume level */
|
/* Volume level */
|
||||||
WPS_TOKEN_VOLUME,
|
WPS_TOKEN_VOLUME,
|
||||||
|
WPS_TOKEN_VOLUMEBAR,
|
||||||
/* hold */
|
/* hold */
|
||||||
WPS_TOKEN_MAIN_HOLD,
|
WPS_TOKEN_MAIN_HOLD,
|
||||||
#ifdef HAS_REMOTE_BUTTON_HOLD
|
#ifdef HAS_REMOTE_BUTTON_HOLD
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,8 @@ struct gui_img {
|
||||||
|
|
||||||
|
|
||||||
struct progressbar {
|
struct progressbar {
|
||||||
|
enum wps_token_type type;
|
||||||
|
struct viewport *vp;
|
||||||
/* regular pb */
|
/* regular pb */
|
||||||
short x;
|
short x;
|
||||||
/* >=0: explicitly set in the tag -> y-coord within the viewport
|
/* >=0: explicitly set in the tag -> y-coord within the viewport
|
||||||
|
|
@ -202,7 +204,6 @@ struct skin_line {
|
||||||
#define VP_INFO_LABEL '_'
|
#define VP_INFO_LABEL '_'
|
||||||
struct skin_viewport {
|
struct skin_viewport {
|
||||||
struct viewport vp; /* The LCD viewport struct */
|
struct viewport vp; /* The LCD viewport struct */
|
||||||
struct progressbar *pb;
|
|
||||||
struct skin_line *lines;
|
struct skin_line *lines;
|
||||||
char hidden_flags;
|
char hidden_flags;
|
||||||
char label;
|
char label;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue