summaryrefslogtreecommitdiff
path: root/apps/gui/yesno.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/yesno.c')
-rw-r--r--apps/gui/yesno.c96
1 files changed, 54 insertions, 42 deletions
diff --git a/apps/gui/yesno.c b/apps/gui/yesno.c
index 51a1eabd60..65dd9651d2 100644
--- a/apps/gui/yesno.c
+++ b/apps/gui/yesno.c
@@ -24,36 +24,31 @@
24#include "lang.h" 24#include "lang.h"
25#include "action.h" 25#include "action.h"
26#include "talk.h" 26#include "talk.h"
27#include "textarea.h"
28#include "viewport.h"
27 29
28/*
29 * Initializes the yesno asker
30 * - yn : the yesno structure
31 * - main_message : the question the user has to answer
32 * - yes_message : message displayed if answer is 'yes'
33 * - no_message : message displayed if answer is 'no'
34 */
35static void gui_yesno_init(struct gui_yesno * yn,
36 const struct text_message * main_message,
37 const struct text_message * yes_message,
38 const struct text_message * no_message)
39{
40 yn->main_message=main_message;
41 yn->result_message[YESNO_YES]=yes_message;
42 yn->result_message[YESNO_NO]=no_message;
43 yn->display=0;
44}
45 30
46/* 31struct gui_yesno
47 * Attach the yesno to a screen
48 * - yn : the yesno structure
49 * - display : the screen to attach
50 */
51static void gui_yesno_set_display(struct gui_yesno * yn,
52 struct screen * display)
53{ 32{
54 yn->display=display; 33 const struct text_message * main_message;
34 const struct text_message * result_message[2];
35
36 struct viewport *vp;
37 struct screen * display;
38};
39static int put_message(struct screen *display,
40 const struct text_message * message,
41 int start, int max_y)
42{
43 int i;
44 for(i=0; i<message->nb_lines && i+start<max_y; i++)
45 {
46 display->puts_scroll(0, i+start,
47 P2STR((unsigned char *)message->message_lines[i]));
48 }
49 return i;
55} 50}
56 51
57/* 52/*
58 * Draws the yesno 53 * Draws the yesno
59 * - yn : the yesno structure 54 * - yn : the yesno structure
@@ -61,26 +56,33 @@ static void gui_yesno_set_display(struct gui_yesno * yn,
61static void gui_yesno_draw(struct gui_yesno * yn) 56static void gui_yesno_draw(struct gui_yesno * yn)
62{ 57{
63 struct screen * display=yn->display; 58 struct screen * display=yn->display;
64 int nb_lines, line_shift=0; 59 struct viewport *vp = yn->vp;
60 int nb_lines, vp_lines, line_shift=0;
65 61
66 gui_textarea_clear(display); 62 display->set_viewport(vp);
67 nb_lines=yn->main_message->nb_lines; 63 display->clear_viewport();
64 display->stop_scroll();
65 nb_lines = yn->main_message->nb_lines;
66 vp_lines = viewport_get_nb_lines(vp);
68 67
69 if(nb_lines+3<display->nb_lines) 68 if(nb_lines+3< vp_lines)
70 line_shift=1; 69 line_shift=1;
71 nb_lines=gui_textarea_put_message(display, yn->main_message, line_shift); 70
71 line_shift += put_message(display, yn->main_message,
72 line_shift, vp_lines);
72 73
73 /* Space remaining for yes / no text ? */ 74 /* Space remaining for yes / no text ? */
74 if(nb_lines+line_shift+2<=display->nb_lines) 75 if(line_shift+2 <= vp_lines)
75 { 76 {
76 if(nb_lines+line_shift+3<=display->nb_lines) 77 if(line_shift+3 <= vp_lines)
77 nb_lines++; 78 line_shift++;
78 display->puts(0, nb_lines+line_shift, str(LANG_CONFIRM_WITH_BUTTON)); 79 display->puts(0, line_shift, str(LANG_CONFIRM_WITH_BUTTON));
79#ifdef HAVE_LCD_BITMAP 80#ifdef HAVE_LCD_BITMAP
80 display->puts(0, nb_lines+line_shift+1, str(LANG_CANCEL_WITH_ANY)); 81 display->puts(0, line_shift+1, str(LANG_CANCEL_WITH_ANY));
81#endif 82#endif
82 } 83 }
83 gui_textarea_update(display); 84 display->update_viewport();
85 display->set_viewport(NULL);
84} 86}
85 87
86/* 88/*
@@ -93,14 +95,19 @@ static void gui_yesno_draw(struct gui_yesno * yn)
93static bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result) 95static bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result)
94{ 96{
95 const struct text_message * message=yn->result_message[result]; 97 const struct text_message * message=yn->result_message[result];
98 struct viewport *vp = yn->vp;
99 struct screen * display=yn->display;
96 if(message==NULL) 100 if(message==NULL)
97 return false; 101 return false;
98 gui_textarea_put_message(yn->display, message, 0); 102 display->set_viewport(vp);
103 display->clear_viewport();
104 display->stop_scroll();
105 put_message(yn->display, message, 0, viewport_get_nb_lines(vp));
106 display->update_viewport();
107 display->set_viewport(NULL);
99 return(true); 108 return(true);
100} 109}
101 110
102#include "debug.h"
103
104enum yesno_res gui_syncyesno_run(const struct text_message * main_message, 111enum yesno_res gui_syncyesno_run(const struct text_message * main_message,
105 const struct text_message * yes_message, 112 const struct text_message * yes_message,
106 const struct text_message * no_message) 113 const struct text_message * no_message)
@@ -110,11 +117,16 @@ enum yesno_res gui_syncyesno_run(const struct text_message * main_message,
110 int result=-1; 117 int result=-1;
111 bool result_displayed; 118 bool result_displayed;
112 struct gui_yesno yn[NB_SCREENS]; 119 struct gui_yesno yn[NB_SCREENS];
120 struct viewport vp[NB_SCREENS];
113 long talked_tick = 0; 121 long talked_tick = 0;
114 FOR_NB_SCREENS(i) 122 FOR_NB_SCREENS(i)
115 { 123 {
116 gui_yesno_init(&(yn[i]), main_message, yes_message, no_message); 124 yn[i].main_message=main_message;
117 gui_yesno_set_display(&(yn[i]), &(screens[i])); 125 yn[i].result_message[YESNO_YES]=yes_message;
126 yn[i].result_message[YESNO_NO]=no_message;
127 yn[i].display=&screens[i];
128 yn[i].vp = &vp[i];
129 viewport_set_defaults(yn[i].vp, i);
118 gui_yesno_draw(&(yn[i])); 130 gui_yesno_draw(&(yn[i]));
119 } 131 }
120 while (result==-1) 132 while (result==-1)