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