diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/gui/bitmap/list-skinned.c | 57 | ||||
-rw-r--r-- | apps/gui/list.h | 4 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 25 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_tokens.c | 13 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 5 |
5 files changed, 80 insertions, 24 deletions
diff --git a/apps/gui/bitmap/list-skinned.c b/apps/gui/bitmap/list-skinned.c index 2f3ca2bd2d..5f53784ccc 100644 --- a/apps/gui/bitmap/list-skinned.c +++ b/apps/gui/bitmap/list-skinned.c | |||
@@ -43,9 +43,8 @@ | |||
43 | #include "appevents.h" | 43 | #include "appevents.h" |
44 | 44 | ||
45 | static struct listitem_viewport_cfg *listcfg[NB_SCREENS] = {NULL}; | 45 | static struct listitem_viewport_cfg *listcfg[NB_SCREENS] = {NULL}; |
46 | static const char *current_item_text_ptr; | 46 | struct gui_synclist *current_list; |
47 | static char current_item_text[MAX_PATH]; | 47 | |
48 | static enum themable_icons current_item_icon; | ||
49 | void skinlist_set_cfg(enum screen_type screen, | 48 | void skinlist_set_cfg(enum screen_type screen, |
50 | struct listitem_viewport_cfg *cfg) | 49 | struct listitem_viewport_cfg *cfg) |
51 | { | 50 | { |
@@ -54,7 +53,7 @@ void skinlist_set_cfg(enum screen_type screen, | |||
54 | if (listcfg[screen]) | 53 | if (listcfg[screen]) |
55 | screens[screen].scroll_stop(&listcfg[screen]->selected_item_vp.vp); | 54 | screens[screen].scroll_stop(&listcfg[screen]->selected_item_vp.vp); |
56 | listcfg[screen] = cfg; | 55 | listcfg[screen] = cfg; |
57 | current_item_text_ptr = ""; | 56 | current_list = NULL; |
58 | } | 57 | } |
59 | } | 58 | } |
60 | 59 | ||
@@ -64,15 +63,41 @@ static bool skinlist_is_configured(enum screen_type screen, | |||
64 | return (listcfg[screen] != NULL) && | 63 | return (listcfg[screen] != NULL) && |
65 | (!list || (list && list->selected_size == 1)); | 64 | (!list || (list && list->selected_size == 1)); |
66 | } | 65 | } |
67 | 66 | static int current_drawing_line; | |
68 | const char* skinlist_get_item_text(void) | 67 | static int offset_to_item(int offset, bool wrap) |
68 | { | ||
69 | int item = current_drawing_line + offset; | ||
70 | if (!current_list) | ||
71 | return -1; | ||
72 | if (item < 0) | ||
73 | { | ||
74 | if (!wrap) | ||
75 | return -1; | ||
76 | else | ||
77 | item = (item + current_list->nb_items) % current_list->nb_items; | ||
78 | } | ||
79 | else if (item >= current_list->nb_items && !wrap) | ||
80 | return -1; | ||
81 | else | ||
82 | item = item % current_list->nb_items; | ||
83 | return item; | ||
84 | } | ||
85 | const char* skinlist_get_item_text(int offset, bool wrap, char* buf, size_t buf_size) | ||
69 | { | 86 | { |
70 | const char* ret = P2STR((unsigned char*)current_item_text_ptr); | 87 | int item = offset_to_item(offset, wrap); |
71 | return ret; | 88 | if (item < 0 || !current_list) |
89 | return NULL; | ||
90 | const char* ret = current_list->callback_get_item_name( | ||
91 | item, current_list->data, buf, buf_size); | ||
92 | return P2STR((unsigned char*)ret); | ||
72 | } | 93 | } |
73 | enum themable_icons skinlist_get_item_icon(void) | 94 | |
95 | enum themable_icons skinlist_get_item_icon(int offset, bool wrap) | ||
74 | { | 96 | { |
75 | return current_item_icon; | 97 | int item = offset_to_item(offset, wrap); |
98 | if (item < 0 || !current_list || current_list->callback_get_item_icon == NULL) | ||
99 | return Icon_NOICON; | ||
100 | return current_list->callback_get_item_icon(item, current_list->data); | ||
76 | } | 101 | } |
77 | 102 | ||
78 | static bool is_selected = false; | 103 | static bool is_selected = false; |
@@ -130,6 +155,7 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list) | |||
130 | struct gui_wps wps; | 155 | struct gui_wps wps; |
131 | if (!skinlist_is_configured(screen, list)) | 156 | if (!skinlist_is_configured(screen, list)) |
132 | return false; | 157 | return false; |
158 | current_list = list; | ||
133 | wps.display = display; | 159 | wps.display = display; |
134 | wps.data = listcfg[screen]->data; | 160 | wps.data = listcfg[screen]->data; |
135 | display_lines = skinlist_get_line_count(screen, list); | 161 | display_lines = skinlist_get_line_count(screen, list); |
@@ -146,14 +172,9 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list) | |||
146 | struct skin_viewport* skin_viewport; | 172 | struct skin_viewport* skin_viewport; |
147 | if (list_start_item+cur_line+1 > list->nb_items) | 173 | if (list_start_item+cur_line+1 > list->nb_items) |
148 | break; | 174 | break; |
175 | current_drawing_line = list_start_item+cur_line; | ||
149 | is_selected = list->show_selection_marker && | 176 | is_selected = list->show_selection_marker && |
150 | list_start_item+cur_line == list->selected_item; | 177 | list_start_item+cur_line == list->selected_item; |
151 | current_item_text_ptr = list->callback_get_item_name( | ||
152 | list_start_item+cur_line, | ||
153 | list->data, current_item_text, MAX_PATH); | ||
154 | if (list->callback_get_item_icon != NULL) | ||
155 | current_item_icon = list->callback_get_item_icon( | ||
156 | list_start_item+cur_line, list->data); | ||
157 | 178 | ||
158 | for (viewport = listcfg[screen]->data->tree; | 179 | for (viewport = listcfg[screen]->data->tree; |
159 | viewport; | 180 | viewport; |
@@ -219,9 +240,7 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list) | |||
219 | } | 240 | } |
220 | display->set_viewport(parent); | 241 | display->set_viewport(parent); |
221 | display->update_viewport(); | 242 | display->update_viewport(); |
222 | current_item_text_ptr = list->callback_get_item_name( | 243 | current_drawing_line = list->selected_item; |
223 | list->selected_item, | ||
224 | list->data, current_item_text, 2048); | ||
225 | #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) | 244 | #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) |
226 | /* Abuse the callback to force the sbs to update */ | 245 | /* Abuse the callback to force the sbs to update */ |
227 | send_event(LCD_EVENT_ACTIVATION, NULL); | 246 | send_event(LCD_EVENT_ACTIVATION, NULL); |
diff --git a/apps/gui/list.h b/apps/gui/list.h index b54e7d7f5b..7c64987abb 100644 --- a/apps/gui/list.h +++ b/apps/gui/list.h | |||
@@ -189,8 +189,8 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list); | |||
189 | bool skinlist_is_selected_item(void); | 189 | bool skinlist_is_selected_item(void); |
190 | void skinlist_set_cfg(enum screen_type screen, | 190 | void skinlist_set_cfg(enum screen_type screen, |
191 | struct listitem_viewport_cfg *cfg); | 191 | struct listitem_viewport_cfg *cfg); |
192 | const char* skinlist_get_item_text(void); | 192 | const char* skinlist_get_item_text(int offset, bool wrap, char* buf, size_t buf_size); |
193 | enum themable_icons skinlist_get_item_icon(void); | 193 | enum themable_icons skinlist_get_item_icon(int offset, bool wrap); |
194 | bool skinlist_needs_scrollbar(enum screen_type screen); | 194 | bool skinlist_needs_scrollbar(enum screen_type screen); |
195 | void skinlist_get_scrollbar(int* nb_item, int* first_shown, int* last_shown); | 195 | void skinlist_get_scrollbar(int* nb_item, int* first_shown, int* last_shown); |
196 | int skinlist_get_line_count(enum screen_type screen, struct gui_synclist *list); | 196 | int skinlist_get_line_count(enum screen_type screen, struct gui_synclist *list); |
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index 0db19645bc..dd34d84e9f 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c | |||
@@ -485,6 +485,27 @@ static int parse_viewport_gradient_setup(struct skin_element *element, | |||
485 | } | 485 | } |
486 | #endif | 486 | #endif |
487 | 487 | ||
488 | static int parse_listitem(struct skin_element *element, | ||
489 | struct wps_token *token, | ||
490 | struct wps_data *wps_data) | ||
491 | { | ||
492 | (void)wps_data; | ||
493 | struct listitem *li = (struct listitem *)skin_buffer_alloc(sizeof(struct listitem)); | ||
494 | if (!li) | ||
495 | return 1; | ||
496 | token->value.data = li; | ||
497 | if (element->params_count == 0) | ||
498 | li->offset = 0; | ||
499 | else | ||
500 | { | ||
501 | li->offset = element->params[0].data.number; | ||
502 | if (element->params_count > 1) | ||
503 | li->wrap = strcasecmp(element->params[1].data.text, "nowrap") != 0; | ||
504 | else | ||
505 | li->wrap = true; | ||
506 | } | ||
507 | return 0; | ||
508 | } | ||
488 | 509 | ||
489 | static int parse_listitemviewport(struct skin_element *element, | 510 | static int parse_listitemviewport(struct skin_element *element, |
490 | struct wps_token *token, | 511 | struct wps_token *token, |
@@ -1827,6 +1848,10 @@ static int skin_element_callback(struct skin_element* element, void* data) | |||
1827 | case SKIN_TOKEN_TRACK_ENDING: | 1848 | case SKIN_TOKEN_TRACK_ENDING: |
1828 | function = parse_timeout_tag; | 1849 | function = parse_timeout_tag; |
1829 | break; | 1850 | break; |
1851 | case SKIN_TOKEN_LIST_ITEM_TEXT: | ||
1852 | case SKIN_TOKEN_LIST_ITEM_ICON: | ||
1853 | function = parse_listitem; | ||
1854 | break; | ||
1830 | #ifdef HAVE_LCD_BITMAP | 1855 | #ifdef HAVE_LCD_BITMAP |
1831 | case SKIN_TOKEN_DISABLE_THEME: | 1856 | case SKIN_TOKEN_DISABLE_THEME: |
1832 | case SKIN_TOKEN_ENABLE_THEME: | 1857 | case SKIN_TOKEN_ENABLE_THEME: |
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index 371db46017..a4f0814945 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c | |||
@@ -922,14 +922,21 @@ const char *get_token_value(struct gui_wps *gwps, | |||
922 | snprintf(buf, buf_size, "%d",sb_get_icon(gwps->display->screen_type)); | 922 | snprintf(buf, buf_size, "%d",sb_get_icon(gwps->display->screen_type)); |
923 | return buf; | 923 | return buf; |
924 | case SKIN_TOKEN_LIST_ITEM_TEXT: | 924 | case SKIN_TOKEN_LIST_ITEM_TEXT: |
925 | return skinlist_get_item_text(); | 925 | { |
926 | struct listitem *li = (struct listitem *)token->value.data; | ||
927 | return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size); | ||
928 | } | ||
926 | case SKIN_TOKEN_LIST_ITEM_IS_SELECTED: | 929 | case SKIN_TOKEN_LIST_ITEM_IS_SELECTED: |
927 | return skinlist_is_selected_item()?"s":""; | 930 | return skinlist_is_selected_item()?"s":""; |
928 | case SKIN_TOKEN_LIST_ITEM_ICON: | 931 | case SKIN_TOKEN_LIST_ITEM_ICON: |
932 | { | ||
933 | struct listitem *li = (struct listitem *)token->value.data; | ||
934 | int icon = skinlist_get_item_icon(li->offset, li->wrap); | ||
929 | if (intval) | 935 | if (intval) |
930 | *intval = skinlist_get_item_icon(); | 936 | *intval = icon; |
931 | snprintf(buf, buf_size, "%d",skinlist_get_item_icon()); | 937 | snprintf(buf, buf_size, "%d", icon); |
932 | return buf; | 938 | return buf; |
939 | } | ||
933 | case SKIN_TOKEN_LIST_NEEDS_SCROLLBAR: | 940 | case SKIN_TOKEN_LIST_NEEDS_SCROLLBAR: |
934 | return skinlist_needs_scrollbar(gwps->display->screen_type) ? "s" : ""; | 941 | return skinlist_needs_scrollbar(gwps->display->screen_type) ? "s" : ""; |
935 | #endif | 942 | #endif |
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index 7d7afe95b1..244d08595e 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h | |||
@@ -294,6 +294,11 @@ struct substring { | |||
294 | struct wps_token *token; | 294 | struct wps_token *token; |
295 | }; | 295 | }; |
296 | 296 | ||
297 | struct listitem { | ||
298 | bool wrap; | ||
299 | short offset; | ||
300 | }; | ||
301 | |||
297 | #ifdef HAVE_SKIN_VARIABLES | 302 | #ifdef HAVE_SKIN_VARIABLES |
298 | struct skin_var { | 303 | struct skin_var { |
299 | const char *label; | 304 | const char *label; |