diff options
Diffstat (limited to 'source/ui_demos.c')
-rw-r--r-- | source/ui_demos.c | 218 |
1 files changed, 80 insertions, 138 deletions
diff --git a/source/ui_demos.c b/source/ui_demos.c index 9c249f3..b32f5bd 100644 --- a/source/ui_demos.c +++ b/source/ui_demos.c @@ -38,121 +38,89 @@ DEMOS MENU #define ID_LIST 105 +typedef struct { + int type; + int size; + time_t mtime; +} demoEntry_t; + typedef struct m_demos_s { menuFrameWork_t menu; menuList_t list; - menuList_t playerList; menuStatic_t banner; - int count; + int count; char *names[MAX_MENU_DEMOS+1]; - int types[MAX_MENU_DEMOS]; - char *playerNames[MAX_DEMOINFO_CLIENTS+1]; - - // Demo file info - demoInfo_t demo; + demoEntry_t entries[MAX_MENU_DEMOS]; } m_demos_t; static m_demos_t m_demos; -static void Demos_FreeInfo( void ) { - memset( &m_demos.demo, 0, sizeof( m_demos.demo ) ); - - m_demos.playerList.generic.flags |= QMF_HIDDEN; -} - -static void Demos_LoadInfo( int index ) { - char buffer[MAX_OSPATH]; - int i, numNames, localPlayerNum; - - if( m_demos.types[index] != FFILE_DEMO ) { - m_demos.playerList.generic.flags |= QMF_HIDDEN; - m_demos.menu.statusbar = NULL; - return; - } - - Q_concat( buffer, sizeof( buffer ), - uis.m_demos_browse + 1, "/", m_demos.names[index], NULL ); - - client.GetDemoInfo( buffer, &m_demos.demo ); +static void Demos_BuildName( const char *path, fsFileInfo_t *info ) { + char buffer[MAX_OSPATH]; + demoInfo_t demo; - if( !m_demos.demo.mapname[0] ) { - m_demos.menu.statusbar = "Couldn't read demo info"; - m_demos.playerList.generic.flags |= QMF_HIDDEN; +#if 1 + Q_concat( buffer, sizeof( buffer ), path, "/", info->name, NULL ); + if( !client.GetDemoInfo( buffer, &demo ) ) { return; - } - - localPlayerNum = 0; - - numNames = 0; - for( i = 0; i < MAX_DEMOINFO_CLIENTS; i++ ) { - if( !m_demos.demo.clients[i][0] ) { - continue; - } - - if( i == m_demos.demo.clientNum ) { - localPlayerNum = numNames; - } - - // ( m_demos.demo.mvd || i == m_demos.demo.clientNum ) ? colorYellow : NULL - - m_demos.playerNames[numNames++] = m_demos.demo.clients[i]; - } - - if( numNames ) { - m_demos.playerList.generic.flags &= ~QMF_HIDDEN; - } else { - m_demos.playerList.generic.flags |= QMF_HIDDEN; - } - - m_demos.playerNames[numNames] = NULL; - - m_demos.menu.statusbar = "Press Enter to play"; + } +#else + strcpy( demo.map, "???" ); + strcpy( demo.pov, "???" ); +#endif + + if( info->size >= 1000000 ) { + sprintf( buffer, "%2.1fM", ( float )info->size / 1000000 ); + } else if( info->size >= 1000 ) { + sprintf( buffer, "%3dK", info->size / 1000 ); + } else { + sprintf( buffer, "%3db", info->size ); + } - MenuList_Init( &m_demos.playerList ); - MenuList_SetValue( &m_demos.playerList, localPlayerNum ); + m_demos.names[m_demos.count] = UI_FormatColumns( 4, + info->name, buffer, demo.map, demo.pov ); + m_demos.entries[m_demos.count].type = FFILE_DEMO; + m_demos.entries[m_demos.count].size = info->size; + m_demos.entries[m_demos.count].mtime = info->mtime; + m_demos.count++; } -static char *Demos_BuildName( const char *path, const char *name, - fsFileInfo_t *info ) -{ +static void Demos_WriteCache( const char *path ) { char buffer[MAX_OSPATH]; - demoInfo_t demo; - char *s; + fileHandle_t f; + int i; + char *name, *map, *pov; + demoEntry_t *e; - Q_concat( buffer, sizeof( buffer ), path, "/", name, NULL ); - - client.GetDemoInfo( buffer, &demo ); - if( !demo.mapname[0] ) { - return NULL; - } + if( *path == '/' ) { + path++; + } - if( info->fileSize >= 1000000 ) { - sprintf( buffer, "%2.1fM", ( float )info->fileSize / 1000000 ); - } else if( info->fileSize >= 1000 ) { - sprintf( buffer, "%3dK", info->fileSize / 1000 ); - } else { - sprintf( buffer, "%3db", info->fileSize ); + Q_concat( buffer, sizeof( buffer ), path, "/.democache", NULL ); + fs.FOpenFile( buffer, &f, FS_MODE_WRITE ); + if( !f ) { + return; } -// Com_sprintf( buffer, sizeof( buffer ), "%4d", info->fileSize >> 10 ); - - if( demo.clientNum >= 0 && demo.clientNum < MAX_DEMOINFO_CLIENTS ) { - s = UI_FormatColumns( 4, name, buffer, demo.mapname, - demo.clients[demo.clientNum] ); - } else { - s = UI_FormatColumns( 3, name, buffer, demo.mapname ); + for( i = 0; i < m_demos.count; i++ ) { + e = &m_demos.entries[i]; + if( e->type != FFILE_DEMO ) { + continue; + } + name = m_demos.names[i]; + map = name + strlen( name ) + 1; + map = map + strlen( map ) + 1; + pov = map + strlen( map ) + 1; + fs.FPrintf( f, "%s %d %d %s %s\n", name, e->mtime, e->size, map, pov ); } - - return s; + fs.FCloseFile( f ); } static void Demos_BuildList( const char *path ) { - fsFileInfo_t *info; int numFiles; - char **list, *s; - int pos; - int i; + void **list; + int i, pos; if( *path == '/' ) { path++; @@ -160,7 +128,7 @@ static void Demos_BuildList( const char *path ) { if( *path ) { m_demos.names[m_demos.count] = UI_FormatColumns( 1, ".." ); - m_demos.types[m_demos.count] = FFILE_UP; + m_demos.entries[m_demos.count].type = FFILE_UP; m_demos.count++; } @@ -173,11 +141,10 @@ static void Demos_BuildList( const char *path ) { } for( i = 0; i < numFiles; i++ ) { m_demos.names[m_demos.count] = UI_FormatColumns( 1, list[i] ); - m_demos.types[m_demos.count] = FFILE_FOLDER; + m_demos.entries[m_demos.count].type = FFILE_FOLDER; m_demos.count++; } - - fs.FreeFileList( list ); + fs.FreeList( list ); } pos = m_demos.count; @@ -190,20 +157,14 @@ static void Demos_BuildList( const char *path ) { numFiles = MAX_MENU_DEMOS - m_demos.count; } for( i = 0; i < numFiles; i++ ) { - info = ( fsFileInfo_t * )( list[i] + strlen( list[i] ) + 1 ); - s = Demos_BuildName( path, list[i], info ); - if( s ) { - m_demos.names[m_demos.count] = s; - m_demos.types[m_demos.count] = FFILE_DEMO; - m_demos.count++; - } + Demos_BuildName( path, list[i] ); } // sort them qsort( m_demos.names + pos, m_demos.count - pos, sizeof( m_demos.names[0] ), SortStrcmp ); - fs.FreeFileList( list ); + fs.FreeList( list ); } // terminate the list @@ -213,12 +174,12 @@ static void Demos_BuildList( const char *path ) { static void Demos_Free( void ) { int i; - Demos_FreeInfo(); + Demos_WriteCache( uis.m_demos_browse ); for( i = 0; i < m_demos.count; i++ ) { com.Free( m_demos.names[i] ); m_demos.names[i] = NULL; - m_demos.types[i] = 0; + memset( &m_demos.entries[i], 0, sizeof( m_demos.entries[0] ) ); } m_demos.count = 0; @@ -264,15 +225,17 @@ static void Demos_LeaveDirectory( void ) { static int Demos_Action( void ) { char buffer[MAX_OSPATH]; int length, baseLength; + char *s = m_demos.names[m_demos.list.curvalue]; + demoEntry_t *e = &m_demos.entries[m_demos.list.curvalue]; - switch( m_demos.types[m_demos.list.curvalue] ) { + switch( e->type ) { case FFILE_UP: Demos_LeaveDirectory(); return QMS_OUT; case FFILE_FOLDER: baseLength = strlen( uis.m_demos_browse ); - length = strlen( m_demos.names[m_demos.list.curvalue] ); + length = strlen( s ); if( baseLength + length > sizeof( uis.m_demos_browse ) - 2 ) { return QMS_BEEP; } @@ -280,8 +243,7 @@ static int Demos_Action( void ) { uis.m_demos_browse[ baseLength++ ] = '/'; } - strcpy( uis.m_demos_browse + baseLength, - m_demos.names[m_demos.list.curvalue] ); + strcpy( uis.m_demos_browse + baseLength, s ); // rebuild list Demos_Free(); @@ -290,14 +252,10 @@ static int Demos_Action( void ) { return QMS_IN; case FFILE_DEMO: - if( !m_demos.demo.mapname[0] ) { - return QMS_BEEP; - } Com_sprintf( buffer, sizeof( buffer ), "%s \"%s/%s\"\n", - m_demos.demo.mvd ? "mvdplay" : "demo", - uis.m_demos_browse, m_demos.names[m_demos.list.curvalue] ); + /*m_demos.demo.mvd ? "mvdplay" : */"demo", + uis.m_demos_browse, s ); cmd.ExecuteText( EXEC_APPEND, buffer ); - //UI_ForceMenuOff(); return QMS_SILENT; } @@ -316,7 +274,11 @@ static int Demos_MenuCallback( int id, int msg, int param ) { case QM_CHANGE: switch( id ) { case ID_LIST: - Demos_LoadInfo( m_demos.list.curvalue ); + if( m_demos.entries[m_demos.list.curvalue].type == FFILE_DEMO ) { + m_demos.menu.statusbar = "Press Enter to play"; + } else { + m_demos.menu.statusbar = NULL; + } break; default: break; @@ -351,17 +313,12 @@ static int Demos_MenuCallback( int id, int msg, int param ) { } static void Demos_MenuInit( void ) { - int w1, w2; - memset( &m_demos, 0, sizeof( m_demos ) ); m_demos.menu.callback = Demos_MenuCallback; Demos_BuildList( uis.m_demos_browse ); - w1 = ( uis.width - 30 ) * 0.8f; - w2 = ( uis.width - 30 ) * 0.2f; - m_demos.list.generic.type = MTYPE_LIST; m_demos.list.generic.id = ID_LIST; m_demos.list.generic.flags = QMF_HASFOCUS; @@ -374,7 +331,7 @@ static void Demos_MenuInit( void ) { m_demos.list.drawNames = qtrue; m_demos.list.numcolumns = 4; - m_demos.list.columns[0].width = w1 - 180; + m_demos.list.columns[0].width = uis.width - 30 - 196; m_demos.list.columns[0].name = uis.m_demos_browse; m_demos.list.columns[0].uiFlags = UI_LEFT; @@ -386,28 +343,13 @@ static void Demos_MenuInit( void ) { m_demos.list.columns[2].name = "Map"; m_demos.list.columns[2].uiFlags = UI_CENTER; - m_demos.list.columns[3].width = 80; + m_demos.list.columns[3].width = 96; m_demos.list.columns[3].name = "POV"; m_demos.list.columns[3].uiFlags = UI_CENTER; - m_demos.playerList.generic.type = MTYPE_LIST; - m_demos.playerList.generic.flags = QMF_HIDDEN|QMF_DISABLED; - m_demos.playerList.generic.x = w1 + 20; - m_demos.playerList.generic.y = 32; - m_demos.playerList.generic.height = uis.height - 64; - m_demos.playerList.itemnames = ( const char ** )m_demos.playerNames; - m_demos.playerList.mlFlags = MLF_HIDE_SCROLLBAR_EMPTY; - m_demos.playerList.numcolumns = 1; - m_demos.playerList.drawNames = qtrue; - - m_demos.playerList.columns[0].width = w2; - m_demos.playerList.columns[0].name = "Players"; - m_demos.playerList.columns[0].uiFlags = UI_CENTER; - - UI_SetupDefaultBanner( &m_demos.banner, "Demos" ); + UI_SetupDefaultBanner( &m_demos.banner, "Demo Browser" ); Menu_AddItem( &m_demos.menu, (void *)&m_demos.list ); - Menu_AddItem( &m_demos.menu, (void *)&m_demos.playerList ); Menu_AddItem( &m_demos.menu, (void *)&m_demos.banner ); // move cursor to previous position |