summaryrefslogtreecommitdiff
path: root/apps/gui
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui')
-rw-r--r--apps/gui/bitmap/list-skinned.c57
-rw-r--r--apps/gui/list.h4
-rw-r--r--apps/gui/skin_engine/skin_parser.c25
-rw-r--r--apps/gui/skin_engine/skin_tokens.c13
-rw-r--r--apps/gui/skin_engine/wps_internals.h5
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
45static struct listitem_viewport_cfg *listcfg[NB_SCREENS] = {NULL}; 45static struct listitem_viewport_cfg *listcfg[NB_SCREENS] = {NULL};
46static const char *current_item_text_ptr; 46struct gui_synclist *current_list;
47static char current_item_text[MAX_PATH]; 47
48static enum themable_icons current_item_icon;
49void skinlist_set_cfg(enum screen_type screen, 48void 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 66static int current_drawing_line;
68const char* skinlist_get_item_text(void) 67static 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}
85const 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}
73enum themable_icons skinlist_get_item_icon(void) 94
95enum 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
78static bool is_selected = false; 103static 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);
189bool skinlist_is_selected_item(void); 189bool skinlist_is_selected_item(void);
190void skinlist_set_cfg(enum screen_type screen, 190void skinlist_set_cfg(enum screen_type screen,
191 struct listitem_viewport_cfg *cfg); 191 struct listitem_viewport_cfg *cfg);
192const char* skinlist_get_item_text(void); 192const char* skinlist_get_item_text(int offset, bool wrap, char* buf, size_t buf_size);
193enum themable_icons skinlist_get_item_icon(void); 193enum themable_icons skinlist_get_item_icon(int offset, bool wrap);
194bool skinlist_needs_scrollbar(enum screen_type screen); 194bool skinlist_needs_scrollbar(enum screen_type screen);
195void skinlist_get_scrollbar(int* nb_item, int* first_shown, int* last_shown); 195void skinlist_get_scrollbar(int* nb_item, int* first_shown, int* last_shown);
196int skinlist_get_line_count(enum screen_type screen, struct gui_synclist *list); 196int 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
488static 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
489static int parse_listitemviewport(struct skin_element *element, 510static 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
297struct listitem {
298 bool wrap;
299 short offset;
300};
301
297#ifdef HAVE_SKIN_VARIABLES 302#ifdef HAVE_SKIN_VARIABLES
298struct skin_var { 303struct skin_var {
299 const char *label; 304 const char *label;