00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "ui_local.h"
00033
00034
00035 #define ART_BACK0 "menu/art/back_0"
00036 #define ART_BACK1 "menu/art/back_1"
00037 #define ART_GO0 "menu/art/play_0"
00038 #define ART_GO1 "menu/art/play_1"
00039 #define ART_FRAMEL "menu/art/frame2_l"
00040 #define ART_FRAMER "menu/art/frame1_r"
00041 #define ART_ARROWS "menu/art/arrows_horz_0"
00042 #define ART_ARROWLEFT "menu/art/arrows_horz_left"
00043 #define ART_ARROWRIGHT "menu/art/arrows_horz_right"
00044
00045 #define MAX_DEMOS 128
00046 #define NAMEBUFSIZE ( MAX_DEMOS * 16 )
00047
00048 #define ID_BACK 10
00049 #define ID_GO 11
00050 #define ID_LIST 12
00051 #define ID_RIGHT 13
00052 #define ID_LEFT 14
00053
00054 #define ARROWS_WIDTH 128
00055 #define ARROWS_HEIGHT 48
00056
00057
00058 typedef struct {
00059 menuframework_s menu;
00060
00061 menutext_s banner;
00062 menubitmap_s framel;
00063 menubitmap_s framer;
00064
00065 menulist_s list;
00066
00067 menubitmap_s arrows;
00068 menubitmap_s left;
00069 menubitmap_s right;
00070 menubitmap_s back;
00071 menubitmap_s go;
00072
00073 int numDemos;
00074 char names[NAMEBUFSIZE];
00075 char *demolist[MAX_DEMOS];
00076 } demos_t;
00077
00078 static demos_t s_demos;
00079
00080
00081
00082
00083
00084
00085
00086 static void Demos_MenuEvent( void *ptr, int event ) {
00087 if( event != QM_ACTIVATED ) {
00088 return;
00089 }
00090
00091 switch( ((menucommon_s*)ptr)->id ) {
00092 case ID_GO:
00093 UI_ForceMenuOff ();
00094 trap_Cmd_ExecuteText( EXEC_APPEND, va( "demo %s\n",
00095 s_demos.list.itemnames[s_demos.list.curvalue]) );
00096 break;
00097
00098 case ID_BACK:
00099 UI_PopMenu();
00100 break;
00101
00102 case ID_LEFT:
00103 ScrollList_Key( &s_demos.list, K_LEFTARROW );
00104 break;
00105
00106 case ID_RIGHT:
00107 ScrollList_Key( &s_demos.list, K_RIGHTARROW );
00108 break;
00109 }
00110 }
00111
00112
00113
00114
00115
00116
00117
00118 static sfxHandle_t UI_DemosMenu_Key( int key ) {
00119 menucommon_s *item;
00120
00121 item = Menu_ItemAtCursor( &s_demos.menu );
00122
00123 return Menu_DefaultKey( &s_demos.menu, key );
00124 }
00125
00126
00127
00128
00129
00130
00131
00132 static void Demos_MenuInit( void ) {
00133 int i;
00134 int len;
00135 char *demoname, extension[32];
00136
00137 memset( &s_demos, 0 ,sizeof(demos_t) );
00138 s_demos.menu.key = UI_DemosMenu_Key;
00139
00140 Demos_Cache();
00141
00142 s_demos.menu.fullscreen = qtrue;
00143 s_demos.menu.wrapAround = qtrue;
00144
00145 s_demos.banner.generic.type = MTYPE_BTEXT;
00146 s_demos.banner.generic.x = 320;
00147 s_demos.banner.generic.y = 16;
00148 s_demos.banner.string = "DEMOS";
00149 s_demos.banner.color = color_white;
00150 s_demos.banner.style = UI_CENTER;
00151
00152 s_demos.framel.generic.type = MTYPE_BITMAP;
00153 s_demos.framel.generic.name = ART_FRAMEL;
00154 s_demos.framel.generic.flags = QMF_INACTIVE;
00155 s_demos.framel.generic.x = 0;
00156 s_demos.framel.generic.y = 78;
00157 s_demos.framel.width = 256;
00158 s_demos.framel.height = 329;
00159
00160 s_demos.framer.generic.type = MTYPE_BITMAP;
00161 s_demos.framer.generic.name = ART_FRAMER;
00162 s_demos.framer.generic.flags = QMF_INACTIVE;
00163 s_demos.framer.generic.x = 376;
00164 s_demos.framer.generic.y = 76;
00165 s_demos.framer.width = 256;
00166 s_demos.framer.height = 334;
00167
00168 s_demos.arrows.generic.type = MTYPE_BITMAP;
00169 s_demos.arrows.generic.name = ART_ARROWS;
00170 s_demos.arrows.generic.flags = QMF_INACTIVE;
00171 s_demos.arrows.generic.x = 320-ARROWS_WIDTH/2;
00172 s_demos.arrows.generic.y = 400;
00173 s_demos.arrows.width = ARROWS_WIDTH;
00174 s_demos.arrows.height = ARROWS_HEIGHT;
00175
00176 s_demos.left.generic.type = MTYPE_BITMAP;
00177 s_demos.left.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY;
00178 s_demos.left.generic.x = 320-ARROWS_WIDTH/2;
00179 s_demos.left.generic.y = 400;
00180 s_demos.left.generic.id = ID_LEFT;
00181 s_demos.left.generic.callback = Demos_MenuEvent;
00182 s_demos.left.width = ARROWS_WIDTH/2;
00183 s_demos.left.height = ARROWS_HEIGHT;
00184 s_demos.left.focuspic = ART_ARROWLEFT;
00185
00186 s_demos.right.generic.type = MTYPE_BITMAP;
00187 s_demos.right.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY;
00188 s_demos.right.generic.x = 320;
00189 s_demos.right.generic.y = 400;
00190 s_demos.right.generic.id = ID_RIGHT;
00191 s_demos.right.generic.callback = Demos_MenuEvent;
00192 s_demos.right.width = ARROWS_WIDTH/2;
00193 s_demos.right.height = ARROWS_HEIGHT;
00194 s_demos.right.focuspic = ART_ARROWRIGHT;
00195
00196 s_demos.back.generic.type = MTYPE_BITMAP;
00197 s_demos.back.generic.name = ART_BACK0;
00198 s_demos.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
00199 s_demos.back.generic.id = ID_BACK;
00200 s_demos.back.generic.callback = Demos_MenuEvent;
00201 s_demos.back.generic.x = 0;
00202 s_demos.back.generic.y = 480-64;
00203 s_demos.back.width = 128;
00204 s_demos.back.height = 64;
00205 s_demos.back.focuspic = ART_BACK1;
00206
00207 s_demos.go.generic.type = MTYPE_BITMAP;
00208 s_demos.go.generic.name = ART_GO0;
00209 s_demos.go.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
00210 s_demos.go.generic.id = ID_GO;
00211 s_demos.go.generic.callback = Demos_MenuEvent;
00212 s_demos.go.generic.x = 640;
00213 s_demos.go.generic.y = 480-64;
00214 s_demos.go.width = 128;
00215 s_demos.go.height = 64;
00216 s_demos.go.focuspic = ART_GO1;
00217
00218 s_demos.list.generic.type = MTYPE_SCROLLLIST;
00219 s_demos.list.generic.flags = QMF_PULSEIFFOCUS;
00220 s_demos.list.generic.callback = Demos_MenuEvent;
00221 s_demos.list.generic.id = ID_LIST;
00222 s_demos.list.generic.x = 118;
00223 s_demos.list.generic.y = 130;
00224 s_demos.list.width = 16;
00225 s_demos.list.height = 14;
00226 Com_sprintf(extension, sizeof(extension), "dm_%d", (int)trap_Cvar_VariableValue( "protocol" ) );
00227 s_demos.list.numitems = trap_FS_GetFileList( "demos", extension, s_demos.names, NAMEBUFSIZE );
00228 s_demos.list.itemnames = (const char **)s_demos.demolist;
00229 s_demos.list.columns = 3;
00230
00231 if (!s_demos.list.numitems) {
00232 strcpy( s_demos.names, "No Demos Found." );
00233 s_demos.list.numitems = 1;
00234
00235
00236 s_demos.go.generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
00237 }
00238 else if (s_demos.list.numitems > MAX_DEMOS)
00239 s_demos.list.numitems = MAX_DEMOS;
00240
00241 demoname = s_demos.names;
00242 for ( i = 0; i < s_demos.list.numitems; i++ ) {
00243 s_demos.list.itemnames[i] = demoname;
00244
00245
00246 len = strlen( demoname );
00247 if (!Q_stricmp(demoname + len - 4,".dm3"))
00248 demoname[len-4] = '\0';
00249
00250 Q_strupr(demoname);
00251
00252 demoname += len + 1;
00253 }
00254
00255 Menu_AddItem( &s_demos.menu, &s_demos.banner );
00256 Menu_AddItem( &s_demos.menu, &s_demos.framel );
00257 Menu_AddItem( &s_demos.menu, &s_demos.framer );
00258 Menu_AddItem( &s_demos.menu, &s_demos.list );
00259 Menu_AddItem( &s_demos.menu, &s_demos.arrows );
00260 Menu_AddItem( &s_demos.menu, &s_demos.left );
00261 Menu_AddItem( &s_demos.menu, &s_demos.right );
00262 Menu_AddItem( &s_demos.menu, &s_demos.back );
00263 Menu_AddItem( &s_demos.menu, &s_demos.go );
00264 }
00265
00266
00267
00268
00269
00270
00271 void Demos_Cache( void ) {
00272 trap_R_RegisterShaderNoMip( ART_BACK0 );
00273 trap_R_RegisterShaderNoMip( ART_BACK1 );
00274 trap_R_RegisterShaderNoMip( ART_GO0 );
00275 trap_R_RegisterShaderNoMip( ART_GO1 );
00276 trap_R_RegisterShaderNoMip( ART_FRAMEL );
00277 trap_R_RegisterShaderNoMip( ART_FRAMER );
00278 trap_R_RegisterShaderNoMip( ART_ARROWS );
00279 trap_R_RegisterShaderNoMip( ART_ARROWLEFT );
00280 trap_R_RegisterShaderNoMip( ART_ARROWRIGHT );
00281 }
00282
00283
00284
00285
00286
00287
00288 void UI_DemosMenu( void ) {
00289 Demos_MenuInit();
00290 UI_PushMenu( &s_demos.menu );
00291 }