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 LOAD CONFIG MENU
27 
28 =============================================================================
29 */
30 
31 #include "ui_local.h"
32 
33 
34 #define ART_BACK0			"menu/art/back_0"
35 #define ART_BACK1			"menu/art/back_1"
36 #define ART_FIGHT0			"menu/art/load_0"
37 #define ART_FIGHT1			"menu/art/load_1"
38 #define ART_FRAMEL			"menu/art/frame2_l"
39 #define ART_FRAMER			"menu/art/frame1_r"
40 #define ART_ARROWS			"menu/art/arrows_horz_0"
41 #define ART_ARROWLEFT		"menu/art/arrows_horz_left"
42 #define ART_ARROWRIGHT		"menu/art/arrows_horz_right"
43 
44 #define MAX_CONFIGS			128
45 #define NAMEBUFSIZE			( MAX_CONFIGS * 16 )
46 
47 #define ID_BACK				10
48 #define ID_GO				11
49 #define ID_LIST				12
50 #define ID_LEFT				13
51 #define ID_RIGHT			14
52 
53 #define ARROWS_WIDTH		128
54 #define ARROWS_HEIGHT		48
55 
56 
57 typedef struct {
58 	menuframework_s	menu;
59 
60 	menutext_s		banner;
61 	menubitmap_s	framel;
62 	menubitmap_s	framer;
63 
64 	menulist_s		list;
65 
66 	menubitmap_s	arrows;
67 	menubitmap_s	left;
68 	menubitmap_s	right;
69 	menubitmap_s	back;
70 	menubitmap_s	go;
71 
72 	char			names[NAMEBUFSIZE];
73 	char*			configlist[MAX_CONFIGS];
74 } configs_t;
75 
76 static configs_t	s_configs;
77 
78 
79 /*
80 ===============
81 LoadConfig_MenuEvent
82 ===============
83 */
LoadConfig_MenuEvent(void * ptr,int event)84 static void LoadConfig_MenuEvent( void *ptr, int event ) {
85 	if( event != QM_ACTIVATED ) {
86 		return;
87 	}
88 
89 	switch ( ((menucommon_s*)ptr)->id ) {
90 	case ID_GO:
91 		trap_Cmd_ExecuteText( EXEC_APPEND, va( "exec %s\n", s_configs.list.itemnames[s_configs.list.curvalue] ) );
92 		UI_PopMenu();
93 		break;
94 
95 	case ID_BACK:
96 		UI_PopMenu();
97 		break;
98 
99 	case ID_LEFT:
100 		ScrollList_Key( &s_configs.list, K_LEFTARROW );
101 		break;
102 
103 	case ID_RIGHT:
104 		ScrollList_Key( &s_configs.list, K_RIGHTARROW );
105 		break;
106 	}
107 }
108 
109 
110 /*
111 ===============
112 LoadConfig_MenuInit
113 ===============
114 */
LoadConfig_MenuInit(void)115 static void LoadConfig_MenuInit( void ) {
116 	int		i;
117 	int		len;
118 	char	*configname;
119 
120 	UI_LoadConfig_Cache();
121 
122 	memset( &s_configs, 0 ,sizeof(configs_t) );
123 	s_configs.menu.wrapAround = qtrue;
124 	s_configs.menu.fullscreen = qtrue;
125 
126 	s_configs.banner.generic.type	= MTYPE_BTEXT;
127 	s_configs.banner.generic.x		= 320;
128 	s_configs.banner.generic.y		= 16;
129 	s_configs.banner.string			= "LOAD CONFIG";
130 	s_configs.banner.color			= color_white;
131 	s_configs.banner.style			= UI_CENTER;
132 
133 	s_configs.framel.generic.type	= MTYPE_BITMAP;
134 	s_configs.framel.generic.name	= ART_FRAMEL;
135 	s_configs.framel.generic.flags	= QMF_INACTIVE;
136 	s_configs.framel.generic.x		= 0;
137 	s_configs.framel.generic.y		= 78;
138 	s_configs.framel.width			= 256;
139 	s_configs.framel.height			= 329;
140 
141 	s_configs.framer.generic.type	= MTYPE_BITMAP;
142 	s_configs.framer.generic.name	= ART_FRAMER;
143 	s_configs.framer.generic.flags	= QMF_INACTIVE;
144 	s_configs.framer.generic.x		= 376;
145 	s_configs.framer.generic.y		= 76;
146 	s_configs.framer.width			= 256;
147 	s_configs.framer.height			= 334;
148 
149 	s_configs.arrows.generic.type	= MTYPE_BITMAP;
150 	s_configs.arrows.generic.name	= ART_ARROWS;
151 	s_configs.arrows.generic.flags	= QMF_INACTIVE;
152 	s_configs.arrows.generic.x		= 320-ARROWS_WIDTH/2;
153 	s_configs.arrows.generic.y		= 400;
154 	s_configs.arrows.width			= ARROWS_WIDTH;
155 	s_configs.arrows.height			= ARROWS_HEIGHT;
156 
157 	s_configs.left.generic.type		= MTYPE_BITMAP;
158 	s_configs.left.generic.flags	= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY;
159 	s_configs.left.generic.x		= 320-ARROWS_WIDTH/2;
160 	s_configs.left.generic.y		= 400;
161 	s_configs.left.generic.id		= ID_LEFT;
162 	s_configs.left.generic.callback	= LoadConfig_MenuEvent;
163 	s_configs.left.width			= ARROWS_WIDTH/2;
164 	s_configs.left.height			= ARROWS_HEIGHT;
165 	s_configs.left.focuspic			= ART_ARROWLEFT;
166 
167 	s_configs.right.generic.type	= MTYPE_BITMAP;
168 	s_configs.right.generic.flags	= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY;
169 	s_configs.right.generic.x		= 320;
170 	s_configs.right.generic.y		= 400;
171 	s_configs.right.generic.id		= ID_RIGHT;
172 	s_configs.right.generic.callback = LoadConfig_MenuEvent;
173 	s_configs.right.width			= ARROWS_WIDTH/2;
174 	s_configs.right.height			= ARROWS_HEIGHT;
175 	s_configs.right.focuspic		= ART_ARROWRIGHT;
176 
177 	s_configs.back.generic.type		= MTYPE_BITMAP;
178 	s_configs.back.generic.name		= ART_BACK0;
179 	s_configs.back.generic.flags	= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
180 	s_configs.back.generic.id		= ID_BACK;
181 	s_configs.back.generic.callback	= LoadConfig_MenuEvent;
182 	s_configs.back.generic.x		= 0;
183 	s_configs.back.generic.y		= 480-64;
184 	s_configs.back.width			= 128;
185 	s_configs.back.height			= 64;
186 	s_configs.back.focuspic			= ART_BACK1;
187 
188 	s_configs.go.generic.type		= MTYPE_BITMAP;
189 	s_configs.go.generic.name		= ART_FIGHT0;
190 	s_configs.go.generic.flags		= QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
191 	s_configs.go.generic.id			= ID_GO;
192 	s_configs.go.generic.callback	= LoadConfig_MenuEvent;
193 	s_configs.go.generic.x			= 640;
194 	s_configs.go.generic.y			= 480-64;
195 	s_configs.go.width				= 128;
196 	s_configs.go.height				= 64;
197 	s_configs.go.focuspic			= ART_FIGHT1;
198 
199 	// scan for configs
200 	s_configs.list.generic.type		= MTYPE_SCROLLLIST;
201 	s_configs.list.generic.flags	= QMF_PULSEIFFOCUS;
202 	s_configs.list.generic.callback	= LoadConfig_MenuEvent;
203 	s_configs.list.generic.id		= ID_LIST;
204 	s_configs.list.generic.x		= 118;
205 	s_configs.list.generic.y		= 130;
206 	s_configs.list.width			= 16;
207 	s_configs.list.height			= 14;
208 	s_configs.list.numitems			= trap_FS_GetFileList( "", "cfg", s_configs.names, NAMEBUFSIZE );
209 	s_configs.list.itemnames		= (const char **)s_configs.configlist;
210 	s_configs.list.columns			= 3;
211 
212 	if (!s_configs.list.numitems) {
213 		strcpy(s_configs.names,"No Files Found.");
214 		s_configs.list.numitems = 1;
215 
216 		//degenerate case, not selectable
217 		s_configs.go.generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
218 	}
219 	else if (s_configs.list.numitems > MAX_CONFIGS)
220 		s_configs.list.numitems = MAX_CONFIGS;
221 
222 	configname = s_configs.names;
223 	for ( i = 0; i < s_configs.list.numitems; i++ ) {
224 		s_configs.list.itemnames[i] = configname;
225 
226 		// strip extension
227 		len = strlen( configname );
228 		if (!Q_stricmp(configname +  len - 4,".cfg"))
229 			configname[len-4] = '\0';
230 
231 		Q_strupr(configname);
232 
233 		configname += len + 1;
234 	}
235 
236 	Menu_AddItem( &s_configs.menu, &s_configs.banner );
237 	Menu_AddItem( &s_configs.menu, &s_configs.framel );
238 	Menu_AddItem( &s_configs.menu, &s_configs.framer );
239 	Menu_AddItem( &s_configs.menu, &s_configs.list );
240 	Menu_AddItem( &s_configs.menu, &s_configs.arrows );
241 	Menu_AddItem( &s_configs.menu, &s_configs.left );
242 	Menu_AddItem( &s_configs.menu, &s_configs.right );
243 	Menu_AddItem( &s_configs.menu, &s_configs.back );
244 	Menu_AddItem( &s_configs.menu, &s_configs.go );
245 }
246 
247 /*
248 =================
249 UI_LoadConfig_Cache
250 =================
251 */
UI_LoadConfig_Cache(void)252 void UI_LoadConfig_Cache( void ) {
253 	trap_R_RegisterShaderNoMip( ART_BACK0 );
254 	trap_R_RegisterShaderNoMip( ART_BACK1 );
255 	trap_R_RegisterShaderNoMip( ART_FIGHT0 );
256 	trap_R_RegisterShaderNoMip( ART_FIGHT1 );
257 	trap_R_RegisterShaderNoMip( ART_FRAMEL );
258 	trap_R_RegisterShaderNoMip( ART_FRAMER );
259 	trap_R_RegisterShaderNoMip( ART_ARROWS );
260 	trap_R_RegisterShaderNoMip( ART_ARROWLEFT );
261 	trap_R_RegisterShaderNoMip( ART_ARROWRIGHT );
262 }
263 
264 
265 /*
266 ===============
267 UI_LoadConfigMenu
268 ===============
269 */
UI_LoadConfigMenu(void)270 void UI_LoadConfigMenu( void ) {
271 	LoadConfig_MenuInit();
272 	UI_PushMenu( &s_configs.menu );
273 }
274 
275