summaryrefslogtreecommitdiff
path: root/apps/gui
diff options
context:
space:
mode:
authorKevin Ferrare <kevin@rockbox.org>2005-11-18 02:07:02 +0000
committerKevin Ferrare <kevin@rockbox.org>2005-11-18 02:07:02 +0000
commit8719f0913a0f2d8a90e9ecbc7c0e5336369af6be (patch)
treeb336928b98e48a15d0d1c176105fa21ac557b7c9 /apps/gui
parentec0a8a749bbc3aa25bf4c136352725bd9d2532b5 (diff)
downloadrockbox-8719f0913a0f2d8a90e9ecbc7c0e5336369af6be.zip
rockbox-8719f0913a0f2d8a90e9ecbc7c0e5336369af6be.tar.gz
rockbox-8719f0913a0f2d8a90e9ecbc7c0e5336369af6be.tar.bz2
rockbox-8719f0913a0f2d8a90e9ecbc7c0e5336369af6be.tar.xz
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
Diffstat (limited to 'apps/gui')
-rw-r--r--apps/gui/textarea.c12
-rw-r--r--apps/gui/textarea.h16
-rw-r--r--apps/gui/yesno.c96
-rw-r--r--apps/gui/yesno.h91
4 files changed, 215 insertions, 0 deletions
diff --git a/apps/gui/textarea.c b/apps/gui/textarea.c
index d8e730f..d73f20d 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;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
diff --git a/apps/gui/textarea.h b/apps/gui/textarea.h
index 5249aed..b1af1a5 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
@@ -46,6 +52,16 @@ extern void gui_textarea_update(struct screen * display);
#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
* - display : the screen structure
diff --git a/apps/gui/yesno.c b/apps/gui/yesno.c
new file mode 100644
index 0000000..65f81aa
--- /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+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);
+}
diff --git a/apps/gui/yesno.h b/apps/gui/yesno.h
new file mode 100644
index 0000000..ac6500d
--- /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_ */