From 8719f0913a0f2d8a90e9ecbc7c0e5336369af6be Mon Sep 17 00:00:00 2001 From: Kevin Ferrare Date: Fri, 18 Nov 2005 02:07:02 +0000 Subject: 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 --- apps/gui/textarea.c | 12 +++++++ apps/gui/textarea.h | 16 +++++++++ apps/gui/yesno.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++ apps/gui/yesno.h | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 215 insertions(+) create mode 100644 apps/gui/yesno.c create mode 100644 apps/gui/yesno.h (limited to 'apps/gui') diff --git a/apps/gui/textarea.c b/apps/gui/textarea.c index d8e730fdc2..d73f20d0e7 100644 --- a/apps/gui/textarea.c +++ b/apps/gui/textarea.c @@ -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;inb_lines && i+ystartnb_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 diff --git a/apps/gui/textarea.h b/apps/gui/textarea.h index 5249aed7a5..b1af1a5aba 100644 --- a/apps/gui/textarea.h +++ b/apps/gui/textarea.h @@ -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 diff --git a/apps/gui/yesno.c b/apps/gui/yesno.c new file mode 100644 index 0000000000..65f81aaf3e --- /dev/null +++ b/apps/gui/yesno.c @@ -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+3nb_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); +} diff --git a/apps/gui/yesno.h b/apps/gui/yesno.h new file mode 100644 index 0000000000..ac6500daf8 --- /dev/null +++ b/apps/gui/yesno.h @@ -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_ */ -- cgit v1.2.3