1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
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 ****************************************************************************/
33 const struct text_message
* main_message
;
34 const struct text_message
* result_message
[2];
37 struct screen
* display
;
39 static int put_message(struct screen
*display
,
40 const struct text_message
* message
,
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
]));
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
)
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
)
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
));
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 :
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
;
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
);
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
)
116 bool result_displayed
;
117 struct gui_yesno yn
[NB_SCREENS
];
118 struct viewport vp
[NB_SCREENS
];
119 long talked_tick
= 0;
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
];
127 viewport_set_defaults(yn
[i
].vp
, i
);
128 gui_yesno_draw(&(yn
[i
]));
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);
142 case ACTION_YESNO_ACCEPT
:
146 case SYS_CHARGER_DISCONNECTED
:
147 /* ignore some SYS events that can happen */
150 if(default_event_handler(button
) == SYS_USB_CONNECTED
)
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();