1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Jonathan Gordon 2012-02-02 22:26:16 +11:00
parent f1eedb80a2
commit 40ecdf6811
6 changed files with 83 additions and 27 deletions

View file

@ -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;

View file

@ -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);