1
0
Fork 0
forked from len0rd/rockbox

Fix buttonbar handling/theme changed handling in lists.

The lists need to copy to a local parent if a list passes NULL as parent in the init. This was before the commit of custom ui vp, but I removed it since I (wrongly) thought using the ui vp as parent would be fine. Let the viewportmanager fire a event in case when a theme-related setting changed and simply the handling in the lists code.
However the buttonbar handling didn't work before anyway, since list code didn't know if the buttonbar was active (it asked a variable which was always false....).

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22651 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Thomas Martitz 2009-09-07 17:37:06 +00:00
parent 47611321c0
commit 2eb1cb6f82
8 changed files with 78 additions and 34 deletions

View file

@ -51,6 +51,7 @@ enum {
GUI_EVENT_STATUSBAR_TOGGLE = (EVENT_CLASS_GUI|1), GUI_EVENT_STATUSBAR_TOGGLE = (EVENT_CLASS_GUI|1),
GUI_EVENT_ACTIONUPDATE, GUI_EVENT_ACTIONUPDATE,
GUI_EVENT_REFRESH, GUI_EVENT_REFRESH,
GUI_EVENT_THEME_CHANGED,
}; };
#endif #endif

View file

@ -38,6 +38,7 @@
#include "misc.h" #include "misc.h"
#include "talk.h" #include "talk.h"
#include "viewport.h" #include "viewport.h"
#include "appevents.h"
#ifdef HAVE_LCD_CHARCELLS #ifdef HAVE_LCD_CHARCELLS
#define SCROLL_LIMIT 1 #define SCROLL_LIMIT 1
@ -61,21 +62,41 @@ static void gui_list_select_at_offset(struct gui_synclist * gui_list,
void list_draw(struct screen *display, struct gui_synclist *list); void list_draw(struct screen *display, struct gui_synclist *list);
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
static int list_need_reinit = false;
static struct viewport parent[NB_SCREENS];
static void list_force_reinit(void *param)
{
(void)param;
list_need_reinit = true;
}
void list_init(void)
{
add_event(GUI_EVENT_THEME_CHANGED, false, list_force_reinit);
}
static void list_init_viewports(struct gui_synclist *list) static void list_init_viewports(struct gui_synclist *list)
{ {
struct viewport* vp; int i, parent_used;
int i;
bool parent_used = (*list->parent != NULL); if (!list)
return;
parent_used = (*list->parent != &parent[SCREEN_MAIN]);
if (!parent_used) if (!parent_used)
{ {
vp = viewport_get_current_vp();
FOR_NB_SCREENS(i) FOR_NB_SCREENS(i)
list->parent[i] = &vp[i]; {
} list->parent[i] = &parent[i];
viewport_set_defaults(&parent[i], i);
#ifdef HAVE_BUTTONBAR #ifdef HAVE_BUTTONBAR
if (list && !parent_used && global_settings.buttonbar) if (screens[i].has_buttonbar && !viewport_ui_vp_get_state(i))
list->parent[0]->height -= BUTTONBAR_HEIGHT; list->parent[i]->height -= BUTTONBAR_HEIGHT;
#endif #endif
}
}
} }
#else #else
#define list_init_viewports(a) #define list_init_viewports(a)
@ -135,12 +156,7 @@ void gui_synclist_init(struct gui_synclist * gui_list,
if (list_parent) if (list_parent)
gui_list->parent[i] = &list_parent[i]; gui_list->parent[i] = &list_parent[i];
else else
gui_list->parent[i] = gui_list->parent[i] = &parent[i];
#ifdef HAVE_LCD_BITMAP
NULL;
#else
&parent[i];
#endif
} }
list_init_viewports(gui_list); list_init_viewports(gui_list);
gui_list->limit_scroll = false; gui_list->limit_scroll = false;
@ -209,26 +225,13 @@ int gui_list_get_item_offset(struct gui_synclist * gui_list,
void gui_synclist_draw(struct gui_synclist *gui_list) void gui_synclist_draw(struct gui_synclist *gui_list)
{ {
int i; int i;
static struct gui_synclist *last_list = NULL; #ifdef HAVE_LCD_BITMAP
static int last_count = -1; if (list_need_reinit)
#ifdef HAVE_BUTTONBAR
static bool last_buttonbar = false;
#endif
if (
#ifdef HAVE_BUTTONBAR
last_buttonbar != screens[SCREEN_MAIN].has_buttonbar ||
#endif
last_list != gui_list ||
gui_list->nb_items != last_count)
{ {
list_init_viewports(gui_list); list_init_viewports(gui_list);
gui_synclist_select_item(gui_list, gui_list->selected_item); gui_synclist_select_item(gui_list, gui_list->selected_item);
} }
#ifdef HAVE_BUTTONBAR
last_buttonbar = screens[SCREEN_MAIN].has_buttonbar;
#endif #endif
last_count = gui_list->nb_items;
last_list = gui_list;
FOR_NB_SCREENS(i) FOR_NB_SCREENS(i)
{ {
list_draw(&screens[i], gui_list); list_draw(&screens[i], gui_list);

View file

@ -132,6 +132,7 @@ struct gui_synclist
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
extern void list_init(void);
/* parse global setting to static int */ /* parse global setting to static int */
extern void gui_list_screen_scroll_step(int ofs); extern void gui_list_screen_scroll_step(int ofs);

View file

@ -208,6 +208,13 @@ static void statusbar_toggled(void* param)
void viewportmanager_theme_changed(int which) void viewportmanager_theme_changed(int which)
{ {
int i; int i;
#ifdef HAVE_BUTTONBAR
if (which & THEME_BUTTONBAR)
{ /* don't handle further, the custom ui viewport ignores the buttonbar,
* as does viewport_set_defaults(), since only lists use it*/
screens[SCREEN_MAIN].has_buttonbar = global_settings.buttonbar;
}
#endif
if (which & THEME_UI_VIEWPORT) if (which & THEME_UI_VIEWPORT)
{ {
int retval = viewport_init_ui_vp(); int retval = viewport_init_ui_vp();
@ -245,6 +252,7 @@ void viewportmanager_theme_changed(int which)
viewport_set_fullscreen(&custom_vp[i], i); viewport_set_fullscreen(&custom_vp[i], i);
} }
} }
send_event(GUI_EVENT_THEME_CHANGED, NULL);
} }
static void viewportmanager_ui_vp_changed(void *param) static void viewportmanager_ui_vp_changed(void *param)
@ -279,6 +287,11 @@ struct viewport* viewport_get_current_vp(void)
return ui_vp_info.vp; return ui_vp_info.vp;
} }
bool viewport_ui_vp_get_state(enum screen_type screen)
{
return ui_vp_info.active[screen];
}
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
#define ARG_STRING(_depth) ((_depth) == 2 ? "dddddgg":"dddddcc") #define ARG_STRING(_depth) ((_depth) == 2 ? "dddddgg":"dddddcc")
#else #else

View file

@ -58,6 +58,7 @@ void viewport_set_defaults(struct viewport *vp, enum screen_type screen);
#define THEME_STATUSBAR (BIT_N(0)) #define THEME_STATUSBAR (BIT_N(0))
#define THEME_UI_VIEWPORT (BIT_N(1)) #define THEME_UI_VIEWPORT (BIT_N(1))
#define THEME_BUTTONBAR (BIT_N(2))
#define THEME_ALL (~(0u)) #define THEME_ALL (~(0u))
#define VP_SB_HIDE_ALL 0 #define VP_SB_HIDE_ALL 0
@ -116,6 +117,10 @@ struct viewport* viewport_get_current_vp(void);
*/ */
void viewport_set_current_vp(struct viewport* vp); void viewport_set_current_vp(struct viewport* vp);
/*
* returns true if the ui viewport is active on the screen
*/
bool viewport_ui_vp_get_state(enum screen_type screen);
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
bool viewport_point_within_vp(const struct viewport *vp, int x, int y); bool viewport_point_within_vp(const struct viewport *vp, int x, int y);
#endif #endif

View file

@ -135,6 +135,9 @@ static void app_main(void)
screens[i].clear_display(); screens[i].clear_display();
screens[i].update(); screens[i].update();
} }
#ifdef HAVE_LCD_BITMAP
list_init();
#endif
tree_gui_init(); tree_gui_init();
gui_syncstatusbar_init(&statusbars); gui_syncstatusbar_init(&statusbars);
viewportmanager_init(); viewportmanager_init();

View file

@ -38,6 +38,7 @@
#include "backdrop.h" #include "backdrop.h"
#include "exported_menus.h" #include "exported_menus.h"
#include "appevents.h" #include "appevents.h"
#include "viewport.h"
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
/** /**
@ -177,6 +178,20 @@ static int statusbar_callback(int action,const struct menu_item_ex *this_item)
{ {
return statusbar_callback_ex(action, this_item, SCREEN_MAIN); return statusbar_callback_ex(action, this_item, SCREEN_MAIN);
} }
#ifdef HAVE_BUTTONBAR
static int buttonbar_callback(int action, const struct menu_item_ex *this_item)
{
(void)this_item;
switch (action)
{
case ACTION_EXIT_MENUITEM:
viewportmanager_theme_changed(THEME_BUTTONBAR);
break;
}
return ACTION_REDRAW;
}
#endif
MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL); MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL);
MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL); MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL);
MENUITEM_SETTING(statusbar, &global_settings.statusbar, MENUITEM_SETTING(statusbar, &global_settings.statusbar,
@ -185,8 +200,8 @@ MENUITEM_SETTING(statusbar, &global_settings.statusbar,
MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar, MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar,
statusbar_callback_remote); statusbar_callback_remote);
#endif #endif
#if CONFIG_KEYPAD == RECORDER_PAD #ifdef HAVE_BUTTONBAR
MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, NULL); MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, buttonbar_callback);
#endif #endif
MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL); MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL);
MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL); MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL);

View file

@ -56,7 +56,7 @@ static int screen_helper_getnblines(void)
{ {
int height=screens[0].lcdheight; int height=screens[0].lcdheight;
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
if(global_settings.statusbar) if(global_settings.statusbar != STATUSBAR_OFF)
height -= STATUSBAR_HEIGHT; height -= STATUSBAR_HEIGHT;
#ifdef HAVE_BUTTONBAR #ifdef HAVE_BUTTONBAR
if(global_settings.buttonbar && screens[0].has_buttonbar) if(global_settings.buttonbar && screens[0].has_buttonbar)
@ -89,10 +89,10 @@ static int screen_helper_remote_getnblines(void)
{ {
int height=screens[1].lcdheight; int height=screens[1].lcdheight;
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
if(global_settings.statusbar) if(global_settings.statusbar != STATUSBAR_OFF)
height -= STATUSBAR_HEIGHT; height -= STATUSBAR_HEIGHT;
#ifdef HAVE_BUTTONBAR #ifdef HAVE_BUTTONBAR
if(global_settings.buttonbar && screens[0].has_buttonbar) if(global_settings.buttonbar && screens[1].has_buttonbar)
height -= BUTTONBAR_HEIGHT; height -= BUTTONBAR_HEIGHT;
#endif #endif
#endif #endif
@ -286,6 +286,9 @@ struct screen screens[NB_SCREENS] =
.backdrop_load=&remote_backdrop_load, .backdrop_load=&remote_backdrop_load,
.backdrop_unload=&remote_backdrop_unload, .backdrop_unload=&remote_backdrop_unload,
.backdrop_show=&remote_backdrop_show, .backdrop_show=&remote_backdrop_show,
#ifdef HAVE_BUTTONBAR
.has_buttonbar=false,
#endif
} }
#endif /* HAVE_REMOTE_LCD */ #endif /* HAVE_REMOTE_LCD */
}; };