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

ui_rankings.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 // ui_rankings.c
00025 //
00026 
00027 #include "ui_local.h"
00028 
00029 
00030 #define RANKINGS_FRAME  "menu/art/cut_frame"
00031 
00032 #define ID_LOGIN        100
00033 #define ID_LOGOUT       101
00034 #define ID_CREATE       102
00035 #define ID_SPECTATE     103
00036 #define ID_SETUP        104
00037 #define ID_LEAVE        105
00038 
00039 
00040 typedef struct
00041 {
00042     menuframework_s menu;
00043     menubitmap_s    frame;
00044     menutext_s      login;
00045     menutext_s      logout;
00046     menutext_s      create;
00047     menutext_s      spectate;
00048     menutext_s      setup;
00049     menutext_s      leave;
00050 } rankings_t;
00051 
00052 static rankings_t   s_rankings;
00053 
00054 static menuframework_s  s_rankings_menu;
00055 static menuaction_s     s_rankings_login;
00056 static menuaction_s     s_rankings_logout;
00057 static menuaction_s     s_rankings_create;
00058 static menuaction_s     s_rankings_spectate;
00059 static menuaction_s     s_rankings_setup;
00060 static menuaction_s     s_rankings_leave;
00061 
00062 
00063 /*
00064 ===============
00065 Rankings_DrawText
00066 ===============
00067 */
00068 void Rankings_DrawText( void* self )
00069 {
00070     menufield_s     *f;
00071     qboolean        focus;
00072     int             style;
00073     char            *txt;
00074     char            c;
00075     float           *color;
00076     int             basex, x, y;
00077 
00078     f = (menufield_s*)self;
00079     basex = f->generic.x;
00080     y = f->generic.y + 4;
00081     focus = (f->generic.parent->cursor == f->generic.menuPosition);
00082 
00083     style = UI_LEFT|UI_SMALLFONT;
00084     color = text_color_normal;
00085     if( focus ) {
00086         style |= UI_PULSE;
00087         color = text_color_highlight;
00088     }
00089 
00090     // draw the actual text
00091     txt = f->field.buffer;
00092     color = g_color_table[ColorIndex(COLOR_WHITE)];
00093     x = basex;
00094     while ( (c = *txt) != 0 ) {
00095         UI_DrawChar( x, y, c, style, color );
00096         txt++;
00097         x += SMALLCHAR_WIDTH;
00098     }
00099 
00100     // draw cursor if we have focus
00101     if( focus ) {
00102         if ( trap_Key_GetOverstrikeMode() ) {
00103             c = 11;
00104         } else {
00105             c = 10;
00106         }
00107 
00108         style &= ~UI_PULSE;
00109         style |= UI_BLINK;
00110 
00111         UI_DrawChar( basex + f->field.cursor * SMALLCHAR_WIDTH, y, c, style, color_white );
00112     }
00113 }
00114 
00115 /*
00116 ===============
00117 Rankings_DrawName
00118 ===============
00119 */
00120 void Rankings_DrawName( void* self )
00121 {
00122     menufield_s     *f;
00123     int             length;
00124     char*           p;
00125     
00126     f = (menufield_s*)self;
00127 
00128     // GRANK_FIXME - enforce valid characters
00129     for( p = f->field.buffer; *p != '\0'; p++ )
00130     {
00131         //if( ispunct(*p) || isspace(*p) )
00132         if( !( ( (*p) >= '0' && (*p) <= '9') || Q_isalpha(*p)) )
00133         {
00134             *p = '\0';
00135         }
00136     }
00137     
00138     // strip color codes
00139     Q_CleanStr( f->field.buffer );
00140     length = strlen( f->field.buffer );
00141     if( f->field.cursor > length )
00142     {
00143         f->field.cursor = length;
00144     }   
00145 
00146     Rankings_DrawText( f );
00147 }
00148 
00149 #if 0 // old version
00150 /*
00151 ===============
00152 Rankings_DrawName
00153 ===============
00154 */
00155 void Rankings_DrawName( void* self )
00156 {
00157     menufield_s*    f;
00158     int             length;
00159     
00160     f = (menufield_s*)self;
00161 
00162     // strip color codes
00163     Q_CleanStr( f->field.buffer );
00164     length = strlen( f->field.buffer );
00165     if( f->field.cursor > length )
00166     {
00167         f->field.cursor = length;
00168     }
00169     
00170     // show beginning of long names
00171     /*
00172     if( Menu_ItemAtCursor( f->generic.parent ) != f )
00173     {
00174         if( f->field.scroll > 0 )
00175         {
00176             f->field.cursor = 0;
00177             f->field.scroll = 0;
00178         }
00179     }
00180     */
00181     
00182     MenuField_Draw( f );
00183 }
00184 #endif
00185 
00186 /*
00187 ===============
00188 Rankings_DrawPassword
00189 ===============
00190 */
00191 void Rankings_DrawPassword( void* self )
00192 {
00193     menufield_s*    f;
00194     char            password[MAX_EDIT_LINE];
00195     int             length;
00196     int             i;
00197     char*           p;
00198 
00199     f = (menufield_s*)self;
00200     
00201     // GRANK_FIXME - enforce valid characters
00202     for( p = f->field.buffer; *p != '\0'; p++ )
00203     {
00204         //if( ispunct(*p) || isspace(*p) )
00205         if( !( ( (*p) >= '0' && (*p) <= '9') || Q_isalpha(*p)) )
00206         {
00207             *p = '\0';
00208         }
00209     }
00210     
00211     length = strlen( f->field.buffer );
00212     if( f->field.cursor > length )
00213     {
00214         f->field.cursor = length;
00215     }
00216     
00217     // save password
00218     Q_strncpyz( password, f->field.buffer, sizeof(password) );
00219 
00220     // mask password with *
00221     for( i = 0; i < length; i++ )
00222     {
00223         f->field.buffer[i] = '*';
00224     }
00225 
00226     // draw masked password
00227     Rankings_DrawText( f );
00228     //MenuField_Draw( f );
00229 
00230     // restore password
00231     Q_strncpyz( f->field.buffer, password, sizeof(f->field.buffer) );
00232 }
00233 
00234 /*
00235 ===============
00236 Rankings_MenuEvent
00237 ===============
00238 */
00239 static void Rankings_MenuEvent( void* ptr, int event ) {
00240     if( event != QM_ACTIVATED ) {
00241         return;
00242     }
00243 
00244     switch( ((menucommon_s*)ptr)->id ) {
00245     case ID_LOGIN:
00246         UI_LoginMenu();
00247         break;
00248 
00249     case ID_LOGOUT:
00250         // server side masqueraded player logout first
00251         trap_CL_UI_RankUserRequestLogout();
00252         UI_ForceMenuOff();
00253         break;
00254         
00255     case ID_CREATE:
00256         UI_SignupMenu();
00257         break;
00258 
00259     case ID_SPECTATE:
00260         trap_Cmd_ExecuteText( EXEC_APPEND, "cmd rank_spectate\n" );
00261         UI_ForceMenuOff();
00262         break;
00263 
00264     case ID_SETUP:
00265         UI_SetupMenu();
00266         break;
00267         
00268     case ID_LEAVE:
00269         trap_Cmd_ExecuteText( EXEC_APPEND, "disconnect\n" );
00270         UI_ForceMenuOff();
00271         break;
00272 
00273     }
00274 }
00275 
00276 
00277 /*
00278 ===============
00279 Rankings_MenuInit
00280 ===============
00281 */
00282 void Rankings_MenuInit( void ) {
00283     grank_status_t  status;
00284     int             y;
00285 
00286     memset( &s_rankings, 0, sizeof(s_rankings) );
00287 
00288     Rankings_Cache();
00289 
00290     s_rankings.menu.wrapAround = qtrue;
00291     s_rankings.menu.fullscreen = qfalse;
00292 
00293     s_rankings.frame.generic.type       = MTYPE_BITMAP;
00294     s_rankings.frame.generic.flags      = QMF_INACTIVE;
00295     s_rankings.frame.generic.name       = RANKINGS_FRAME;
00296     s_rankings.frame.generic.x          = 142;
00297     s_rankings.frame.generic.y          = 118;
00298     s_rankings.frame.width              = 359;
00299     s_rankings.frame.height             = 256;
00300 
00301     y = 194;
00302 
00303     s_rankings.login.generic.type       = MTYPE_PTEXT;
00304     s_rankings.login.generic.flags      = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
00305     s_rankings.login.generic.id         = ID_LOGIN;
00306     s_rankings.login.generic.callback   = Rankings_MenuEvent;
00307     s_rankings.login.generic.x          = 320;
00308     s_rankings.login.generic.y          = y;
00309     s_rankings.login.string             = "LOGIN";
00310     s_rankings.login.style              = UI_CENTER|UI_SMALLFONT;
00311     s_rankings.login.color              = colorRed;
00312     y += 20;
00313 
00314     s_rankings.logout.generic.type      = MTYPE_PTEXT;
00315     s_rankings.logout.generic.flags     = QMF_HIDDEN|QMF_INACTIVE|QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
00316     s_rankings.logout.generic.id        = ID_LOGOUT;
00317     s_rankings.logout.generic.callback  = Rankings_MenuEvent;
00318     s_rankings.logout.generic.x         = 320;
00319     s_rankings.logout.generic.y         = y;
00320     s_rankings.logout.string                = "LOGOUT";
00321     s_rankings.logout.style             = UI_CENTER|UI_SMALLFONT;
00322     s_rankings.logout.color             = colorRed;
00323 
00324     s_rankings.create.generic.type      = MTYPE_PTEXT;
00325     s_rankings.create.generic.flags     = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
00326     s_rankings.create.generic.id        = ID_CREATE;
00327     s_rankings.create.generic.callback  = Rankings_MenuEvent;
00328     s_rankings.create.generic.x         = 320;
00329     s_rankings.create.generic.y         = y;
00330     s_rankings.create.string            = "SIGN UP";
00331     s_rankings.create.style             = UI_CENTER|UI_SMALLFONT;
00332     s_rankings.create.color             = colorRed;
00333     y += 20;
00334 
00335     s_rankings.spectate.generic.type        = MTYPE_PTEXT;
00336     s_rankings.spectate.generic.flags       = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
00337     s_rankings.spectate.generic.id          = ID_SPECTATE;
00338     s_rankings.spectate.generic.callback    = Rankings_MenuEvent;
00339     s_rankings.spectate.generic.x           = 320;
00340     s_rankings.spectate.generic.y           = y;
00341     s_rankings.spectate.string              = "SPECTATE";
00342     s_rankings.spectate.style               = UI_CENTER|UI_SMALLFONT;
00343     s_rankings.spectate.color               = colorRed;
00344     y += 20;
00345 
00346     s_rankings.setup.generic.type       = MTYPE_PTEXT;
00347     s_rankings.setup.generic.flags      = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
00348     s_rankings.setup.generic.id         = ID_SETUP;
00349     s_rankings.setup.generic.callback   = Rankings_MenuEvent;
00350     s_rankings.setup.generic.x          = 320;
00351     s_rankings.setup.generic.y          = y;
00352     s_rankings.setup.string             = "SETUP";
00353     s_rankings.setup.style              = UI_CENTER|UI_SMALLFONT;
00354     s_rankings.setup.color              = colorRed;
00355     y += 20;
00356 
00357     s_rankings.leave.generic.type       = MTYPE_PTEXT;
00358     s_rankings.leave.generic.flags      = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
00359     s_rankings.leave.generic.id         = ID_LEAVE;
00360     s_rankings.leave.generic.callback   = Rankings_MenuEvent;
00361     s_rankings.leave.generic.x          = 320;
00362     s_rankings.leave.generic.y          = y;
00363     s_rankings.leave.string             = "LEAVE ARENA";
00364     s_rankings.leave.style              = UI_CENTER|UI_SMALLFONT;
00365     s_rankings.leave.color              = colorRed;
00366     y += 20;
00367 
00368     status = (grank_status_t)trap_Cvar_VariableValue("client_status");
00369     if( (status != QGR_STATUS_NEW) && (status != QGR_STATUS_SPECTATOR) )
00370     {
00371         s_rankings.login.generic.flags |= QMF_HIDDEN | QMF_INACTIVE;    
00372         s_rankings.create.generic.flags |= QMF_HIDDEN | QMF_INACTIVE;
00373         s_rankings.spectate.generic.flags |= QMF_HIDDEN | QMF_INACTIVE;
00374 
00375         s_rankings.logout.generic.flags &= ~(QMF_HIDDEN | QMF_INACTIVE);
00376     }
00377     
00378     if ( (status == QGR_STATUS_VALIDATING) ||
00379          (status == QGR_STATUS_PENDING) ||
00380          (status == QGR_STATUS_LEAVING) )
00381     {
00382         s_rankings.login.generic.flags  |= QMF_GRAYED;
00383         s_rankings.create.generic.flags |= QMF_GRAYED;
00384         s_rankings.logout.generic.flags |= QMF_GRAYED;
00385     }
00386     
00387     //GRank FIXME -- don't need setup option any more
00388     s_rankings.setup.generic.flags |= QMF_HIDDEN | QMF_INACTIVE;
00389 
00390     Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.frame );
00391     Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.login );
00392     Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.logout );
00393     Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.create );
00394     Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.spectate );
00395     Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.setup );
00396     Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.leave );
00397 }
00398 
00399 
00400 /*
00401 ===============
00402 Rankings_Cache
00403 ===============
00404 */
00405 void Rankings_Cache( void ) {
00406     trap_R_RegisterShaderNoMip( RANKINGS_FRAME );
00407 }
00408 
00409 
00410 /*
00411 ===============
00412 UI_RankingsMenu
00413 ===============
00414 */
00415 void UI_RankingsMenu( void ) {
00416     Rankings_MenuInit();
00417     UI_PushMenu ( &s_rankings.menu );
00418 }
00419 
00420 

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