1 /*
2 ===========================================================================
3 Copyright (C) 1999-2005 Id Software, Inc.
4
5 This file is part of Quake III Arena source code.
6
7 Quake III Arena source code is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
11
12 Quake III Arena source code is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Quake III Arena source code; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 ===========================================================================
21 */
22 //
23 /*
24 =======================================================================
25
26 CONFIRMATION MENU
27
28 =======================================================================
29 */
30
31
32 #include "ui_local.h"
33
34
35 #define ART_CONFIRM_FRAME "menu/art/cut_frame"
36
37 #define ID_CONFIRM_NO 10
38 #define ID_CONFIRM_YES 11
39
40
41 typedef struct {
42 menuframework_s menu;
43
44 menutext_s no;
45 menutext_s yes;
46
47 int slashX;
48 const char * question;
49 void (*draw)( void );
50 void (*action)( qboolean result );
51
52 int style;
53 const char **lines;
54 } confirmMenu_t;
55
56
57 static confirmMenu_t s_confirm;
58
59
60 /*
61 =================
62 ConfirmMenu_Event
63 =================
64 */
ConfirmMenu_Event(void * ptr,int event)65 static void ConfirmMenu_Event( void* ptr, int event ) {
66 qboolean result;
67
68 if( event != QM_ACTIVATED ) {
69 return;
70 }
71
72 UI_PopMenu();
73
74 if( ((menucommon_s*)ptr)->id == ID_CONFIRM_NO ) {
75 result = qfalse;
76 }
77 else {
78 result = qtrue;
79 }
80
81 if( s_confirm.action ) {
82 s_confirm.action( result );
83 }
84 }
85
86
87 /*
88 =================
89 ConfirmMenu_Key
90 =================
91 */
ConfirmMenu_Key(int key)92 static sfxHandle_t ConfirmMenu_Key( int key ) {
93 switch ( key ) {
94 case K_KP_LEFTARROW:
95 case K_LEFTARROW:
96 case K_KP_RIGHTARROW:
97 case K_RIGHTARROW:
98 key = K_TAB;
99 break;
100
101 case 'n':
102 case 'N':
103 ConfirmMenu_Event( &s_confirm.no, QM_ACTIVATED );
104 break;
105
106 case 'y':
107 case 'Y':
108 ConfirmMenu_Event( &s_confirm.yes, QM_ACTIVATED );
109 break;
110 }
111
112 return Menu_DefaultKey( &s_confirm.menu, key );
113 }
114
115
116 /*
117 =================
118 MessaheMenu_Draw
119 =================
120 */
MessageMenu_Draw(void)121 static void MessageMenu_Draw( void ) {
122 int i,y;
123
124 UI_DrawNamedPic( 142, 118, 359, 256, ART_CONFIRM_FRAME );
125
126 y = 188;
127 for(i=0; s_confirm.lines[i]; i++)
128 {
129 UI_DrawProportionalString( 320, y, s_confirm.lines[i], s_confirm.style, color_red );
130 y += 18;
131 }
132
133 Menu_Draw( &s_confirm.menu );
134
135 if( s_confirm.draw ) {
136 s_confirm.draw();
137 }
138 }
139
140 /*
141 =================
142 ConfirmMenu_Draw
143 =================
144 */
ConfirmMenu_Draw(void)145 static void ConfirmMenu_Draw( void ) {
146 UI_DrawNamedPic( 142, 118, 359, 256, ART_CONFIRM_FRAME );
147 UI_DrawProportionalString( 320, 204, s_confirm.question, s_confirm.style, color_red );
148 UI_DrawProportionalString( s_confirm.slashX, 265, "/", UI_LEFT|UI_INVERSE, color_red );
149
150 Menu_Draw( &s_confirm.menu );
151
152 if( s_confirm.draw ) {
153 s_confirm.draw();
154 }
155 }
156
157
158 /*
159 =================
160 ConfirmMenu_Cache
161 =================
162 */
ConfirmMenu_Cache(void)163 void ConfirmMenu_Cache( void ) {
164 trap_R_RegisterShaderNoMip( ART_CONFIRM_FRAME );
165 }
166
167
168 /*
169 =================
170 UI_ConfirmMenu_Stlye
171 =================
172 */
UI_ConfirmMenu_Style(const char * question,int style,void (* draw)(void),void (* action)(qboolean result))173 void UI_ConfirmMenu_Style( const char *question, int style, void (*draw)( void ), void (*action)( qboolean result ) ) {
174 uiClientState_t cstate;
175 int n1, n2, n3;
176 int l1, l2, l3;
177
178 // zero set all our globals
179 memset( &s_confirm, 0, sizeof(s_confirm) );
180
181 ConfirmMenu_Cache();
182
183 n1 = UI_ProportionalStringWidth( "YES/NO" );
184 n2 = UI_ProportionalStringWidth( "YES" ) + PROP_GAP_WIDTH;
185 n3 = UI_ProportionalStringWidth( "/" ) + PROP_GAP_WIDTH;
186 l1 = 320 - ( n1 / 2 );
187 l2 = l1 + n2;
188 l3 = l2 + n3;
189 s_confirm.slashX = l2;
190
191 s_confirm.question = question;
192 s_confirm.draw = draw;
193 s_confirm.action = action;
194 s_confirm.style = style;
195
196 s_confirm.menu.draw = ConfirmMenu_Draw;
197 s_confirm.menu.key = ConfirmMenu_Key;
198 s_confirm.menu.wrapAround = qtrue;
199
200 trap_GetClientState( &cstate );
201 if ( cstate.connState >= CA_CONNECTED ) {
202 s_confirm.menu.fullscreen = qfalse;
203 }
204 else {
205 s_confirm.menu.fullscreen = qtrue;
206 }
207
208 s_confirm.yes.generic.type = MTYPE_PTEXT;
209 s_confirm.yes.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
210 s_confirm.yes.generic.callback = ConfirmMenu_Event;
211 s_confirm.yes.generic.id = ID_CONFIRM_YES;
212 s_confirm.yes.generic.x = l1;
213 s_confirm.yes.generic.y = 264;
214 s_confirm.yes.string = "YES";
215 s_confirm.yes.color = color_red;
216 s_confirm.yes.style = UI_LEFT;
217
218 s_confirm.no.generic.type = MTYPE_PTEXT;
219 s_confirm.no.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
220 s_confirm.no.generic.callback = ConfirmMenu_Event;
221 s_confirm.no.generic.id = ID_CONFIRM_NO;
222 s_confirm.no.generic.x = l3;
223 s_confirm.no.generic.y = 264;
224 s_confirm.no.string = "NO";
225 s_confirm.no.color = color_red;
226 s_confirm.no.style = UI_LEFT;
227
228 Menu_AddItem( &s_confirm.menu, &s_confirm.yes );
229 Menu_AddItem( &s_confirm.menu, &s_confirm.no );
230
231 UI_PushMenu( &s_confirm.menu );
232
233 Menu_SetCursorToItem( &s_confirm.menu, &s_confirm.no );
234 }
235
236 /*
237 =================
238 UI_ConfirmMenu
239 =================
240 */
UI_ConfirmMenu(const char * question,void (* draw)(void),void (* action)(qboolean result))241 void UI_ConfirmMenu( const char *question, void (*draw)( void ), void (*action)( qboolean result ) ) {
242 UI_ConfirmMenu_Style(question, UI_CENTER|UI_INVERSE, draw, action);
243 }
244
245 /*
246 =================
247 UI_Message
248 hacked over from Confirm stuff
249 =================
250 */
UI_Message(const char ** lines)251 void UI_Message( const char **lines ) {
252 uiClientState_t cstate;
253 int n1, l1;
254
255 // zero set all our globals
256 memset( &s_confirm, 0, sizeof(s_confirm) );
257
258 ConfirmMenu_Cache();
259
260 n1 = UI_ProportionalStringWidth( "OK" );
261 l1 = 320 - ( n1 / 2 );
262
263 s_confirm.lines = lines;
264 s_confirm.style = UI_CENTER|UI_INVERSE|UI_SMALLFONT;
265
266 s_confirm.menu.draw = MessageMenu_Draw;
267 s_confirm.menu.key = ConfirmMenu_Key;
268 s_confirm.menu.wrapAround = qtrue;
269
270 trap_GetClientState( &cstate );
271 if ( cstate.connState >= CA_CONNECTED ) {
272 s_confirm.menu.fullscreen = qfalse;
273 }
274 else {
275 s_confirm.menu.fullscreen = qtrue;
276 }
277
278 s_confirm.yes.generic.type = MTYPE_PTEXT;
279 s_confirm.yes.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
280 s_confirm.yes.generic.callback = ConfirmMenu_Event;
281 s_confirm.yes.generic.id = ID_CONFIRM_YES;
282 s_confirm.yes.generic.x = l1;
283 s_confirm.yes.generic.y = 280;
284 s_confirm.yes.string = "OK";
285 s_confirm.yes.color = color_red;
286 s_confirm.yes.style = UI_LEFT;
287
288 Menu_AddItem( &s_confirm.menu, &s_confirm.yes );
289
290 UI_PushMenu( &s_confirm.menu );
291
292 Menu_SetCursorToItem( &s_confirm.menu, &s_confirm.yes );
293 }
294