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