generic multi-screen support for yes/no screens (like the one when reseting settings or when firmware has changed)

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7951 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Kevin Ferrare 2005-11-18 02:07:02 +00:00
parent ec0a8a749b
commit 8719f0913a
8 changed files with 250 additions and 87 deletions

View file

@ -41,6 +41,7 @@ gui/statusbar.c
gui/gwps.c
gui/gwps-common.c
gui/textarea.c
gui/yesno.c
#ifdef HAVE_LCD_CHARCELLS
player/icons.c

View file

@ -41,6 +41,18 @@ void gui_textarea_update(struct screen * display)
}
#endif
int gui_textarea_put_message(struct screen * display,
struct text_message * message,
int ystart)
{
int i;
gui_textarea_clear(display);
for(i=0;i<message->nb_lines && i+ystart<display->nb_lines;i++)
display->puts(0, i+ystart, message->message_lines[i]);
gui_textarea_update(display);
return(i);
}
void gui_textarea_update_nblines(struct screen * display)
{
#ifdef HAVE_LCD_BITMAP

View file

@ -23,6 +23,12 @@
#include "settings.h"
#include "statusbar.h"
struct text_message
{
char **message_lines;
int nb_lines;
};
/*
* Clears the area in the screen in which text can be displayed
* and sets the y margin properly
@ -45,6 +51,16 @@ extern void gui_textarea_update(struct screen * display);
#endif
#endif
/*
* Displays message lines on the given screen
* - display : the screen structure
* - message : the lines to display
* - ystart : the lineon which we start displaying
* returns : the number of lines effectively displayed
*/
extern int gui_textarea_put_message(struct screen * display,
struct text_message * message,
int ystart);
/*
* Compute the number of text lines the display can draw with the current font
* Also updates the char height and width

96
apps/gui/yesno.c Normal file
View file

@ -0,0 +1,96 @@
#include "yesno.h"
#include "kernel.h"
#include "misc.h"
#include "lang.h"
void gui_yesno_init(struct gui_yesno * yn,
struct text_message * main_message,
struct text_message * yes_message,
struct text_message * no_message)
{
yn->main_message=main_message;
yn->result_message[YESNO_YES]=yes_message;
yn->result_message[YESNO_NO]=no_message;
yn->display=0;
}
void gui_yesno_set_display(struct gui_yesno * yn,
struct screen * display)
{
yn->display=display;
}
void gui_yesno_draw(struct gui_yesno * yn)
{
struct screen * display=yn->display;
int nb_lines, line_shift=0;
#ifdef HAS_LCD_BITMAP
screen_set_xmargin(display, 0);
#endif
gui_textarea_clear(display);
nb_lines=yn->main_message->nb_lines;
if(nb_lines+3<display->nb_lines)
line_shift=1;
nb_lines=gui_textarea_put_message(display, yn->main_message, line_shift);
/* Space remaining for yes / no text ? */
if(nb_lines+line_shift+2<=display->nb_lines)
{
if(nb_lines+line_shift+3<=display->nb_lines)
nb_lines++;
display->puts(0, nb_lines+line_shift, str(LANG_CONFIRM_WITH_PLAY_RECORDER));
display->puts(0, nb_lines+line_shift+1, str(LANG_CANCEL_WITH_ANY_RECORDER));
}
gui_textarea_update(display);
}
bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result)
{
struct text_message * message=yn->result_message[result];
if(message==NULL)
return false;
gui_textarea_put_message(yn->display, message, 0);
return(true);
}
enum yesno_res gui_syncyesno_run(struct text_message * main_message,
struct text_message * yes_message,
struct text_message * no_message)
{
int i;
unsigned button;
int result=-1;
bool result_displayed;
struct gui_yesno yn[NB_SCREENS];
FOR_NB_SCREENS(i)
{
gui_yesno_init(&(yn[i]), main_message, yes_message, no_message);
gui_yesno_set_display(&(yn[i]), &(screens[i]));
gui_yesno_draw(&(yn[i]));
}
while (result==-1)
{
button = button_get(true);
switch (button)
{
case YESNO_OK:
#ifdef TREE_RC_RUN
case YESNO_RC_OK:
#endif
result=YESNO_YES;
break;
default:
if(default_event_handler(button) == SYS_USB_CONNECTED)
return(YESNO_USB);
if(!(button & BUTTON_REL))
result=YESNO_NO;
}
}
FOR_NB_SCREENS(i)
result_displayed=gui_yesno_draw_result(&(yn[i]), result);
if(result_displayed)
sleep(HZ);
return(result);
}

91
apps/gui/yesno.h Normal file
View file

@ -0,0 +1,91 @@
#ifndef _GUI_YESNO_H_
#define _GUI_YESNO_H_
#include "screen_access.h"
#include "textarea.h"
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
(CONFIG_KEYPAD == IRIVER_H300_PAD)
#define YESNO_OK BUTTON_SELECT
#define YESNO_RC_OK BUTTON_RC_MENU
#elif CONFIG_KEYPAD == RECORDER_PAD
#define YESNO_OK BUTTON_PLAY
#define YESNO_RC_OK BUTTON_RC_PLAY
#elif CONFIG_KEYPAD == PLAYER_PAD
#define YESNO_OK BUTTON_PLAY
#define YESNO_RC_OK BUTTON_RC_PLAY
#elif CONFIG_KEYPAD == ONDIO_PAD
#define YESNO_OK BUTTON_RIGHT
#elif CONFIG_KEYPAD == GMINI100_PAD
#define YESNO_OK BUTTON_PLAY
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_NANO_PAD)
#define YESNO_OK BUTTON_RIGHT
#endif
enum yesno_res
{
YESNO_YES,
YESNO_NO,
YESNO_USB
};
struct gui_yesno
{
struct text_message * main_message;
struct text_message * result_message[2];
struct screen * display;
};
/*
* Initializes the yesno asker
* - yn : the yesno structure
* - main_message : the question the user has to answer
* - yes_message : message displayed if answer is 'yes'
* - no_message : message displayed if answer is 'no'
*/
extern void gui_yesno_init(struct gui_yesno * yn,
struct text_message * main_message,
struct text_message * yes_message,
struct text_message * no_message);
/*
* Attach the yesno to a screen
* - yn : the yesno structure
* - display : the screen to attach
*/
extern void gui_yesno_set_display(struct gui_yesno * yn,
struct screen * display);
/*
* Draws the yesno
* - yn : the yesno structure
*/
extern void gui_yesno_draw(struct gui_yesno * yn);
/*
* Draws the yesno result
* - yn : the yesno structure
* - result : the result tha must be displayed :
* YESNO_NO if no
* YESNO_YES if yes
*/
extern bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result);
/*
* Runs the yesno asker :
* it will display the 'main_message' question, and wait for user keypress
* PLAY means yes, other keys means no
* - main_message : the question the user has to answer
* - yes_message : message displayed if answer is 'yes'
* - no_message : message displayed if answer is 'no'
*/
extern enum yesno_res gui_syncyesno_run(
struct text_message * main_message,
struct text_message * yes_message,
struct text_message * no_message);
#endif /* _GUI_YESNO_H_ */

View file

@ -52,6 +52,7 @@
#include "dir.h"
#include "dircache.h"
#include "splash.h"
#include "yesno.h"
#ifdef HAVE_LCD_BITMAP
#include "peakmeter.h"
@ -1428,49 +1429,24 @@ static bool bookmark_settings_menu(void)
}
static bool reset_settings(void)
{
bool done=false;
int line;
int button;
lcd_clear_display();
char *lines[]={str(LANG_RESET_ASK_RECORDER)};
char *yes_lines[]={str(LANG_RESET_DONE_SETTING), str(LANG_RESET_DONE_CLEAR)};
char *no_lines[]={yes_lines[0], str(LANG_RESET_DONE_CANCEL)};
struct text_message message={lines, 1};
struct text_message yes_message={yes_lines, 2};
struct text_message no_message={no_lines, 2};
#ifdef HAVE_LCD_CHARCELLS
line = 0;
#else
line = 1;
lcd_puts(0,0,str(LANG_RESET_ASK_RECORDER));
#endif
lcd_puts(0,line,str(LANG_RESET_CONFIRM));
lcd_puts(0,line+1,str(LANG_RESET_CANCEL));
lcd_update();
while(!done) {
button = button_get(true);
switch(button) {
case SETTINGS_OK:
settings_reset();
settings_apply();
lcd_clear_display();
lcd_puts(0,1,str(LANG_RESET_DONE_CLEAR));
done = true;
break;
case SETTINGS_CANCEL:
lcd_clear_display();
lcd_puts(0,1,str(LANG_RESET_DONE_CANCEL));
done = true;
break;
default:
if(default_event_handler(button) == SYS_USB_CONNECTED)
return true;
}
switch(gui_syncyesno_run(&message, &yes_message, &no_message))
{
case YESNO_YES:
settings_reset();
settings_apply();
break;
case YESNO_NO:
break;
case YESNO_USB:
return true;
}
lcd_puts(0,0,str(LANG_RESET_DONE_SETTING));
lcd_update();
sleep(HZ);
return false;
}

View file

@ -61,6 +61,7 @@
#include "recorder/recording.h"
#include "rtc.h"
#include "dircache.h"
#include "yesno.h"
/* gui api */
#include "list.h"
@ -561,47 +562,17 @@ static bool dirbrowse(void)
while(1) {
struct entry *dircache = tc.dircache;
bool restore = false;
button = button_get_w_tmo(HZ/5);
#ifdef BOOTFILE
if (boot_changed) {
bool stop = false;
unsigned int button;
int i;
FOR_NB_SCREENS(i)
{
gui_textarea_clear(&screens[i]);
screens[i].puts(0,0,str(LANG_BOOT_CHANGED));
screens[i].puts(0,1,str(LANG_REBOOT_NOW));
#ifdef HAVE_LCD_BITMAP
screens[i].puts(0,3,str(LANG_CONFIRM_WITH_PLAY_RECORDER));
screens[i].puts(0,4,str(LANG_CANCEL_WITH_ANY_RECORDER));
gui_textarea_update(&screens[i]);
#endif
}
while (!stop) {
button = button_get(true);
switch (button) {
case TREE_RUN:
#ifdef TREE_RC_RUN
case TREE_RC_RUN:
#endif
rolo_load("/" BOOTFILE);
stop = true;
break;
default:
if(default_event_handler(button) ||
(button & BUTTON_REL))
stop = true;
break;
}
}
char *lines[]={str(LANG_BOOT_CHANGED), str(LANG_REBOOT_NOW)};
struct text_message message={lines, 2};
if(gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES)
rolo_load("/" BOOTFILE);
restore = true;
boot_changed = false;
}
#endif
button = button_get_w_tmo(HZ/5);
need_update = gui_synclist_do_button(&tree_lists, button);
switch ( button ) {

View file

@ -46,18 +46,18 @@
#define TREE_QUICK (BUTTON_MODE | BUTTON_REPEAT)
/* Remote keys */
#define TREE_RC_NEXT BUTTON_RC_FF
#define TREE_RC_PREV BUTTON_RC_REW
#define TREE_RC_PGUP BUTTON_RC_SOURCE
#define TREE_RC_PGDN BUTTON_RC_BITRATE
#define TREE_RC_EXIT BUTTON_RC_STOP
#define TREE_RC_RUN (BUTTON_RC_MENU | BUTTON_REL)
#define TREE_RC_RUN_PRE BUTTON_RC_MENU
#define TREE_RC_MENU ( BUTTON_RC_MODE | BUTTON_REL)
#define TREE_RC_NEXT BUTTON_RC_FF
#define TREE_RC_PREV BUTTON_RC_REW
#define TREE_RC_PGUP BUTTON_RC_SOURCE
#define TREE_RC_PGDN BUTTON_RC_BITRATE
#define TREE_RC_EXIT BUTTON_RC_STOP
#define TREE_RC_RUN (BUTTON_RC_MENU | BUTTON_REL)
#define TREE_RC_RUN_PRE BUTTON_RC_MENU
#define TREE_RC_MENU (BUTTON_RC_MODE | BUTTON_REL)
#define TREE_RC_MENU_PRE BUTTON_RC_MODE
#define TREE_RC_WPS (BUTTON_RC_ON | BUTTON_REL)
#define TREE_RC_WPS_PRE BUTTON_RC_ON
#define TREE_RC_CONTEXT (BUTTON_RC_ON | BUTTON_REPEAT)
#define TREE_RC_WPS (BUTTON_RC_ON | BUTTON_REL)
#define TREE_RC_WPS_PRE BUTTON_RC_ON
#define TREE_RC_CONTEXT (BUTTON_RC_ON | BUTTON_REPEAT)
#elif CONFIG_KEYPAD == RECORDER_PAD
#define TREE_NEXT BUTTON_DOWN