diff options
| author | Jonathan Gordon <rockbox@jdgordon.info> | 2012-02-02 22:26:16 +1100 |
|---|---|---|
| committer | Jonathan Gordon <rockbox@jdgordon.info> | 2012-02-07 21:41:18 +1100 |
| commit | 40ecdf6811d9a717ef67ff1833a67dbb521f91be (patch) | |
| tree | ddde16bbb941fb70515a6127339b0a2f176e224f /apps/gui/skin_engine | |
| parent | f1eedb80a2efbf60cfc25182b72e3da07e0f1250 (diff) | |
| download | rockbox-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.c | 14 | ||||
| -rw-r--r-- | apps/gui/skin_engine/skin_tokens.c | 26 |
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 = ¶ms[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); |