summaryrefslogtreecommitdiff
path: root/apps
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
parentf1eedb80a2efbf60cfc25182b72e3da07e0f1250 (diff)
downloadrockbox-40ecdf6811d9a717ef67ff1833a67dbb521f91be.tar.gz
rockbox-40ecdf6811d9a717ef67ff1833a67dbb521f91be.zip
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')
-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 befc843891..0be88f4e69 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,
739 token->value.i = i; 739 token->value.i = i;
740 return 0; 740 return 0;
741} 741}
742
743static int parse_logical_andor(struct skin_element *element,
744 struct wps_token *token,
745 struct wps_data *wps_data)
746{
747 (void)wps_data;
748 token->value.data = PTRTOSKINOFFSET(skin_buffer, element);
749 return 0;
750}
751
742static int parse_logical_if(struct skin_element *element, 752static int parse_logical_if(struct skin_element *element,
743 struct wps_token *token, 753 struct wps_token *token,
744 struct wps_data *wps_data) 754 struct wps_data *wps_data)
@@ -1946,6 +1956,10 @@ static int skin_element_callback(struct skin_element* element, void* data)
1946 case SKIN_TOKEN_LOGICAL_IF: 1956 case SKIN_TOKEN_LOGICAL_IF:
1947 function = parse_logical_if; 1957 function = parse_logical_if;
1948 break; 1958 break;
1959 case SKIN_TOKEN_LOGICAL_AND:
1960 case SKIN_TOKEN_LOGICAL_OR:
1961 function = parse_logical_andor;
1962 break;
1949 case SKIN_TOKEN_SUBSTRING: 1963 case SKIN_TOKEN_SUBSTRING:
1950 function = parse_substring_tag; 1964 function = parse_substring_tag;
1951 break; 1965 break;
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index bae8ae8f8e..82d96f6993 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,
887 return get_lif_token_value(gwps, lif, offset, buf, buf_size); 887 return get_lif_token_value(gwps, lif, offset, buf, buf_size);
888 } 888 }
889 break; 889 break;
890 case SKIN_TOKEN_LOGICAL_AND:
891 case SKIN_TOKEN_LOGICAL_OR:
892 {
893 int i = 0, truecount = 0;
894 char *skinbuffer = get_skin_buffer(data);
895 struct skin_element *element =
896 SKINOFFSETTOPTR(skinbuffer, token->value.data);
897 struct skin_tag_parameter* params =
898 SKINOFFSETTOPTR(skinbuffer, element->params);
899 struct skin_tag_parameter* thistag;
900 for (i=0; i<element->params_count; i++)
901 {
902 thistag = &params[i];
903 struct skin_element *tokenelement =
904 SKINOFFSETTOPTR(skinbuffer, thistag->data.code);
905 out_text = get_token_value(gwps,
906 SKINOFFSETTOPTR(skinbuffer, tokenelement->data),
907 offset, buf, buf_size, intval);
908 if (out_text && *out_text)
909 truecount++;
910 else if (token->type == SKIN_TOKEN_LOGICAL_AND)
911 return NULL;
912 }
913 return truecount ? "true" : NULL;
914 }
915 break;
890 case SKIN_TOKEN_SUBSTRING: 916 case SKIN_TOKEN_SUBSTRING:
891 { 917 {
892 struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 918 struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);