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