forked from len0rd/rockbox
Add the new file and fix the compile error
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30462 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
9b6ac01c7b
commit
63a379c64c
2 changed files with 235 additions and 4 deletions
231
apps/gui/bitmap/list-skinned.c
Normal file
231
apps/gui/bitmap/list-skinned.c
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2011 by Jonathan Gordon
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "lcd.h"
|
||||
#include "font.h"
|
||||
#include "button.h"
|
||||
#include "string.h"
|
||||
#include "settings.h"
|
||||
#include "kernel.h"
|
||||
#include "system.h"
|
||||
#include "file.h"
|
||||
|
||||
#include "action.h"
|
||||
#include "screen_access.h"
|
||||
#include "list.h"
|
||||
#include "scrollbar.h"
|
||||
#include "lang.h"
|
||||
#include "sound.h"
|
||||
#include "misc.h"
|
||||
#include "viewport.h"
|
||||
#include "statusbar-skinned.h"
|
||||
#include "skin_engine/skin_engine.h"
|
||||
#include "skin_engine/skin_display.h"
|
||||
#include "appevents.h"
|
||||
|
||||
static struct listitem_viewport_cfg *listcfg[NB_SCREENS] = {NULL};
|
||||
static const char *current_item_text_ptr;
|
||||
static char current_item_text[MAX_PATH];
|
||||
static enum themable_icons current_item_icon;
|
||||
void skinlist_set_cfg(enum screen_type screen,
|
||||
struct listitem_viewport_cfg *cfg)
|
||||
{
|
||||
if (listcfg[screen] != cfg)
|
||||
{
|
||||
if (listcfg[screen])
|
||||
screens[screen].scroll_stop(&listcfg[screen]->selected_item_vp.vp);
|
||||
listcfg[screen] = cfg;
|
||||
current_item_text_ptr = "";
|
||||
}
|
||||
}
|
||||
|
||||
static bool skinlist_is_configured(enum screen_type screen,
|
||||
struct gui_synclist *list)
|
||||
{
|
||||
return (listcfg[screen] != NULL) &&
|
||||
(!list || (list && list->selected_size == 1));
|
||||
}
|
||||
|
||||
const char* skinlist_get_item_text(void)
|
||||
{
|
||||
const char* ret = P2STR((unsigned char*)current_item_text_ptr);
|
||||
return ret;
|
||||
}
|
||||
enum themable_icons skinlist_get_item_icon(void)
|
||||
{
|
||||
return current_item_icon;
|
||||
}
|
||||
|
||||
static bool is_selected = false;
|
||||
bool skinlist_is_selected_item(void)
|
||||
{
|
||||
return is_selected;
|
||||
}
|
||||
|
||||
int skinlist_get_line_count(enum screen_type screen, struct gui_synclist *list)
|
||||
{
|
||||
struct viewport *parent = (list->parent[screen]);
|
||||
if (!skinlist_is_configured(screen, list))
|
||||
return -1;
|
||||
if (listcfg[screen]->tile == true)
|
||||
{
|
||||
int rows = (parent->height / listcfg[screen]->height);
|
||||
int cols = (parent->width / listcfg[screen]->width);
|
||||
return rows*cols;
|
||||
}
|
||||
else
|
||||
return (parent->height / listcfg[screen]->height);
|
||||
}
|
||||
|
||||
static int current_item;
|
||||
static int current_nbitems;
|
||||
static bool needs_scrollbar[NB_SCREENS];
|
||||
bool skinlist_needs_scrollbar(enum screen_type screen)
|
||||
{
|
||||
return needs_scrollbar[screen];
|
||||
}
|
||||
|
||||
void skinlist_get_scrollbar(int* nb_item, int* first_shown, int* last_shown)
|
||||
{
|
||||
if (!skinlist_is_configured(0, NULL))
|
||||
{
|
||||
*nb_item = 0;
|
||||
*first_shown = 0;
|
||||
*last_shown = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
*nb_item = current_item;
|
||||
*first_shown = 0;
|
||||
*last_shown = current_nbitems;
|
||||
}
|
||||
}
|
||||
|
||||
bool skinlist_draw(struct screen *display, struct gui_synclist *list)
|
||||
{
|
||||
int cur_line, display_lines;
|
||||
const int screen = display->screen_type;
|
||||
struct viewport *parent = (list->parent[screen]);
|
||||
char* label = NULL;
|
||||
const int list_start_item = list->start_item[screen];
|
||||
struct gui_wps wps;
|
||||
if (!skinlist_is_configured(screen, list))
|
||||
return false;
|
||||
wps.display = display;
|
||||
wps.data = listcfg[screen]->data;
|
||||
display_lines = skinlist_get_line_count(screen, list);
|
||||
label = listcfg[screen]->label;
|
||||
display->set_viewport(parent);
|
||||
display->clear_viewport();
|
||||
current_item = list->selected_item;
|
||||
current_nbitems = list->nb_items;
|
||||
needs_scrollbar[screen] = list->nb_items > display_lines;
|
||||
|
||||
for (cur_line = 0; cur_line < display_lines; cur_line++)
|
||||
{
|
||||
struct skin_element* viewport;
|
||||
struct skin_viewport* skin_viewport;
|
||||
if (list_start_item+cur_line+1 > list->nb_items)
|
||||
break;
|
||||
is_selected = list->show_selection_marker &&
|
||||
list_start_item+cur_line == list->selected_item;
|
||||
current_item_text_ptr = list->callback_get_item_name(
|
||||
list_start_item+cur_line,
|
||||
list->data, current_item_text, MAX_PATH);
|
||||
if (list->callback_get_item_icon != NULL)
|
||||
current_item_icon = list->callback_get_item_icon(
|
||||
list_start_item+cur_line, list->data);
|
||||
|
||||
for (viewport = listcfg[screen]->data->tree;
|
||||
viewport;
|
||||
viewport = viewport->next)
|
||||
{
|
||||
int origional_x, origional_y;
|
||||
int origional_w, origional_h;
|
||||
skin_viewport = (struct skin_viewport*)viewport->data;
|
||||
if (viewport->children == 0 || !skin_viewport->label ||
|
||||
(skin_viewport->label && strcmp(label, skin_viewport->label))
|
||||
)
|
||||
continue;
|
||||
if (is_selected)
|
||||
{
|
||||
memcpy(&listcfg[screen]->selected_item_vp, skin_viewport, sizeof(struct skin_viewport));
|
||||
skin_viewport = &listcfg[screen]->selected_item_vp;
|
||||
}
|
||||
origional_x = skin_viewport->vp.x;
|
||||
origional_y = skin_viewport->vp.y;
|
||||
origional_w = skin_viewport->vp.width;
|
||||
origional_h = skin_viewport->vp.height;
|
||||
if (listcfg[screen]->tile)
|
||||
{
|
||||
int cols = (parent->width / listcfg[screen]->width);
|
||||
int col = (cur_line)%cols;
|
||||
int 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;
|
||||
}
|
||||
else
|
||||
{
|
||||
skin_viewport->vp.x = parent->x + origional_x;
|
||||
skin_viewport->vp.y = parent->y + origional_y +
|
||||
(listcfg[screen]->height*cur_line);
|
||||
}
|
||||
display->set_viewport(&skin_viewport->vp);
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
/* Set images to not to be displayed */
|
||||
struct skin_token_list *imglist = wps.data->images;
|
||||
while (imglist)
|
||||
{
|
||||
struct gui_img *img = (struct gui_img *)imglist->token->value.data;
|
||||
img->display = -1;
|
||||
imglist = imglist->next;
|
||||
}
|
||||
#endif
|
||||
skin_render_viewport(viewport->children[0],
|
||||
&wps, skin_viewport, SKIN_REFRESH_ALL);
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
wps_display_images(&wps, &skin_viewport->vp);
|
||||
#endif
|
||||
/* force disableing scroll because it breaks later */
|
||||
if (!is_selected)
|
||||
{
|
||||
display->scroll_stop(&skin_viewport->vp);
|
||||
skin_viewport->vp.x = origional_x;
|
||||
skin_viewport->vp.y = origional_y;
|
||||
skin_viewport->vp.width = origional_w;
|
||||
skin_viewport->vp.height = origional_h;
|
||||
}
|
||||
}
|
||||
}
|
||||
display->set_viewport(parent);
|
||||
display->update_viewport();
|
||||
current_item_text_ptr = list->callback_get_item_name(
|
||||
list->selected_item,
|
||||
list->data, current_item_text, 2048);
|
||||
#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
|
||||
/* Abuse the callback to force the sbs to update */
|
||||
send_event(LCD_EVENT_ACTIVATION, NULL);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1079,22 +1079,22 @@ static enum current_activity
|
|||
static int current_activity_top = 0;
|
||||
void push_current_activity(enum current_activity screen)
|
||||
{
|
||||
#if HAVE_LCD_BITMAP
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
int i;
|
||||
#endif
|
||||
current_activity[current_activity_top++] = screen;
|
||||
#if HAVE_LCD_BITMAP
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
FOR_NB_SCREENS(i)
|
||||
skinlist_set_cfg(i, NULL);
|
||||
#endif
|
||||
}
|
||||
void pop_current_activity(void)
|
||||
{
|
||||
#if HAVE_LCD_BITMAP
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
int i;
|
||||
#endif
|
||||
current_activity_top--;
|
||||
#if HAVE_LCD_BITMAP
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
FOR_NB_SCREENS(i)
|
||||
skinlist_set_cfg(i, NULL);
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue