diff --git a/apps/gui/bitmap/list-skinned.c b/apps/gui/bitmap/list-skinned.c index 028374cf12..47bfec3608 100644 --- a/apps/gui/bitmap/list-skinned.c +++ b/apps/gui/bitmap/list-skinned.c @@ -45,6 +45,9 @@ static struct listitem_viewport_cfg *listcfg[NB_SCREENS] = {NULL}; static struct gui_synclist *current_list; +static int current_row; +static int current_column; + void skinlist_set_cfg(enum screen_type screen, struct listitem_viewport_cfg *cfg) { @@ -88,6 +91,17 @@ int skinlist_get_item_number() return current_drawing_line; } +int skinlist_get_item_row() +{ + return current_row; +} + +int skinlist_get_item_column() +{ + return current_column; +} + + const char* skinlist_get_item_text(int offset, bool wrap, char* buf, size_t buf_size) { int item = offset_to_item(offset, wrap); @@ -181,7 +195,7 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list) current_drawing_line = list_start_item+cur_line; is_selected = list->show_selection_marker && list_start_item+cur_line == list->selected_item; - + for (viewport = SKINOFFSETTOPTR(get_skin_buffer(wps.data), listcfg[screen]->data->tree); viewport; viewport = SKINOFFSETTOPTR(get_skin_buffer(wps.data), viewport->next)) @@ -206,14 +220,15 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list) if (listcfg[screen]->tile) { int cols = (parent->width / listcfg[screen]->width); - int col = (cur_line)%cols; - int row = (cur_line)/cols; + current_column = (cur_line)%cols; + current_row = (cur_line)/cols; - skin_viewport->vp.x = parent->x + listcfg[screen]->width*col + origional_x; - skin_viewport->vp.y = parent->y + listcfg[screen]->height*row + origional_y; + skin_viewport->vp.x = parent->x + listcfg[screen]->width*current_column + origional_x; + skin_viewport->vp.y = parent->y + listcfg[screen]->height*current_row + origional_y; } else { + current_row = cur_line; skin_viewport->vp.x = parent->x + origional_x; skin_viewport->vp.y = parent->y + origional_y + (listcfg[screen]->height*cur_line); diff --git a/apps/gui/list.h b/apps/gui/list.h index 41bc4369d1..647b4ea20e 100644 --- a/apps/gui/list.h +++ b/apps/gui/list.h @@ -194,6 +194,8 @@ void skinlist_set_cfg(enum screen_type screen, struct listitem_viewport_cfg *cfg); const char* skinlist_get_item_text(int offset, bool wrap, char* buf, size_t buf_size); int skinlist_get_item_number(void); +int skinlist_get_item_row(void); +int skinlist_get_item_column(void); enum themable_icons skinlist_get_item_icon(int offset, bool wrap); bool skinlist_needs_scrollbar(enum screen_type screen); void skinlist_get_scrollbar(int* nb_item, int* first_shown, int* last_shown); diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index 765102513a..29ddad4c5b 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -981,6 +981,16 @@ const char *get_token_value(struct gui_wps *gwps, struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size); } + case SKIN_TOKEN_LIST_ITEM_ROW: + if (intval) + *intval = skinlist_get_item_row() + 1; + snprintf(buf, buf_size, "%d",skinlist_get_item_row() + 1); + return buf; + case SKIN_TOKEN_LIST_ITEM_COLUMN: + if (intval) + *intval = skinlist_get_item_column() + 1; + snprintf(buf, buf_size, "%d",skinlist_get_item_column() + 1); + return buf; case SKIN_TOKEN_LIST_ITEM_NUMBER: if (intval) *intval = skinlist_get_item_number() + 1; diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c index 14876d11c4..9a183986ce 100644 --- a/lib/skin_parser/tag_table.c +++ b/lib/skin_parser/tag_table.c @@ -191,6 +191,8 @@ static const struct tag_info legal_tags[] = { SKIN_TOKEN_VIEWPORT_CUSTOMLIST, "Vp" , "IC", SKIN_REFRESH_DYNAMIC|NOBREAK }, { SKIN_TOKEN_LIST_TITLE_TEXT, "Lt" , "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_LIST_ITEM_TEXT, "LT", "|IS", SKIN_REFRESH_DYNAMIC }, + { SKIN_TOKEN_LIST_ITEM_ROW, "LR", "", SKIN_REFRESH_DYNAMIC }, + { SKIN_TOKEN_LIST_ITEM_COLUMN, "LC", "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_LIST_ITEM_NUMBER, "LN", "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_LIST_TITLE_ICON, "Li" , "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_LIST_ITEM_ICON, "LI", "|IS", SKIN_REFRESH_DYNAMIC }, diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h index 35316b749e..d14d31fcb2 100644 --- a/lib/skin_parser/tag_table.h +++ b/lib/skin_parser/tag_table.h @@ -219,6 +219,8 @@ enum skin_token_type { SKIN_TOKEN_LIST_SELECTED_ITEM_CFG, SKIN_TOKEN_LIST_ITEM_IS_SELECTED, SKIN_TOKEN_LIST_ITEM_TEXT, + SKIN_TOKEN_LIST_ITEM_ROW, + SKIN_TOKEN_LIST_ITEM_COLUMN, SKIN_TOKEN_LIST_ITEM_NUMBER, SKIN_TOKEN_LIST_ITEM_ICON, SKIN_TOKEN_LIST_NEEDS_SCROLLBAR,