summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/SOURCES1
-rw-r--r--apps/gui/list.c8
-rw-r--r--apps/gui/list.h22
-rw-r--r--apps/gui/skin_engine/skin_display.c8
-rw-r--r--apps/gui/skin_engine/skin_display.h5
-rw-r--r--apps/gui/skin_engine/skin_parser.c32
-rw-r--r--apps/gui/skin_engine/skin_render.c26
-rw-r--r--apps/gui/skin_engine/skin_tokens.c12
-rw-r--r--apps/gui/skin_engine/wps_internals.h1
-rw-r--r--apps/gui/statusbar-skinned.c5
-rw-r--r--apps/gui/viewport.c3
-rw-r--r--apps/misc.c15
-rw-r--r--lib/skin_parser/tag_table.c5
-rw-r--r--lib/skin_parser/tag_table.h7
14 files changed, 138 insertions, 12 deletions
diff --git a/apps/SOURCES b/apps/SOURCES
index e0244b240d..6b72d6ad09 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 f450bd579f..fbcdcb28c9 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,10 @@ void gui_synclist_draw(struct gui_synclist *gui_list)
#endif
FOR_NB_SCREENS(i)
{
- list_draw(&screens[i], gui_list);
+#ifdef HAVE_LCD_BITMAP
+ if (!skinlist_draw(&screens[i], gui_list))
+#endif
+ list_draw(&screens[i], gui_list);
}
}
diff --git a/apps/gui/list.h b/apps/gui/list.h
index 38d7e95f8d..b54e7d7f5b 100644
--- a/apps/gui/list.h
+++ b/apps/gui/list.h
@@ -25,6 +25,7 @@
#include "config.h"
#include "icon.h"
#include "screen_access.h"
+#include "skin_engine/skin_engine.h"
#define SCROLLBAR_WIDTH global_settings.scrollbar_width
@@ -173,6 +174,27 @@ extern bool gui_synclist_item_is_onscreen(struct gui_synclist *lists,
extern bool gui_synclist_do_button(struct gui_synclist * lists,
int *action,
enum list_wrap);
+#if defined(HAVE_LCD_BITMAP) && !defined(PLUGIN)
+struct listitem_viewport_cfg {
+ struct wps_data *data;
+ char* label;
+ int width;
+ int height;
+ int xmargin;
+ int ymargin;
+ bool tile;
+ struct skin_viewport selected_item_vp;
+};
+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);
+bool skinlist_needs_scrollbar(enum screen_type screen);
+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);
+#endif
#if defined(HAVE_TOUCHSCREEN)
/* this needs to be fixed if we ever get more than 1 touchscreen on a target */
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 2be5bb9106..49f9f86133 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 9faaea30cf..81d04e5a60 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 58ac5f552c..049c117af3 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -483,6 +483,32 @@ static int parse_viewport_gradient_setup(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_viewporttextstyle(struct skin_element *element,
struct wps_token *token,
@@ -877,6 +903,8 @@ static int parse_progressbar_tag(struct skin_element* element,
token->type = SKIN_TOKEN_PEAKMETER_LEFTBAR;
else if (token->type == SKIN_TOKEN_PEAKMETER_RIGHT)
token->type = SKIN_TOKEN_PEAKMETER_RIGHTBAR;
+ else if (token->type == SKIN_TOKEN_LIST_NEEDS_SCROLLBAR)
+ token->type = SKIN_TOKEN_LIST_SCROLLBAR;
pb->type = token->type;
return 0;
@@ -1719,6 +1747,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_NEEDS_SCROLLBAR:
#ifdef HAVE_RADIO_RSSI
case SKIN_TOKEN_TUNER_RSSI:
#endif
@@ -1809,6 +1838,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 27e6747c29..dd266b1ee6 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
@@ -142,6 +143,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,
@@ -164,6 +170,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)
@@ -488,10 +495,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)
@@ -499,7 +506,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));
}
}
@@ -612,8 +619,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];
@@ -784,10 +791,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 ec6f606938..8e15ddc84a 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,17 @@ 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;
+ case SKIN_TOKEN_LIST_NEEDS_SCROLLBAR:
+ return skinlist_needs_scrollbar(gwps->display->screen_type) ? "s" : "";
#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 01f67d4a0b..136ec2921a 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -193,6 +193,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 58f58e4890..3f914bd922 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/gui/viewport.c b/apps/gui/viewport.c
index 45094e421a..34ebbf9043 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -28,7 +28,7 @@
#include "screen_access.h"
#include "settings.h"
#include "misc.h"
-
+#include "list.h"
/*some short cuts for fg/bg/line selector handling */
#ifdef HAVE_LCD_COLOR
#define FG_FALLBACK global_settings.fg_color
@@ -178,6 +178,7 @@ static void toggle_theme(enum screen_type screen, bool force)
screens[screen].backdrop_show(NULL);
#endif
screens[screen].stop_scroll();
+ skinlist_set_cfg(screen, NULL);
}
/* let list initialize viewport in case viewport dimensions is changed. */
send_event(GUI_EVENT_THEME_CHANGED, NULL);
diff --git a/apps/misc.c b/apps/misc.c
index 69c62da238..6e2bf32770 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -56,6 +56,7 @@
#include "playlist.h"
#include "yesno.h"
#include "viewport.h"
+#include "list.h"
#include "debug.h"
@@ -1078,11 +1079,25 @@ static enum current_activity
static int current_activity_top = 0;
void push_current_activity(enum current_activity screen)
{
+#if HAVE_LCD_BITMAP
+ int i;
+#endif
current_activity[current_activity_top++] = screen;
+#if HAVE_LCD_BITMAP
+ FOR_NB_SCREENS(i)
+ skinlist_set_cfg(i, NULL);
+#endif
}
void pop_current_activity(void)
{
+#if HAVE_LCD_BITMAP
+ int i;
+#endif
current_activity_top--;
+#if HAVE_LCD_BITMAP
+ FOR_NB_SCREENS(i)
+ skinlist_set_cfg(i, NULL);
+#endif
}
enum current_activity get_current_activity(void)
{
diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c
index db8c2e5557..849e1d92dd 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_NEEDS_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 58c14b5e0b..5a93e36866 100644
--- a/lib/skin_parser/tag_table.h
+++ b/lib/skin_parser/tag_table.h
@@ -212,6 +212,13 @@ 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_NEEDS_SCROLLBAR,
+ SKIN_TOKEN_LIST_SCROLLBAR,
SKIN_TOKEN_LOAD_FONT,