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:
kreatordxx 2009-12-08 11:01:36 +00:00
parent 1603b87e40
commit 19806aa7ec
7 changed files with 222 additions and 497 deletions

View file

@ -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

View file

@ -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))

View file

@ -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;

View file

@ -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")

View file

@ -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);

View file

@ -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 )
// {

View file

@ -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 */