Add %LR and %LC to get at the current row and columm in skinned lists.

This allows list items to be rendered differently depending on their
on-screen position, allowing things like gradients or nonlinear alignment

Change-Id: I1d9c080f97e83707f0e80f57abc762cb2b94f6ed
This commit is contained in:
Frank Gevaerts 2012-02-25 02:34:23 +01:00
parent 7d599b4311
commit b5cd5ce8a1
5 changed files with 36 additions and 5 deletions

View file

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

View file

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

View file

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

View file

@ -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 },

View file

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