summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2012-02-02 22:26:16 +1100
committerJonathan Gordon <rockbox@jdgordon.info>2012-02-07 21:41:18 +1100
commit40ecdf6811d9a717ef67ff1833a67dbb521f91be (patch)
treeddde16bbb941fb70515a6127339b0a2f176e224f /apps/gui/skin_engine
parentf1eedb80a2efbf60cfc25182b72e3da07e0f1250 (diff)
downloadrockbox-40ecdf6811d9a717ef67ff1833a67dbb521f91be.zip
rockbox-40ecdf6811d9a717ef67ff1833a67dbb521f91be.tar.gz
rockbox-40ecdf6811d9a717ef67ff1833a67dbb521f91be.tar.bz2
rockbox-40ecdf6811d9a717ef67ff1833a67dbb521f91be.tar.xz
skin engine: New logical 'and' and 'or' tags to evaluate multiple tags in a single conditional.
Use these tags to stop having multiple conditionals.. e.g: OLD: %?C<%?Ia<something>> NEW: %?and(%C, %Ia)<something> Change-Id: Ia3bbe4611cf808e87dcd1b1147181461fa08294a
Diffstat (limited to 'apps/gui/skin_engine')
-rw-r--r--apps/gui/skin_engine/skin_parser.c14
-rw-r--r--apps/gui/skin_engine/skin_tokens.c26
2 files changed, 40 insertions, 0 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index befc843..0be88f4 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -739,6 +739,16 @@ static int parse_setting_and_lang(struct skin_element *element,
token->value.i = i;
return 0;
}
+
+static int parse_logical_andor(struct skin_element *element,
+ struct wps_token *token,
+ struct wps_data *wps_data)
+{
+ (void)wps_data;
+ token->value.data = PTRTOSKINOFFSET(skin_buffer, element);
+ return 0;
+}
+
static int parse_logical_if(struct skin_element *element,
struct wps_token *token,
struct wps_data *wps_data)
@@ -1946,6 +1956,10 @@ static int skin_element_callback(struct skin_element* element, void* data)
case SKIN_TOKEN_LOGICAL_IF:
function = parse_logical_if;
break;
+ case SKIN_TOKEN_LOGICAL_AND:
+ case SKIN_TOKEN_LOGICAL_OR:
+ function = parse_logical_andor;
+ break;
case SKIN_TOKEN_SUBSTRING:
function = parse_substring_tag;
break;
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index bae8ae8..82d96f6 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -887,6 +887,32 @@ const char *get_token_value(struct gui_wps *gwps,
return get_lif_token_value(gwps, lif, offset, buf, buf_size);
}
break;
+ case SKIN_TOKEN_LOGICAL_AND:
+ case SKIN_TOKEN_LOGICAL_OR:
+ {
+ int i = 0, truecount = 0;
+ char *skinbuffer = get_skin_buffer(data);
+ struct skin_element *element =
+ SKINOFFSETTOPTR(skinbuffer, token->value.data);
+ struct skin_tag_parameter* params =
+ SKINOFFSETTOPTR(skinbuffer, element->params);
+ struct skin_tag_parameter* thistag;
+ for (i=0; i<element->params_count; i++)
+ {
+ thistag = &params[i];
+ struct skin_element *tokenelement =
+ SKINOFFSETTOPTR(skinbuffer, thistag->data.code);
+ out_text = get_token_value(gwps,
+ SKINOFFSETTOPTR(skinbuffer, tokenelement->data),
+ offset, buf, buf_size, intval);
+ if (out_text && *out_text)
+ truecount++;
+ else if (token->type == SKIN_TOKEN_LOGICAL_AND)
+ return NULL;
+ }
+ return truecount ? "true" : NULL;
+ }
+ break;
case SKIN_TOKEN_SUBSTRING:
{
struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);