Move newmenu_get_filename to menu.c, call it get_filename and have it use newmenu_listbox1; support long demo filenames
This commit is contained in:
parent
1603b87e40
commit
19806aa7ec
|
@ -1,5 +1,9 @@
|
|||
D2X-Rebirth Changelog
|
||||
|
||||
20091208
|
||||
--------
|
||||
main/gameseq.c, main/menu.c, main/menu.h, main/newdemo.c, main/newmenu.c, main/newmenu.h: Move newmenu_get_filename to menu.c, call it get_filename and have it use newmenu_listbox1; support long demo filenames
|
||||
|
||||
20091207
|
||||
--------
|
||||
main/net_ipx.c: Removing old use of variable already_showing_info which was removed from newmenu code
|
||||
|
|
|
@ -674,22 +674,23 @@ try_again:
|
|||
//Inputs the player's name, without putting up the background screen
|
||||
int RegisterPlayer()
|
||||
{
|
||||
char filename[14];
|
||||
char filename[PATH_MAX];
|
||||
int allow_abort_flag = 1;
|
||||
|
||||
if ( Players[Player_num].callsign[0] == 0 ) {
|
||||
if ( Players[Player_num].callsign[0] == 0 ) {
|
||||
// Read the last player's name from config file, not lastplr.txt
|
||||
strncpy( Players[Player_num].callsign, GameCfg.LastPlayer, CALLSIGN_LEN );
|
||||
|
||||
if (GameCfg.LastPlayer[0]==0)
|
||||
allow_abort_flag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
do_menu_again:
|
||||
;
|
||||
|
||||
if (!newmenu_get_filename(TXT_SELECT_PILOT, ".plr", filename, allow_abort_flag))
|
||||
goto do_menu_again; //return 0; // They hit Esc in file selector
|
||||
if (!get_filename(TXT_SELECT_PILOT, ".plr", filename, allow_abort_flag))
|
||||
goto do_menu_again; // They hit Esc in file selector
|
||||
|
||||
if ( filename[0] == '<' ) {
|
||||
// They selected 'create new pilot'
|
||||
if (!MakeNewPlayerFile(allow_abort_flag))
|
||||
|
|
201
main/menu.c
201
main/menu.c
|
@ -261,8 +261,8 @@ void do_option ( int select)
|
|||
break;
|
||||
case MENU_DEMO_PLAY:
|
||||
{
|
||||
char demo_file[16];
|
||||
if (newmenu_get_filename(TXT_SELECT_DEMO, ".dem", demo_file, 1))
|
||||
char demo_file[PATH_MAX];
|
||||
if (get_filename(TXT_SELECT_DEMO, ".dem", demo_file, 1))
|
||||
newdemo_start_playback(demo_file);
|
||||
break;
|
||||
}
|
||||
|
@ -386,6 +386,203 @@ void do_option ( int select)
|
|||
|
||||
}
|
||||
|
||||
void delete_player_saved_games(char * name)
|
||||
{
|
||||
int i;
|
||||
char filename[FILENAME_LEN + 9];
|
||||
|
||||
for (i=0;i<10; i++)
|
||||
{
|
||||
sprintf( filename, GameArg.SysUsePlayersDir? "Players/%s.sg%x" : "%s.sg%x", name, i );
|
||||
|
||||
PHYSFS_delete(filename);
|
||||
}
|
||||
}
|
||||
|
||||
int fname_sort_func(char **e0, char **e1)
|
||||
{
|
||||
return stricmp(*e0, *e1);
|
||||
}
|
||||
|
||||
enum
|
||||
{
|
||||
K_DELETED = -5,
|
||||
K_DELETED_DEMO = -6
|
||||
};
|
||||
|
||||
// These have to be statics until the newmenu callback system is revised
|
||||
static int player_mode=0;
|
||||
static int demo_mode=0;
|
||||
|
||||
int filename_menu_handler( int * citem, int *nitems, char * items[], int *keypress )
|
||||
{
|
||||
switch (*keypress)
|
||||
{
|
||||
case KEY_CTRLED+KEY_D:
|
||||
if ( ((player_mode)&&(*citem>0)) || ((demo_mode)&&(*citem>=0)) )
|
||||
{
|
||||
int x = 1;
|
||||
if (player_mode)
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "%s %s?", TXT_DELETE_PILOT, items[*citem]+((player_mode && items[*citem][0]=='$')?1:0) );
|
||||
else if (demo_mode)
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "%s %s?", TXT_DELETE_DEMO, items[*citem]+((demo_mode && items[*citem][0]=='$')?1:0) );
|
||||
if (x==0) {
|
||||
char * p;
|
||||
char plxfile[PATH_MAX];
|
||||
int ret;
|
||||
char name[PATH_MAX];
|
||||
|
||||
p = items[*citem] + strlen(items[*citem]);
|
||||
if (player_mode)
|
||||
*p = '.';
|
||||
|
||||
strcpy(name, demo_mode ? DEMO_DIR : ((player_mode && GameArg.SysUsePlayersDir) ? "Players/" : ""));
|
||||
strcat(name,items[*citem]);
|
||||
|
||||
ret = !PHYSFS_delete(name);
|
||||
if (player_mode)
|
||||
*p = 0;
|
||||
|
||||
if ((!ret) && player_mode) {
|
||||
delete_player_saved_games( items[*citem] );
|
||||
// delete PLX file
|
||||
sprintf(plxfile, GameArg.SysUsePlayersDir? "Players/%.8s.plx" : "%.8s.plx", items[*citem]);
|
||||
if (cfexist(plxfile))
|
||||
PHYSFS_delete(plxfile);
|
||||
}
|
||||
|
||||
*keypress = K_DELETED;
|
||||
|
||||
if (ret) {
|
||||
if (player_mode)
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s %s", TXT_COULDNT, TXT_DELETE_PILOT, items[*citem]+((player_mode && items[*citem][0]=='$')?1:0) );
|
||||
else if (demo_mode)
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s %s", TXT_COULDNT, TXT_DELETE_DEMO, items[*citem]+((demo_mode && items[*citem][0]=='$')?1:0) );
|
||||
} else if (demo_mode)
|
||||
*keypress = K_DELETED_DEMO;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_CTRLED+KEY_C:
|
||||
if (demo_mode)
|
||||
{
|
||||
int x = 1;
|
||||
char bakname[PATH_MAX];
|
||||
|
||||
*keypress = 0;
|
||||
// Get backup name
|
||||
change_filename_extension(bakname, items[*citem]+((demo_mode && items[*citem][0]=='$')?1:0), DEMO_BACKUP_EXT);
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "Are you sure you want to\n"
|
||||
"swap the endianness of\n"
|
||||
"%s? If the file is\n"
|
||||
"already endian native, D1X\n"
|
||||
"will likely crash. A backup\n"
|
||||
"%s will be created", items[*citem]+((demo_mode && items[*citem][0]=='$')?1:0), bakname );
|
||||
if (x)
|
||||
break;
|
||||
|
||||
newdemo_swap_endian(items[*citem]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int get_filename(char *title, char *type, char *filename, int allow_abort_flag)
|
||||
{
|
||||
char **m;
|
||||
char **find;
|
||||
char **f;
|
||||
char *types[] = { type, NULL };
|
||||
int i = 0, NumItems;
|
||||
int citem = 0;
|
||||
|
||||
player_mode = demo_mode = 0;
|
||||
|
||||
if (!stricmp(type, ".plr"))
|
||||
player_mode = 1;
|
||||
else if (!stricmp(type, ".dem"))
|
||||
demo_mode = 1;
|
||||
|
||||
ReadFileNames:
|
||||
find = PHYSFSX_findFiles(demo_mode ? DEMO_DIR : ((player_mode && GameArg.SysUsePlayersDir) ? "Players/" : ""), types);
|
||||
if (!find)
|
||||
return 0; // memory error
|
||||
if ( !*find && demo_mode && (citem > -1) )
|
||||
{
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s\n%s", TXT_NO_DEMO_FILES, TXT_USE_F5, TXT_TO_CREATE_ONE);
|
||||
PHYSFS_freeList(find);
|
||||
return 0;
|
||||
}
|
||||
else if ( !*find && player_mode ) {
|
||||
strcpy(filename, TXT_CREATE_NEW); // make a new player without showing listbox
|
||||
PHYSFS_freeList(find);
|
||||
return 0;
|
||||
}
|
||||
else if ( !*find ) {
|
||||
nm_messagebox(NULL, 1, "Ok", "%s\n '%s' %s", TXT_NO_FILES_MATCHING, type, TXT_WERE_FOUND);
|
||||
PHYSFS_freeList(find);
|
||||
return 0;
|
||||
} // else create a player file
|
||||
|
||||
|
||||
for (NumItems = 0; find[NumItems] != NULL; NumItems++) {}
|
||||
if (player_mode)
|
||||
NumItems++;
|
||||
|
||||
MALLOC(m, char *, NumItems);
|
||||
if (m == NULL)
|
||||
{
|
||||
PHYSFS_freeList(find);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (player_mode)
|
||||
m[i++] = TXT_CREATE_NEW;
|
||||
|
||||
for (f = find; *f != NULL; f++)
|
||||
{
|
||||
m[i++] = *f;
|
||||
|
||||
if (player_mode)
|
||||
{
|
||||
char *p;
|
||||
|
||||
p = strchr(*f, '.');
|
||||
if (p)
|
||||
*p = '\0'; // chop the .plr
|
||||
if ((p - *f) > 8)
|
||||
*f[8] = 0; // sorry guys, can only have up to eight chars for the player name
|
||||
}
|
||||
}
|
||||
|
||||
// Sort by name, except the <Create New Player> string if applicable
|
||||
qsort(&m[player_mode ? 1 : 0], NumItems - player_mode, sizeof(char *), (int (*)( const void *, const void * ))fname_sort_func);
|
||||
|
||||
if (player_mode)
|
||||
for ( i=0; i<NumItems; i++ )
|
||||
if (!stricmp(Players[Player_num].callsign, m[i]) )
|
||||
citem = i;
|
||||
|
||||
citem = newmenu_listbox1(title, NumItems, m, allow_abort_flag, citem, filename_menu_handler);
|
||||
|
||||
if ( citem > -1 )
|
||||
strncpy( filename, m[citem] + ((player_mode && m[citem][0]=='$')?1:0), PATH_MAX );
|
||||
|
||||
PHYSFS_freeList(find);
|
||||
d_free(m);
|
||||
|
||||
// The following wouldn't be necessary if the newmenu code didn't have its own loop
|
||||
if ((citem == K_DELETED) || ((citem == K_DELETED_DEMO) && NumItems > 1)) // NumItems was *before* a demo got deleted
|
||||
goto ReadFileNames;
|
||||
else if (citem == -1)
|
||||
return 0; // aborted
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int do_difficulty_menu()
|
||||
{
|
||||
int s;
|
||||
|
|
|
@ -24,6 +24,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|||
extern int DoMenu();
|
||||
extern void do_options_menu();
|
||||
extern void d2x_options_menu();
|
||||
extern int get_filename(char *title, char *type, char *filename, int allow_abort_flag);
|
||||
|
||||
#define MENU_PCX_MAC_SHARE ("menub.pcx")
|
||||
#define MENU_PCX_SHAREWARE ("menud.pcx")
|
||||
|
|
|
@ -3444,9 +3444,9 @@ void newdemo_stop_recording()
|
|||
{
|
||||
newmenu_item m[6];
|
||||
int exit;
|
||||
static char filename[15] = "", *s;
|
||||
static char filename[PATH_MAX] = "", *s;
|
||||
static sbyte tmpcnt = 0;
|
||||
char fullname[15+FILENAME_LEN] = DEMO_DIR;
|
||||
char fullname[PATH_MAX] = DEMO_DIR;
|
||||
|
||||
exit = 0;
|
||||
|
||||
|
@ -3460,7 +3460,7 @@ void newdemo_stop_recording()
|
|||
|
||||
if (filename[0] != '\0') {
|
||||
int num, i = strlen(filename) - 1;
|
||||
char newfile[15];
|
||||
char newfile[PATH_MAX];
|
||||
|
||||
while (isdigit(filename[i])) {
|
||||
i--;
|
||||
|
@ -3472,8 +3472,8 @@ void newdemo_stop_recording()
|
|||
num++;
|
||||
filename[i] = '\0';
|
||||
sprintf (newfile, "%s%d", filename, num);
|
||||
strncpy(filename, newfile, 8);
|
||||
filename[8] = '\0';
|
||||
strncpy(filename, newfile, PATH_MAX);
|
||||
filename[PATH_MAX] = '\0';
|
||||
}
|
||||
|
||||
try_again:
|
||||
|
@ -3481,21 +3481,21 @@ try_again:
|
|||
|
||||
Newmenu_allowed_chars = demoname_allowed_chars;
|
||||
if (!Newdemo_no_space) {
|
||||
m[0].type=NM_TYPE_INPUT; m[0].text_len = 8; m[0].text = filename;
|
||||
m[0].type=NM_TYPE_INPUT; m[0].text_len = PATH_MAX - 1; m[0].text = filename;
|
||||
exit = newmenu_do( NULL, TXT_SAVE_DEMO_AS, 1, &(m[0]), NULL );
|
||||
} else if (Newdemo_no_space == 1) {
|
||||
m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_DEMO_SAVE_BAD;
|
||||
m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = 8; m[1].text = filename;
|
||||
m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = PATH_MAX - 1; m[1].text = filename;
|
||||
exit = newmenu_do( NULL, NULL, 2, m, NULL );
|
||||
} else if (Newdemo_no_space == 2) {
|
||||
m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_DEMO_SAVE_NOSPACE;
|
||||
m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = 8; m[1].text = filename;
|
||||
m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = PATH_MAX - 1; m[1].text = filename;
|
||||
exit = newmenu_do( NULL, NULL, 2, m, NULL );
|
||||
}
|
||||
Newmenu_allowed_chars = NULL;
|
||||
|
||||
if (exit == -2) { // got bumped out from network menu
|
||||
char save_file[7+FILENAME_LEN];
|
||||
char save_file[PATH_MAX];
|
||||
|
||||
if (filename[0] != '\0') {
|
||||
strcpy(save_file, DEMO_DIR);
|
||||
|
|
476
main/newmenu.c
476
main/newmenu.c
|
@ -1464,482 +1464,6 @@ int nm_messagebox( char *title, int nchoices, ... )
|
|||
return newmenu_do( title, nm_text, nchoices, nm_message_items, NULL );
|
||||
}
|
||||
|
||||
/* Honestly I think we don't ened this function anymore since PhysFS already takes care about
|
||||
sorting files. However I keep it since:
|
||||
a) it's just one function
|
||||
b) works with FILENAME_LEN so it doesn'T break if we decide to support more than 8+3 filename length
|
||||
c) I am not sure if PhysFS sorty correctly on all platforms
|
||||
*/
|
||||
void newmenu_file_sort( int n, char *list )
|
||||
{
|
||||
int i, j, incr;
|
||||
char t[(FILENAME_LEN+1)];
|
||||
|
||||
incr = n / 2;
|
||||
while( incr > 0 ) {
|
||||
for (i=incr; i<n; i++ ) {
|
||||
j = i - incr;
|
||||
while (j>=0 ) {
|
||||
if (strncmp(&list[j*(FILENAME_LEN+1)], &list[(j+incr)*(FILENAME_LEN+1)], FILENAME_LEN-1) > 0) {
|
||||
memcpy( t, &list[j*(FILENAME_LEN+1)], FILENAME_LEN );
|
||||
memcpy( &list[j*(FILENAME_LEN+1)], &list[(j+incr)*(FILENAME_LEN+1)], FILENAME_LEN );
|
||||
memcpy( &list[(j+incr)*(FILENAME_LEN+1)], t, FILENAME_LEN );
|
||||
j -= incr;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
incr = incr / 2;
|
||||
}
|
||||
}
|
||||
|
||||
void delete_player_saved_games(char * name)
|
||||
{
|
||||
int i;
|
||||
char filename[FILENAME_LEN + 9];
|
||||
|
||||
for (i=0;i<10; i++)
|
||||
{
|
||||
sprintf( filename, GameArg.SysUsePlayersDir? "Players/%s.sg%x" : "%s.sg%x", name, i );
|
||||
|
||||
PHYSFS_delete(filename);
|
||||
}
|
||||
}
|
||||
|
||||
#define MAX_FILES 300
|
||||
|
||||
int newmenu_get_filename(char *title, char *type, char *filename, int allow_abort_flag)
|
||||
{
|
||||
int i;
|
||||
char **find;
|
||||
char **f;
|
||||
char *ext;
|
||||
int NumFiles=0, key,done, citem, ocitem;
|
||||
char * filenames = NULL;
|
||||
int NumFiles_displayed = 8;
|
||||
int first_item = -1, ofirst_item;
|
||||
int old_keyd_repeat = keyd_repeat;
|
||||
int player_mode=0;
|
||||
int demo_mode=0;
|
||||
int demos_deleted=0;
|
||||
int initialized = 0;
|
||||
int exit_value = 0;
|
||||
int w_x, w_y, w_w, w_h, title_height, height=0;
|
||||
int box_x, box_y, box_w, box_h;
|
||||
#ifdef NEWMENU_MOUSE
|
||||
int mx, my, mz, x1, x2, y1, y2, mouse_state, omouse_state;
|
||||
int mouse2_state, omouse2_state;
|
||||
int dblclick_flag=0;
|
||||
#endif
|
||||
|
||||
w_x=w_y=w_w=w_h=title_height=0;
|
||||
box_x=box_y=box_w=box_h=0;
|
||||
|
||||
filenames = d_malloc( MAX_FILES * (FILENAME_LEN+1) );
|
||||
if (filenames==NULL) return 0;
|
||||
|
||||
newmenu_close();
|
||||
citem = 0;
|
||||
keyd_repeat = 1;
|
||||
|
||||
if (!stricmp(type, ".plr"))
|
||||
player_mode = 1;
|
||||
else if (!stricmp(type, ".dem"))
|
||||
demo_mode = 1;
|
||||
|
||||
ReadFileNames:
|
||||
done = 0;
|
||||
NumFiles=0;
|
||||
|
||||
if (player_mode) {
|
||||
strncpy( &filenames[NumFiles*(FILENAME_LEN+1)], TXT_CREATE_NEW, FILENAME_LEN );
|
||||
NumFiles++;
|
||||
}
|
||||
|
||||
find = PHYSFS_enumerateFiles(demo_mode ? DEMO_DIR : ((player_mode && GameArg.SysUsePlayersDir) ? "Players/" : ""));
|
||||
for (f = find; *f != NULL; f++)
|
||||
{
|
||||
ext = strrchr(*f, '.');
|
||||
if (!ext || strnicmp(ext, type, 4))
|
||||
continue;
|
||||
|
||||
if (NumFiles < MAX_FILES)
|
||||
{
|
||||
strncpy(&filenames[NumFiles*(FILENAME_LEN+1)],*f,FILENAME_LEN);
|
||||
if (player_mode)
|
||||
{
|
||||
char *p;
|
||||
|
||||
p = strchr(&filenames[NumFiles*(FILENAME_LEN+1)], '.');
|
||||
if (p)
|
||||
*p = '\0';
|
||||
}
|
||||
NumFiles++;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
PHYSFS_freeList(find);
|
||||
|
||||
if ( (NumFiles < 1) && demos_deleted ) {
|
||||
exit_value = 0;
|
||||
goto ExitFileMenu;
|
||||
}
|
||||
if ( (NumFiles < 1) && demo_mode ) {
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s\n%s", TXT_NO_DEMO_FILES, TXT_USE_F5, TXT_TO_CREATE_ONE);
|
||||
exit_value = 0;
|
||||
goto ExitFileMenu;
|
||||
}
|
||||
|
||||
if ( (NumFiles < 2) && player_mode ) {
|
||||
citem = 0;
|
||||
goto ExitFileMenuEarly;
|
||||
}
|
||||
|
||||
|
||||
if ( NumFiles<1 ) {
|
||||
nm_messagebox(NULL, 1, "Ok", "%s\n '%s' %s", TXT_NO_FILES_MATCHING, type, TXT_WERE_FOUND);
|
||||
exit_value = 0;
|
||||
goto ExitFileMenu;
|
||||
}
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
gr_set_current_canvas(NULL);
|
||||
|
||||
gr_set_curfont(MEDIUM3_FONT);
|
||||
|
||||
box_w = 0;
|
||||
for (i=0; i<NumFiles; i++ ) {
|
||||
int w, h, aw;
|
||||
gr_get_string_size( &filenames[i*(FILENAME_LEN+1)], &w, &h, &aw );
|
||||
if ( w > box_w )
|
||||
box_w = w+FSPACX(10);
|
||||
}
|
||||
|
||||
height = (LINE_SPACING * NumFiles_displayed);
|
||||
|
||||
{
|
||||
int w, h, aw;
|
||||
gr_get_string_size( title, &w, &h, &aw );
|
||||
if ( w > box_w )
|
||||
box_w = w;
|
||||
title_height = h+FSPACY(5);
|
||||
}
|
||||
|
||||
box_x = (grd_curcanv->cv_bitmap.bm_w-box_w)/2;
|
||||
box_y = (grd_curcanv->cv_bitmap.bm_h-(height+title_height))/2 + title_height;
|
||||
if ( box_y < title_height )
|
||||
box_y = title_height;
|
||||
|
||||
initialized = 1;
|
||||
}
|
||||
|
||||
if ( !player_mode ) {
|
||||
newmenu_file_sort( NumFiles, filenames );
|
||||
} else {
|
||||
newmenu_file_sort( NumFiles-1, &filenames[(FILENAME_LEN+1)] ); // Don't sort first one!
|
||||
for ( i=0; i<NumFiles; i++ ) {
|
||||
if (!stricmp(Players[Player_num].callsign, &filenames[i*(FILENAME_LEN+1)]) ) {
|
||||
#ifdef NEWMENU_MOUSE
|
||||
dblclick_flag = 1;
|
||||
#endif
|
||||
citem = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nm_draw_background1(NULL);
|
||||
|
||||
#ifdef NEWMENU_MOUSE
|
||||
mouse_state = omouse_state = 0;
|
||||
mouse2_state = omouse2_state = 0;
|
||||
newmenu_show_cursor();
|
||||
#endif
|
||||
|
||||
while(!done) {
|
||||
timer_delay2(50);
|
||||
|
||||
ocitem = citem;
|
||||
ofirst_item = first_item;
|
||||
|
||||
gr_flip();
|
||||
#ifdef OGL
|
||||
nm_draw_background1(NULL);
|
||||
#endif
|
||||
nm_draw_background( box_x-BORDERX,box_y-title_height-BORDERY,box_x+box_w+BORDERX,box_y+height+BORDERY );
|
||||
gr_set_curfont(MEDIUM3_FONT);
|
||||
gr_string( 0x8000, box_y - title_height, title );
|
||||
|
||||
#ifdef NEWMENU_MOUSE
|
||||
omouse_state = mouse_state;
|
||||
omouse2_state = mouse2_state;
|
||||
mouse_state = mouse_button_state(0);
|
||||
mouse2_state = mouse_button_state(1);
|
||||
#endif
|
||||
|
||||
//see if redbook song needs to be restarted
|
||||
RBACheckFinishedHook();
|
||||
|
||||
key = key_inkey();
|
||||
|
||||
switch(key) {
|
||||
#ifdef macintosh
|
||||
case KEY_COMMAND+KEY_SHIFTED+KEY_3:
|
||||
#endif
|
||||
case KEY_PRINT_SCREEN:
|
||||
save_screen_shot(0);
|
||||
break;
|
||||
|
||||
case KEY_CTRLED+KEY_D:
|
||||
if ( ((player_mode)&&(citem>0)) || ((demo_mode)&&(citem>=0)) ) {
|
||||
int x = 1;
|
||||
newmenu_hide_cursor();
|
||||
if (player_mode)
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "%s %s?", TXT_DELETE_PILOT, &filenames[citem*(FILENAME_LEN+1)]+((player_mode && filenames[citem*(FILENAME_LEN+1)]=='$')?1:0) );
|
||||
else if (demo_mode)
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "%s %s?", TXT_DELETE_DEMO, &filenames[citem*(FILENAME_LEN+1)]+((demo_mode && filenames[citem*(FILENAME_LEN+1)]=='$')?1:0) );
|
||||
newmenu_show_cursor();
|
||||
if (x==0) {
|
||||
char * p;
|
||||
char plxfile[PATH_MAX];
|
||||
int ret;
|
||||
char name[PATH_MAX];
|
||||
|
||||
p = &filenames[(citem*(FILENAME_LEN+1))+strlen(&filenames[citem*(FILENAME_LEN+1)])];
|
||||
if (player_mode)
|
||||
*p = '.';
|
||||
|
||||
strcpy(name, demo_mode ? DEMO_DIR : ((player_mode && GameArg.SysUsePlayersDir) ? "Players/" : ""));
|
||||
strcat(name,&filenames[citem*(FILENAME_LEN+1)]);
|
||||
|
||||
ret = !PHYSFS_delete(name);
|
||||
if (player_mode)
|
||||
*p = 0;
|
||||
|
||||
if ((!ret) && player_mode) {
|
||||
delete_player_saved_games( &filenames[citem*(FILENAME_LEN+1)] );
|
||||
// delete PLX file
|
||||
sprintf(plxfile, GameArg.SysUsePlayersDir? "Players/%.8s.plx" : "%.8s.plx", &filenames[citem*(FILENAME_LEN+1)]);
|
||||
if (cfexist(plxfile))
|
||||
PHYSFS_delete(plxfile);
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
if (player_mode)
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s %s", TXT_COULDNT, TXT_DELETE_PILOT, &filenames[citem*(FILENAME_LEN+1)]+((player_mode && filenames[citem*(FILENAME_LEN+1)]=='$')?1:0) );
|
||||
else if (demo_mode)
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s %s", TXT_COULDNT, TXT_DELETE_DEMO, &filenames[citem*(FILENAME_LEN+1)]+((demo_mode && filenames[citem*(FILENAME_LEN+1)]=='$')?1:0) );
|
||||
} else if (demo_mode)
|
||||
demos_deleted = 1;
|
||||
first_item = -1;
|
||||
goto ReadFileNames;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_CTRLED+KEY_C:
|
||||
if (demo_mode)
|
||||
{
|
||||
int x = 1;
|
||||
char bakname[PATH_MAX];
|
||||
|
||||
// Get backup name
|
||||
change_filename_extension(bakname, &filenames[citem*(FILENAME_LEN+1)]+((demo_mode && filenames[citem*(FILENAME_LEN+1)]=='$')?1:0), DEMO_BACKUP_EXT);
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "Are you sure you want to\n"
|
||||
"swap the endianness of\n"
|
||||
"%s? If the file is\n"
|
||||
"already endian native, D2X\n"
|
||||
"will likely crash. A backup\n"
|
||||
"%s will be created", &filenames[citem*(FILENAME_LEN+1)]+((demo_mode && filenames[citem*(FILENAME_LEN+1)]=='$')?1:0), bakname );
|
||||
if (x)
|
||||
break;
|
||||
|
||||
newdemo_swap_endian(&filenames[citem*(FILENAME_LEN+1)]);
|
||||
}
|
||||
break;
|
||||
case KEY_HOME:
|
||||
case KEY_PAD7:
|
||||
citem = 0;
|
||||
break;
|
||||
case KEY_END:
|
||||
case KEY_PAD1:
|
||||
citem = NumFiles-1;
|
||||
break;
|
||||
case KEY_UP:
|
||||
case KEY_PAD8:
|
||||
citem--;
|
||||
break;
|
||||
case KEY_DOWN:
|
||||
case KEY_PAD2:
|
||||
citem++;
|
||||
break;
|
||||
case KEY_PAGEDOWN:
|
||||
case KEY_PAD3:
|
||||
citem += NumFiles_displayed;
|
||||
break;
|
||||
case KEY_PAGEUP:
|
||||
case KEY_PAD9:
|
||||
citem -= NumFiles_displayed;
|
||||
break;
|
||||
case KEY_ESC:
|
||||
if (allow_abort_flag) {
|
||||
citem = -1;
|
||||
done = 1;
|
||||
}
|
||||
break;
|
||||
case KEY_ENTER:
|
||||
case KEY_PADENTER:
|
||||
done = 1;
|
||||
break;
|
||||
|
||||
case KEY_ALTED+KEY_ENTER:
|
||||
case KEY_ALTED+KEY_PADENTER:
|
||||
gr_toggle_fullscreen();
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
int ascii = key_ascii();
|
||||
if ( ascii < 255 ) {
|
||||
int cc,cc1;
|
||||
cc=cc1=citem+1;
|
||||
if (cc1 < 0 ) cc1 = 0;
|
||||
if (cc1 >= NumFiles ) cc1 = 0;
|
||||
while(1) {
|
||||
if ( cc < 0 ) cc = 0;
|
||||
if ( cc >= NumFiles ) cc = 0;
|
||||
if ( citem == cc ) break;
|
||||
|
||||
if ( toupper(filenames[cc*(FILENAME_LEN+1)]) == toupper(ascii) ) {
|
||||
citem = cc;
|
||||
break;
|
||||
}
|
||||
cc++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( done ) break;
|
||||
|
||||
|
||||
if (citem<0)
|
||||
citem=0;
|
||||
|
||||
if (citem>=NumFiles)
|
||||
citem = NumFiles-1;
|
||||
|
||||
if (citem< first_item)
|
||||
first_item = citem;
|
||||
|
||||
if (citem>=( first_item+NumFiles_displayed))
|
||||
{
|
||||
first_item = citem-NumFiles_displayed+1;
|
||||
}
|
||||
|
||||
if (NumFiles <= NumFiles_displayed )
|
||||
first_item = 0;
|
||||
|
||||
if (first_item>NumFiles-NumFiles_displayed)
|
||||
{
|
||||
first_item = NumFiles-NumFiles_displayed;
|
||||
}
|
||||
|
||||
if (first_item < 0 ) first_item = 0;
|
||||
|
||||
#ifdef NEWMENU_MOUSE
|
||||
if (mouse_state || mouse2_state) {
|
||||
int w, h, aw;
|
||||
|
||||
mouse_get_pos(&mx, &my, &mz);
|
||||
for (i=first_item; i<first_item+NumFiles_displayed; i++ ) {
|
||||
gr_get_string_size(&filenames[i*(FILENAME_LEN+1)], &w, &h, &aw );
|
||||
x1 = box_x;
|
||||
x2 = box_x + box_w;
|
||||
y1 = (i-first_item)*LINE_SPACING + box_y;
|
||||
y2 = y1+h;
|
||||
if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) {
|
||||
if (i == citem && !mouse2_state) {
|
||||
break;
|
||||
}
|
||||
citem = i;
|
||||
dblclick_flag = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!mouse_state && omouse_state) {
|
||||
int w, h, aw;
|
||||
|
||||
gr_get_string_size(&filenames[citem*(FILENAME_LEN+1)], &w, &h, &aw );
|
||||
mouse_get_pos(&mx, &my, &mz);
|
||||
x1 = box_x;
|
||||
x2 = box_x + box_w;
|
||||
y1 = (citem-first_item)*LINE_SPACING + box_y;
|
||||
y2 = y1+h;
|
||||
if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) {
|
||||
if (dblclick_flag) done = 1;
|
||||
else dblclick_flag = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
gr_setcolor( BM_XRGB( 0,0,0) );
|
||||
for (i=first_item; i<first_item+NumFiles_displayed; i++ ) {
|
||||
int w, h, aw, y;
|
||||
y = (i-first_item)*LINE_SPACING + box_y;
|
||||
|
||||
if ( i >= NumFiles ) {
|
||||
gr_setcolor( BM_XRGB(5,5,5));
|
||||
gr_rect( box_x + box_w - FSPACX(1), y-FSPACY(1), box_x + box_w, y + LINE_SPACING);
|
||||
gr_setcolor( BM_XRGB(2,2,2));
|
||||
gr_rect( box_x - FSPACX(1), y - FSPACY(1), box_x, y + LINE_SPACING );
|
||||
gr_setcolor( BM_XRGB(0,0,0));
|
||||
gr_rect( box_x, y - FSPACY(1), box_x + box_w - FSPACX(1), y + LINE_SPACING);
|
||||
} else {
|
||||
if ( i == citem )
|
||||
gr_set_curfont(MEDIUM2_FONT);
|
||||
else
|
||||
gr_set_curfont(MEDIUM1_FONT);
|
||||
gr_get_string_size(&filenames[i*(FILENAME_LEN+1)], &w, &h, &aw );
|
||||
|
||||
gr_setcolor( BM_XRGB(5,5,5));
|
||||
gr_rect( box_x + box_w - FSPACX(1), y-FSPACY(1), box_x + box_w, y + LINE_SPACING);
|
||||
gr_setcolor( BM_XRGB(2,2,2));
|
||||
gr_rect( box_x - FSPACX(1), y - FSPACY(1), box_x, y + LINE_SPACING );
|
||||
gr_setcolor( BM_XRGB(0,0,0));
|
||||
gr_rect( box_x, y - FSPACY(1), box_x + box_w - FSPACX(1), y + LINE_SPACING);
|
||||
|
||||
gr_string( box_x + FSPACX(5), y, (&filenames[i*(FILENAME_LEN+1)])+((player_mode && filenames[i*(FILENAME_LEN+1)]=='$')?1:0) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NEWMENU_MOUSE
|
||||
newmenu_hide_cursor();
|
||||
#endif
|
||||
|
||||
ExitFileMenuEarly:
|
||||
if ( citem > -1 ) {
|
||||
strncpy( filename, (&filenames[citem*(FILENAME_LEN+1)])+((player_mode && filenames[citem*(FILENAME_LEN+1)]=='$')?1:0), FILENAME_LEN );
|
||||
exit_value = 1;
|
||||
} else {
|
||||
exit_value = 0;
|
||||
}
|
||||
|
||||
ExitFileMenu:
|
||||
keyd_repeat = old_keyd_repeat;
|
||||
|
||||
if ( filenames )
|
||||
d_free(filenames);
|
||||
|
||||
return exit_value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Example listbox callback function...
|
||||
// int lb_callback( int * citem, int *nitems, char * items[], int *keypress )
|
||||
// {
|
||||
|
|
|
@ -102,9 +102,6 @@ int nm_messagebox1(char *title, void (*subfunction)(int nitems, newmenu_item *it
|
|||
void nm_draw_background(int x1, int y1, int x2, int y2);
|
||||
void nm_restore_background(int x, int y, int w, int h);
|
||||
|
||||
// Returns 0 if no file selected, else filename is filled with selected file.
|
||||
int newmenu_get_filename(char *title, char *filespec, char *filename, int allow_abort_flag);
|
||||
|
||||
extern char *Newmenu_allowed_chars;
|
||||
|
||||
// Example listbox callback function...
|
||||
|
@ -140,13 +137,12 @@ int nm_messagebox_fixedfont(char *title, int nchoices, ...);
|
|||
//should be called whenever the palette changes
|
||||
extern void newmenu_close();
|
||||
|
||||
# define NEWMENU_MOUSE
|
||||
#define NEWMENU_MOUSE
|
||||
|
||||
# include <SDL/SDL.h>
|
||||
# define newmenu_show_cursor() if (!GameArg.CtlNoMouse) SDL_ShowCursor(SDL_ENABLE)
|
||||
# define newmenu_hide_cursor() SDL_ShowCursor(SDL_DISABLE)
|
||||
|
||||
#endif /* _NEWMENU_H */
|
||||
|
||||
#define NORMAL_CHECK_BOX "<22>"
|
||||
#define CHECKED_CHECK_BOX "‚"
|
||||
|
@ -164,3 +160,5 @@ extern void newmenu_close();
|
|||
#define BORDERX (15*(SWIDTH/320))
|
||||
#define BORDERY (15*(SHEIGHT/200))
|
||||
|
||||
#endif /* _NEWMENU_H */
|
||||
|
||||
|
|
Loading…
Reference in a new issue