doh! fix yellow.
[Rockbox.git] / apps / gui / yesno.c
blob43eccfb3134cabf74022d38a2f389f711e914f53
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id $
10 * Copyright (C) 2005 by Kevin Ferrare
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "yesno.h"
21 #include "system.h"
22 #include "kernel.h"
23 #include "misc.h"
24 #include "lang.h"
25 #include "action.h"
26 #include "talk.h"
27 #include "textarea.h"
28 #include "viewport.h"
31 struct gui_yesno
33 const struct text_message * main_message;
34 const struct text_message * result_message[2];
36 struct viewport *vp;
37 struct screen * display;
39 static int put_message(struct screen *display,
40 const struct text_message * message,
41 int start, int max_y)
43 int i;
44 for(i=0; i<message->nb_lines && i+start<max_y; i++)
46 display->puts_scroll(0, i+start,
47 P2STR((unsigned char *)message->message_lines[i]));
49 return i;
53 * Draws the yesno
54 * - yn : the yesno structure
56 static void gui_yesno_draw(struct gui_yesno * yn)
58 struct screen * display=yn->display;
59 struct viewport *vp = yn->vp;
60 int nb_lines, vp_lines, line_shift=0;
62 display->set_viewport(vp);
63 display->clear_viewport();
64 nb_lines = yn->main_message->nb_lines;
65 vp_lines = viewport_get_nb_lines(vp);
67 if(nb_lines+3< vp_lines)
68 line_shift=1;
70 line_shift += put_message(display, yn->main_message,
71 line_shift, vp_lines);
73 /* Space remaining for yes / no text ? */
74 if(line_shift+2 <= vp_lines)
76 if(line_shift+3 <= vp_lines)
77 line_shift++;
78 display->puts(0, line_shift, str(LANG_CONFIRM_WITH_BUTTON));
79 #ifdef HAVE_LCD_BITMAP
80 display->puts(0, line_shift+1, str(LANG_CANCEL_WITH_ANY));
81 #endif
83 display->update_viewport();
84 display->set_viewport(NULL);
88 * Draws the yesno result
89 * - yn : the yesno structure
90 * - result : the result tha must be displayed :
91 * YESNO_NO if no
92 * YESNO_YES if yes
94 static bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result)
96 const struct text_message * message=yn->result_message[result];
97 struct viewport *vp = yn->vp;
98 struct screen * display=yn->display;
99 if(message==NULL)
100 return false;
101 display->set_viewport(vp);
102 display->clear_viewport();
103 put_message(yn->display, message, 0, viewport_get_nb_lines(vp));
104 display->update_viewport();
105 display->set_viewport(NULL);
106 return(true);
109 enum yesno_res gui_syncyesno_run(const struct text_message * main_message,
110 const struct text_message * yes_message,
111 const struct text_message * no_message)
113 int i;
114 unsigned button;
115 int result=-1;
116 bool result_displayed;
117 struct gui_yesno yn[NB_SCREENS];
118 struct viewport vp[NB_SCREENS];
119 long talked_tick = 0;
120 FOR_NB_SCREENS(i)
122 yn[i].main_message=main_message;
123 yn[i].result_message[YESNO_YES]=yes_message;
124 yn[i].result_message[YESNO_NO]=no_message;
125 yn[i].display=&screens[i];
126 yn[i].vp = &vp[i];
127 viewport_set_defaults(yn[i].vp, i);
128 gui_yesno_draw(&(yn[i]));
130 while (result==-1)
132 /* Repeat the question every 5secs (more or less) */
133 if (global_settings.talk_menu
134 && (talked_tick==0 || TIME_AFTER(current_tick, talked_tick+HZ*5)))
136 talked_tick = current_tick;
137 talk_text_message(main_message, false);
139 button = get_action(CONTEXT_YESNOSCREEN, HZ*5);
140 switch (button)
142 case ACTION_YESNO_ACCEPT:
143 result=YESNO_YES;
144 break;
145 case ACTION_NONE:
146 case SYS_CHARGER_DISCONNECTED:
147 /* ignore some SYS events that can happen */
148 continue;
149 default:
150 if(default_event_handler(button) == SYS_USB_CONNECTED)
151 return(YESNO_USB);
152 result = YESNO_NO;
156 FOR_NB_SCREENS(i)
157 result_displayed=gui_yesno_draw_result(&(yn[i]), result);
159 if (global_settings.talk_menu)
161 talk_text_message((result == YESNO_YES) ? yes_message
162 : no_message, false);
163 talk_force_enqueue_next();
165 if(result_displayed)
166 sleep(HZ);
167 return(result);