summaryrefslogtreecommitdiff
path: root/source/ui_demos.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/ui_demos.c')
-rw-r--r--source/ui_demos.c218
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