--- hatari/src/gui-sdl/dlgFileSelect.c 2019/04/01 07:12:22 1.1.1.2 +++ hatari/src/gui-sdl/dlgFileSelect.c 2019/04/01 07:13:50 1.1.1.4 @@ -6,14 +6,14 @@ A file selection dialog for the graphical user interface for Hatari. */ -char DlgFileSelect_rcsid[] = "Hatari $Id: dlgFileSelect.c,v 1.1.1.2 2019/04/01 07:12:22 root Exp $"; +const char DlgFileSelect_rcsid[] = "Hatari $Id: dlgFileSelect.c,v 1.1.1.4 2019/04/01 07:13:50 root Exp $"; #include #include #include -#include #include "main.h" +#include "scandir.h" #include "sdlgui.h" #include "file.h" #include "zip.h" @@ -24,13 +24,15 @@ char DlgFileSelect_rcsid[] = "Hatari $Id #define SGFSDLG_FILENAME 5 #define SGFSDLG_UPDIR 6 -#define SGFSDLG_ROOTDIR 7 -#define SGFSDLG_ENTRY1 10 -#define SGFSDLG_ENTRY16 25 -#define SGFSDLG_UP 26 -#define SGFSDLG_DOWN 27 -#define SGFSDLG_OKAY 28 -#define SGFSDLG_CANCEL 29 +#define SGFSDLG_HOMEDIR 7 +#define SGFSDLG_ROOTDIR 8 +#define SGFSDLG_ENTRY1 11 +#define SGFSDLG_ENTRY16 26 +#define SGFSDLG_UP 27 +#define SGFSDLG_DOWN 28 +#define SGFSDLG_SHOWHIDDEN 29 +#define SGFSDLG_OKAY 30 +#define SGFSDLG_CANCEL 31 #define DLGPATH_SIZE 62 @@ -51,7 +53,8 @@ static SGOBJ fsdlg[] = { SGTEXT, 0, 0, 1,3, DLGPATH_SIZE,1, dlgpath }, { SGTEXT, 0, 0, 1,4, 6,1, "File:" }, { SGTEXT, 0, 0, 7,4, DLGFNAME_SIZE,1, dlgfname }, - { SGBUTTON, 0, 0, 55,1, 4,1, ".." }, + { SGBUTTON, 0, 0, 51,1, 4,1, ".." }, + { SGBUTTON, 0, 0, 56,1, 3,1, "~" }, { SGBUTTON, 0, 0, 60,1, 3,1, "/" }, { SGBOX, 0, 0, 1,6, 62,16, NULL }, { SGBOX, 0, 0, 62,7, 1,14, NULL }, @@ -73,8 +76,9 @@ static SGOBJ fsdlg[] = { SGTEXT, SG_EXIT, 0, 2,21, DLGFILENAMES_SIZE,1, dlgfilenames[15] }, { SGBUTTON, SG_TOUCHEXIT, 0, 62,6, 1,1, "\x01" }, /* Arrow up */ { SGBUTTON, SG_TOUCHEXIT, 0, 62,21, 1,1, "\x02" }, /* Arrow down */ - { SGBUTTON, 0, 0, 14,23, 8,1, "Okay" }, - { SGBUTTON, 0, 0, 34,23, 8,1, "Cancel" }, + { SGCHECKBOX, SG_EXIT, SG_SELECTED, 2,23, 18,1, "Show hidden files" }, + { SGBUTTON, SG_DEFAULT, 0, 32,23, 8,1, "Okay" }, + { SGBUTTON, SG_CANCEL, 0, 50,23, 8,1, "Cancel" }, { -1, 0, 0, 0,0, 0,0, NULL } }; @@ -101,9 +105,9 @@ static int DlgFileSelect_RefreshEntries( } /* Copy entries to dialog: */ - for(i=0; id_name); - if( browsingzip ) + if (browsingzip) { - if( tempstr[strlen(tempstr)-1] == '/' ) + if (File_DoesFileNameEndWithSlash(tempstr)) dlgfilenames[i][0] = SGFOLDER; /* Mark folders */ } else @@ -138,6 +142,51 @@ static int DlgFileSelect_RefreshEntries( /*-----------------------------------------------------------------------*/ /* + Remove all hidden files (files with file names that begin with a dot) from + the list. +*/ +static void DlgFileSelect_RemoveHiddenFiles(struct dirent **files) +{ + int i; + int nActPos = -1; + int nOldEntries; + + nOldEntries = entries; + + /* Scan list for hidden files and remove them. */ + for (i = 0; i < nOldEntries; i++) + { + /* Does file name start with a dot? -> hidden file! */ + if (files[i]->d_name[0] == '.') + { + if (nActPos == -1) + nActPos = i; + /* Remove file from list: */ + free(files[i]); + files[i] = NULL; + entries -= 1; + } + } + + /* Now close the gaps in the list: */ + if (nActPos != -1) + { + for (i = nActPos; i < nOldEntries; i++) + { + if (files[i] != NULL) + { + /* Move entry to earlier position: */ + files[nActPos] = files[i]; + files[i] = NULL; + nActPos += 1; + } + } + } +} + + +/*-----------------------------------------------------------------------*/ +/* Prepare to scroll up one entry. */ static void DlgFileSelect_ScrollUp(void) @@ -170,6 +219,7 @@ static void DlgFileSelect_ScrollDown(voi */ static void DlgFileSelect_HandleSdlEvents(SDL_Event *pEvent) { + int oldypos = ypos; switch (pEvent->type) { case SDL_MOUSEBUTTONDOWN: @@ -181,45 +231,109 @@ static void DlgFileSelect_HandleSdlEvent case SDL_KEYDOWN: switch (pEvent->key.keysym.sym) { - case SDLK_UP: DlgFileSelect_ScrollUp(); break; - case SDLK_DOWN: DlgFileSelect_ScrollDown(); break; - case SDLK_HOME: ypos = 0; refreshentries = TRUE; break; - case SDLK_END: ypos = entries-SGFS_NUMENTRIES; refreshentries = TRUE; break; - case SDLK_PAGEUP: - if (ypos > SGFS_NUMENTRIES) - ypos -= SGFS_NUMENTRIES; - else - ypos = 0; - refreshentries = TRUE; - break; + case SDLK_UP: DlgFileSelect_ScrollUp(); break; + case SDLK_DOWN: DlgFileSelect_ScrollDown(); break; + case SDLK_HOME: ypos = 0; break; + case SDLK_END: ypos = entries-SGFS_NUMENTRIES; break; + case SDLK_PAGEUP: ypos -= SGFS_NUMENTRIES; break; case SDLK_PAGEDOWN: if (ypos+2*SGFS_NUMENTRIES < entries) ypos += SGFS_NUMENTRIES; else ypos = entries-SGFS_NUMENTRIES; - refreshentries = TRUE; break; - default: break; + default: + break; } break; + default: + break; + } + if (ypos < 0) + ypos = 0; + if (ypos != oldypos) + refreshentries = TRUE; +} + + +/*-----------------------------------------------------------------------*/ +/* + Free file entries +*/ +static struct dirent **files_free(struct dirent **files) +{ + int i; + if (files != NULL) + { + for(i=0; i= FILENAME_MAX) - { - fprintf(stderr, "SDLGui_FileSelect: Path name too long!\n"); - free(pStringMem); - return FALSE; - } - - /* Free old allocated memory: */ - if (files != NULL) - { - for(i=0; i