(360) Filebrowser can now load ROMs from subdir

This commit is contained in:
TwinAphex51224 2012-02-17 21:28:23 +01:00
parent 8e8f56b5e8
commit 471dfcd478
3 changed files with 49 additions and 7 deletions

View File

@ -30,6 +30,16 @@ static const char * filebrowser_get_extension(const char * filename)
return "";
}
static void filebrowser_clear_current_entries(filebrowser_t * filebrowser)
{
for(uint32_t i = 0; i < MAX_FILE_LIMIT; i++)
{
filebrowser->cur[filebrowser->file_count].d_type = 0;
filebrowser->cur[filebrowser->file_count].d_namlen = 0;
strcpy(filebrowser->cur[filebrowser->file_count].d_name, "\0");
}
}
void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path, const char *extensions)
{
int error = FALSE;
@ -60,6 +70,7 @@ void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path,
do
{
strcpy(filebrowser->dir[filebrowser->directory_stack_size], path);
bool found_dir = false;
if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
@ -100,4 +111,22 @@ error:
SSNES_ERR("Failed to open directory: \"%s\"\n", path);
}
FindClose(hFind);
}
void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir, const char * extensions)
{
filebrowser_clear_current_entries(filebrowser);
filebrowser->directory_stack_size = 0;
strcpy(filebrowser->extensions, extensions);
filebrowser_parse_directory(filebrowser, start_dir, filebrowser->extensions);
}
void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path, bool with_extension)
{
filebrowser->directory_stack_size++;
if(with_extension)
filebrowser_parse_directory(filebrowser, path, filebrowser->extensions);
else
filebrowser_parse_directory(filebrowser, path, "empty");
}

View File

@ -16,18 +16,28 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#define FATX_MAX_FILE_LIMIT 4096
#define MAX_FILE_LIMIT FATX_MAX_FILE_LIMIT
typedef struct {
unsigned d_type;
unsigned d_namlen;
CHAR d_name[MAX_PATH];
} DirectoryEntry;
typedef struct {
unsigned file_count; // amount of files in current directory
unsigned currently_selected; // currently selected browser entry
DirectoryEntry cur[FATX_MAX_FILE_LIMIT]; // current file listing
uint32_t directory_stack_size;
char dir[128][2048]; /* info on the current directory */
DirectoryEntry cur[MAX_FILE_LIMIT]; // current file listing
char extensions[512]; // allowed file extensions
} filebrowser_t;
void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path, const char *extensions);
void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir, const char * extensions);
void filebrowser_parse_directory(filebrowser_t * filebrowser, const char * path, const char *extensions);
void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path, bool with_extension);
#define FILEBROWSER_GET_CURRENT_DIRECTORY_NAME(filebrowser) (filebrowser.dir[filebrowser.directory_stack_size])

View File

@ -69,7 +69,7 @@ HRESULT CSSNES::UnregisterXuiClasses (void)
static void filebrowser_fetch_directory_entries(const char *path, CXuiList * romlist,
CXuiTextElement * rompath_title)
{
filebrowser_parse_directory(&browser, path, ssnes_console_get_rom_ext());
filebrowser_push_directory(&browser, path, true);
unsigned long dwNum_rompath = MultiByteToWideChar(CP_ACP, 0, path, -1, NULL, 0);
wchar_t * rompath_name = new wchar_t[dwNum_rompath];
@ -232,6 +232,8 @@ HRESULT CSSNESMain::OnInit(XUIMessageInit * pInitData, BOOL& bHandled)
HRESULT CSSNESFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
{
char path[MAX_PATH_LENGTH];
if(hObjPressed == m_romlist)
{
int index = m_romlist.GetCurSel();
@ -240,7 +242,7 @@ HRESULT CSSNESFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
memset(strbuffer, 0, sizeof(strbuffer));
wcstombs(strbuffer, (const wchar_t *)m_romlist.GetText(index), sizeof(strbuffer));
memset(g_console.rom_path, 0, sizeof(g_console.rom_path));
sprintf(g_console.rom_path, "%s%s", g_console.default_rom_startup_dir, strbuffer);
sprintf(g_console.rom_path, "%s%s", FILEBROWSER_GET_CURRENT_DIRECTORY_NAME(browser), strbuffer);
return_to_game();
g_console.initialize_ssnes_enable = 1;
@ -249,9 +251,8 @@ HRESULT CSSNESFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
{
memset(strbuffer, 0, sizeof(strbuffer));
wcstombs(strbuffer, (const wchar_t *)m_romlist.GetText(index), sizeof(strbuffer));
char strbuf[512];
snprintf(strbuf, sizeof(strbuf), "%s%s", g_console.default_rom_startup_dir, strbuffer);
filebrowser_fetch_directory_entries(strbuf, &m_romlist, &m_rompathtitle);
snprintf(path, sizeof(path), "%s%s\\", FILEBROWSER_GET_CURRENT_DIRECTORY_NAME(browser), strbuffer);
filebrowser_fetch_directory_entries(path, &m_romlist, &m_rompathtitle);
}
}
else if(hObjPressed == m_back)
@ -358,6 +359,8 @@ int menu_init (void)
XuiSceneNavigateFirst(app.GetRootObj(), app.hMainScene, XUSER_INDEX_FOCUS);
filebrowser_new(&browser, g_console.default_rom_startup_dir, ssnes_console_get_rom_ext());
return 0;
}