diff options
Diffstat (limited to 'apps/gui/yesno.c')
-rw-r--r-- | apps/gui/yesno.c | 96 |
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 | */ | ||
35 | static 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 | /* | 31 | struct gui_yesno |
47 | * Attach the yesno to a screen | ||
48 | * - yn : the yesno structure | ||
49 | * - display : the screen to attach | ||
50 | */ | ||
51 | static 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 | }; | ||
39 | static 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, | |||
61 | static void gui_yesno_draw(struct gui_yesno * yn) | 56 | static 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) | |||
93 | static bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result) | 95 | static 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 | |||
104 | enum yesno_res gui_syncyesno_run(const struct text_message * main_message, | 111 | enum 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) |