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
;
40 static void talk_text_message(const struct text_message
* message
, bool enqueue
)
45 for(line
=0; line
<message
->nb_lines
; line
++)
47 long id
= P2ID((unsigned char *)message
->message_lines
[line
]);
57 static int put_message(struct screen
*display
,
58 const struct text_message
* message
,
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
]));
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
)
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
)
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
));
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 :
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
;
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
);
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
)
134 bool result_displayed
;
135 struct gui_yesno yn
[NB_SCREENS
];
136 struct viewport vp
[NB_SCREENS
];
137 long talked_tick
= 0;
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
];
145 viewport_set_defaults(yn
[i
].vp
, i
);
146 gui_yesno_draw(&(yn
[i
]));
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);
160 case ACTION_YESNO_ACCEPT
:
164 case SYS_CHARGER_DISCONNECTED
:
165 /* ignore some SYS events that can happen */
168 if(default_event_handler(button
) == SYS_USB_CONNECTED
)
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();