Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

ui_loadconfig.c (8025B)


      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 Foobar; 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 */
     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 */
    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 */
    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 */
    270 void UI_LoadConfigMenu( void ) {
    271 	LoadConfig_MenuInit();
    272 	UI_PushMenu( &s_configs.menu );
    273 }
    274