Musepack speed optimization. Speep up 64 bit precision synthesizer by another 1.5MHz...
[kugel-rb.git] / apps / gui / yesno.c
blob91358d8feb7433c3edbf479d8ae3145c2ffd0183
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 ****************************************************************************/
19 #include "config.h"
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 "settings.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;
40 static void talk_text_message(const struct text_message * message, bool enqueue)
42 int line;
43 if(message)
45 for(line=0; line<message->nb_lines; line++)
47 long id = P2ID((unsigned char *)message->message_lines[line]);
48 if(id>=0)
50 talk_id(id, enqueue);
51 enqueue = true;
57 static int put_message(struct screen *display,
58 const struct text_message * message,
59 int start, int max_y)
61 int i;
62 for(i=0; i<message->nb_lines && i+start<max_y; i++)
64 display->puts_scroll(0, i+start,
65 P2STR((unsigned char *)message->message_lines[i]));
67 return i;
71 * Draws the yesno
72 * - yn : the yesno structure
74 static void gui_yesno_draw(struct gui_yesno * yn)
76 struct screen * display=yn->display;
77 struct viewport *vp = yn->vp;
78 int nb_lines, vp_lines, line_shift=0;
80 display->set_viewport(vp);
81 display->clear_viewport();
82 nb_lines = yn->main_message->nb_lines;
83 vp_lines = viewport_get_nb_lines(vp);
85 if(nb_lines+3< vp_lines)
86 line_shift=1;
88 line_shift += put_message(display, yn->main_message,
89 line_shift, vp_lines);
91 /* Space remaining for yes / no text ? */
92 if(line_shift+2 <= vp_lines)
94 if(line_shift+3 <= vp_lines)
95 line_shift++;
96 display->puts(0, line_shift, str(LANG_CONFIRM_WITH_BUTTON));
97 #ifdef HAVE_LCD_BITMAP
98 display->puts(0, line_shift+1, str(LANG_CANCEL_WITH_ANY));
99 #endif
101 display->update_viewport();
102 display->set_viewport(NULL);
106 * Draws the yesno result
107 * - yn : the yesno structure
108 * - result : the result tha must be displayed :
109 * YESNO_NO if no
110 * YESNO_YES if yes
112 static bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result)
114 const struct text_message * message=yn->result_message[result];
115 struct viewport *vp = yn->vp;
116 struct screen * display=yn->display;
117 if(message==NULL)
118 return false;
119 display->set_viewport(vp);
120 display->clear_viewport();
121 put_message(yn->display, message, 0, viewport_get_nb_lines(vp));
122 display->update_viewport();
123 display->set_viewport(NULL);
124 return(true);
127 enum yesno_res gui_syncyesno_run(const struct text_message * main_message,
128 const struct text_message * yes_message,
129 const struct text_message * no_message)
131 int i;
132 unsigned button;
133 int result=-1;
134 bool result_displayed;
135 struct gui_yesno yn[NB_SCREENS];
136 struct viewport vp[NB_SCREENS];
137 long talked_tick = 0;
138 FOR_NB_SCREENS(i)
140 yn[i].main_message=main_message;
141 yn[i].result_message[YESNO_YES]=yes_message;
142 yn[i].result_message[YESNO_NO]=no_message;
143 yn[i].display=&screens[i];
144 yn[i].vp = &vp[i];
145 viewport_set_defaults(yn[i].vp, i);
146 gui_yesno_draw(&(yn[i]));
148 while (result==-1)
150 /* Repeat the question every 5secs (more or less) */
151 if (global_settings.talk_menu
152 && (talked_tick==0 || TIME_AFTER(current_tick, talked_tick+HZ*5)))
154 talked_tick = current_tick;
155 talk_text_message(main_message, false);
157 button = get_action(CONTEXT_YESNOSCREEN, HZ*5);
158 switch (button)
160 case ACTION_YESNO_ACCEPT:
161 result=YESNO_YES;
162 break;
163 case ACTION_NONE:
164 case SYS_CHARGER_DISCONNECTED:
165 /* ignore some SYS events that can happen */
166 continue;
167 default:
168 if(default_event_handler(button) == SYS_USB_CONNECTED)
169 return(YESNO_USB);
170 result = YESNO_NO;
174 FOR_NB_SCREENS(i)
175 result_displayed=gui_yesno_draw_result(&(yn[i]), result);
177 if (global_settings.talk_menu)
179 talk_text_message((result == YESNO_YES) ? yes_message
180 : no_message, false);
181 talk_force_enqueue_next();
183 if(result_displayed)
184 sleep(HZ);
185 return(result);