diff --git a/apps/SOURCES b/apps/SOURCES index 79642e1..17dbce0 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -75,6 +75,7 @@ gui/icon.c gui/list.c #ifdef HAVE_LCD_BITMAP gui/bitmap/list.c +gui/bitmap/list-skinned.c #else gui/charcell/list.c #endif diff --git a/apps/gui/list.c b/apps/gui/list.c index 72f27ce..47c6105 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c @@ -121,6 +121,9 @@ bool list_display_title(struct gui_synclist *list, enum screen_type screen) static int list_get_nb_lines(struct gui_synclist *list, enum screen_type screen) { struct viewport vp = *list->parent[screen]; + int skin_count = skinlist_get_line_count(screen, list); + if (skin_count >= 0) + return skin_count; if (list_display_title(list, screen)) vp.height -= font_get(list->parent[screen]->font)->height; return viewport_get_nb_lines(&vp); @@ -239,7 +242,8 @@ void gui_synclist_draw(struct gui_synclist *gui_list) #endif FOR_NB_SCREENS(i) { - list_draw(&screens[i], gui_list); + if (!skinlist_draw(&screens[i], gui_list)) + list_draw(&screens[i], gui_list); } } diff --git a/apps/gui/list.h b/apps/gui/list.h index 84673d8..37c283b 100644 --- a/apps/gui/list.h +++ b/apps/gui/list.h @@ -174,6 +174,24 @@ extern bool gui_synclist_do_button(struct gui_synclist * lists, int *action, enum list_wrap); +struct listitem_viewport_cfg { + struct wps_data *data; + char* label; + int width; + int height; + int xmargin; + int ymargin; + bool tile; +}; +bool skinlist_draw(struct screen *display, struct gui_synclist *list); +bool skinlist_is_selected_item(void); +void skinlist_set_cfg(enum screen_type screen, + struct listitem_viewport_cfg *cfg); +const char* skinlist_get_item_text(void); +enum themable_icons skinlist_get_item_icon(void); +void skinlist_get_scrollbar(int* nb_item, int* first_shown, int* last_shown); +int skinlist_get_line_count(enum screen_type screen, struct gui_synclist *list); + #if defined(HAVE_TOUCHSCREEN) /* this needs to be fixed if we ever get more than 1 touchscreen on a target */ extern unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list); diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index a967114..258cd91 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -42,6 +42,7 @@ #include "playlist.h" #include "audio.h" #include "tagcache.h" +#include "list.h" #ifdef HAVE_LCD_BITMAP #include "peakmeter.h" @@ -169,6 +170,13 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) length = MAX_PEAK; end = peak_meter_scale_value(val, length); } + else if (pb->type == SKIN_TOKEN_LIST_SCROLLBAR) + { + int val, min, max; + skinlist_get_scrollbar(&val, &min, &max); + end = val - min; + length = max - min; + } #if CONFIG_TUNER else if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF)) { diff --git a/apps/gui/skin_engine/skin_display.h b/apps/gui/skin_engine/skin_display.h index da4bb92..42195bd 100644 --- a/apps/gui/skin_engine/skin_display.h +++ b/apps/gui/skin_engine/skin_display.h @@ -36,6 +36,11 @@ void draw_playlist_viewer_list(struct gui_wps *gwps, struct playlistviewer *view void clear_image_pos(struct gui_wps *gwps, struct gui_img *img); void wps_draw_image(struct gui_wps *gwps, struct gui_img *img, int subimage); void wps_display_images(struct gui_wps *gwps, struct viewport* vp); + + +void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, + struct skin_viewport* skin_viewport, unsigned long refresh_type); + #endif /* Evaluate the conditional that is at *token_index and return whether a skip diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index 53e1efe..a764b1e 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -454,6 +454,32 @@ static int parse_playlistview(struct skin_element *element, } #endif + +static int parse_listitemviewport(struct skin_element *element, + struct wps_token *token, + struct wps_data *wps_data) +{ + struct listitem_viewport_cfg *cfg = + (struct listitem_viewport_cfg *)skin_buffer_alloc( + sizeof(struct listitem_viewport_cfg)); + if (!cfg) + return -1; + cfg->data = wps_data; + cfg->tile = false; + cfg->label = element->params[0].data.text; + cfg->width = -1; + cfg->height = -1; + if (!isdefault(&element->params[1])) + cfg->width = element->params[1].data.number; + if (!isdefault(&element->params[2])) + cfg->height = element->params[2].data.number; + if (element->params_count > 3 && + !strcmp(element->params[3].data.text, "tile")) + cfg->tile = true; + token->value.data = (void*)cfg; + return 0; +} + #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) static int parse_viewportcolour(struct skin_element *element, @@ -1649,6 +1675,7 @@ static int skin_element_callback(struct skin_element* element, void* data) case SKIN_TOKEN_PLAYER_PROGRESSBAR: case SKIN_TOKEN_PEAKMETER_LEFT: case SKIN_TOKEN_PEAKMETER_RIGHT: + case SKIN_TOKEN_LIST_SCROLLBAR: #ifdef HAVE_RADIO_RSSI case SKIN_TOKEN_TUNER_RSSI: #endif @@ -1731,6 +1758,9 @@ static int skin_element_callback(struct skin_element* element, void* data) function = parse_skinvar; break; #endif + case SKIN_TOKEN_LIST_ITEM_CFG: + function = parse_listitemviewport; + break; default: break; } diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c index 13eb69c..ad3b339 100644 --- a/apps/gui/skin_engine/skin_render.c +++ b/apps/gui/skin_engine/skin_render.c @@ -46,6 +46,7 @@ #include "playlist.h" #include "root_menu.h" #include "misc.h" +#include "list.h" #define MAX_LINE 1024 @@ -128,6 +129,11 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, } } break; + case SKIN_TOKEN_LIST_ITEM_CFG: + // if (do_refresh) + skinlist_set_cfg(gwps->display->screen_type, + token->value.data); + break; #ifdef HAVE_LCD_BITMAP case SKIN_TOKEN_UIVIEWPORT_ENABLE: sb_set_info_vp(gwps->display->screen_type, @@ -150,6 +156,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, #ifdef HAVE_LCD_BITMAP case SKIN_TOKEN_PROGRESSBAR: case SKIN_TOKEN_TUNER_RSSI_BAR: + case SKIN_TOKEN_LIST_SCROLLBAR: { struct progressbar *bar = (struct progressbar*)token->value.data; if (do_refresh) @@ -474,10 +481,10 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i if (!do_non_text_tags(info->gwps, info, child, &info->skin_vp->vp)) { static char tempbuf[128]; - const char *value = get_token_value(info->gwps, child->data, + const char *valuestr = get_token_value(info->gwps, child->data, info->offset, tempbuf, sizeof(tempbuf), NULL); - if (value) + if (valuestr) { #if CONFIG_RTC if (child->tag->flags&SKIN_RTC_REFRESH) @@ -485,7 +492,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i #endif needs_update = needs_update || ((child->tag->flags&info->refresh_type)!=0); - strlcat(info->cur_align_start, value, + strlcat(info->cur_align_start, valuestr, info->buf_size - (info->cur_align_start-info->buf)); } } @@ -598,8 +605,8 @@ bool skin_render_alternator(struct skin_element* element, struct skin_draw_info return changed_lines || ret; } -static void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, - struct skin_viewport* skin_viewport, unsigned long refresh_type) +void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, + struct skin_viewport* skin_viewport, unsigned long refresh_type) { struct screen *display = gwps->display; char linebuf[MAX_LINE]; @@ -754,10 +761,11 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode) } #ifdef HAVE_LCD_BITMAP -static __attribute__((noinline)) void skin_render_playlistviewer(struct playlistviewer* viewer, - struct gui_wps *gwps, - struct skin_viewport* skin_viewport, - unsigned long refresh_type) +static __attribute__((noinline)) +void skin_render_playlistviewer(struct playlistviewer* viewer, + struct gui_wps *gwps, + struct skin_viewport* skin_viewport, + unsigned long refresh_type) { struct screen *display = gwps->display; char linebuf[MAX_LINE]; diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index ec6f606..2a54ade 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -71,6 +71,7 @@ #include "radio.h" #include "tuner.h" #endif +#include "list.h" #define NOINLINE __attribute__ ((noinline)) @@ -894,6 +895,15 @@ const char *get_token_value(struct gui_wps *gwps, *intval = sb_get_icon(gwps->display->screen_type); snprintf(buf, buf_size, "%d",sb_get_icon(gwps->display->screen_type)); return buf; + case SKIN_TOKEN_LIST_ITEM_TEXT: + return skinlist_get_item_text(); + case SKIN_TOKEN_LIST_ITEM_IS_SELECTED: + return skinlist_is_selected_item()?"s":""; + case SKIN_TOKEN_LIST_ITEM_ICON: + if (intval) + *intval = skinlist_get_item_icon(); + snprintf(buf, buf_size, "%d",skinlist_get_item_icon()); + return buf; #endif case SKIN_TOKEN_PLAYLIST_NAME: return playlist_name(NULL, buf, buf_size); diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index 6de9845..87f5d64 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -180,6 +180,7 @@ struct viewport_colour { struct viewport *vp; unsigned colour; }; + #ifdef HAVE_TOUCHSCREEN struct touchregion { char* label; /* label to identify this region */ diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c index 58f58e4..3f914bd 100644 --- a/apps/gui/statusbar-skinned.c +++ b/apps/gui/statusbar-skinned.c @@ -139,6 +139,7 @@ int sb_get_backdrop(enum screen_type screen) } #endif +static bool force_waiting = false; void sb_skin_update(enum screen_type screen, bool force) { struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data; @@ -146,8 +147,9 @@ void sb_skin_update(enum screen_type screen, bool force) int i = screen; if (!data->wps_loaded) return; - if (TIME_AFTER(current_tick, next_update[i]) || force) + if (TIME_AFTER(current_tick, next_update[i]) || force || force_waiting) { + force_waiting = false; #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) /* currently, all remotes are readable without backlight * so still update those */ @@ -168,6 +170,7 @@ void do_sbs_update_callback(void *param) /* the WPS handles changing the actual id3 data in the id3 pointers * we imported, we just want a full update */ skin_request_full_update(CUSTOM_STATUSBAR); + force_waiting = true; /* force timeout in wps main loop, so that the update is instantly */ queue_post(&button_queue, BUTTON_NONE, 0); } diff --git a/apps/misc.c b/apps/misc.c index 83e42cf..73bd451 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -57,6 +57,7 @@ #include "playlist.h" #include "yesno.h" #include "viewport.h" +#include "list.h" #include "debug.h" @@ -1076,11 +1077,17 @@ static enum current_activity static int current_activity_top = 0; void push_current_activity(enum current_activity screen) { + int i; current_activity[current_activity_top++] = screen; + FOR_NB_SCREENS(i) + skinlist_set_cfg(i, NULL); } void pop_current_activity(void) { + int i; current_activity_top--; + FOR_NB_SCREENS(i) + skinlist_set_cfg(i, NULL); } enum current_activity get_current_activity(void) { diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c index dea28b6..110e56a 100644 --- a/lib/skin_parser/tag_table.c +++ b/lib/skin_parser/tag_table.c @@ -188,7 +188,12 @@ static const struct tag_info legal_tags[] = { SKIN_TOKEN_VIEWPORT_CUSTOMLIST, "Vp" , "IC", SKIN_REFRESH_DYNAMIC|NOBREAK }, { SKIN_TOKEN_LIST_TITLE_TEXT, "Lt" , "", SKIN_REFRESH_DYNAMIC }, + { SKIN_TOKEN_LIST_ITEM_TEXT, "LT", "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_LIST_TITLE_ICON, "Li" , "", SKIN_REFRESH_DYNAMIC }, + { SKIN_TOKEN_LIST_ITEM_ICON, "LI", "", SKIN_REFRESH_DYNAMIC }, + { SKIN_TOKEN_LIST_ITEM_CFG, "Lb" , "Sii|S", SKIN_REFRESH_STATIC }, + { SKIN_TOKEN_LIST_ITEM_IS_SELECTED, "Lc" , "", SKIN_REFRESH_DYNAMIC }, + // { SKIN_TOKEN_LIST_SCROLLBAR, "LB", BAR_PARAMS, SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_VIEWPORT_FGCOLOUR, "Vf" , "s", SKIN_REFRESH_STATIC|NOBREAK }, { SKIN_TOKEN_VIEWPORT_BGCOLOUR, "Vb" , "s", SKIN_REFRESH_STATIC|NOBREAK }, diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h index e52fded..0362a9f 100644 --- a/lib/skin_parser/tag_table.h +++ b/lib/skin_parser/tag_table.h @@ -210,6 +210,12 @@ enum skin_token_type { SKIN_TOKEN_DRAW_INBUILTBAR, SKIN_TOKEN_LIST_TITLE_TEXT, SKIN_TOKEN_LIST_TITLE_ICON, + SKIN_TOKEN_LIST_ITEM_CFG, + SKIN_TOKEN_LIST_SELECTED_ITEM_CFG, + SKIN_TOKEN_LIST_ITEM_IS_SELECTED, + SKIN_TOKEN_LIST_ITEM_TEXT, + SKIN_TOKEN_LIST_ITEM_ICON, + SKIN_TOKEN_LIST_SCROLLBAR, SKIN_TOKEN_LOAD_FONT,