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 #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
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
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
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
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
00129 for( p = f->field.buffer; *p != '\0'; p++ )
00130 {
00131
00132 if( !( ( (*p) >= '0' && (*p) <= '9') || Q_isalpha(*p)) )
00133 {
00134 *p = '\0';
00135 }
00136 }
00137
00138
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
00153
00154
00155 void Rankings_DrawName( void* self )
00156 {
00157 menufield_s* f;
00158 int length;
00159
00160 f = (menufield_s*)self;
00161
00162
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
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 MenuField_Draw( f );
00183 }
00184 #endif
00185
00186
00187
00188
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
00202 for( p = f->field.buffer; *p != '\0'; p++ )
00203 {
00204
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
00218 Q_strncpyz( password, f->field.buffer, sizeof(password) );
00219
00220
00221 for( i = 0; i < length; i++ )
00222 {
00223 f->field.buffer[i] = '*';
00224 }
00225
00226
00227 Rankings_DrawText( f );
00228
00229
00230
00231 Q_strncpyz( f->field.buffer, password, sizeof(f->field.buffer) );
00232 }
00233
00234
00235
00236
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
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
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
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
00403
00404
00405 void Rankings_Cache( void ) {
00406 trap_R_RegisterShaderNoMip( RANKINGS_FRAME );
00407 }
00408
00409
00410
00411
00412
00413
00414
00415 void UI_RankingsMenu( void ) {
00416 Rankings_MenuInit();
00417 UI_PushMenu ( &s_rankings.menu );
00418 }
00419
00420