Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

ui_demo2.c

Go to the documentation of this file.
00001 /*
00002 ===========================================================================
00003 Copyright (C) 1999-2005 Id Software, Inc.
00004 
00005 This file is part of Quake III Arena source code.
00006 
00007 Quake III Arena source code is free software; you can redistribute it
00008 and/or modify it under the terms of the GNU General Public License as
00009 published by the Free Software Foundation; either version 2 of the License,
00010 or (at your option) any later version.
00011 
00012 Quake III Arena source code is distributed in the hope that it will be
00013 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Foobar; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 ===========================================================================
00021 */
00022 //
00023 /*
00024 =======================================================================
00025 
00026 DEMOS MENU
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 Demos_MenuEvent
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 UI_DemosMenu_Key
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 Demos_MenuInit
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         //degenerate case, not selectable
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         // strip extension
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 Demos_Cache
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 UI_DemosMenu
00286 ===============
00287 */
00288 void UI_DemosMenu( void ) {
00289     Demos_MenuInit();
00290     UI_PushMenu( &s_demos.menu );
00291 }

Generated on Thu Aug 25 12:37:40 2005 for Quake III Arena by  doxygen 1.3.9.1