diff --git a/360/file_browser.c b/360/file_browser.c index 716a9c4c47..baae8e60ba 100644 --- a/360/file_browser.c +++ b/360/file_browser.c @@ -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"); } \ No newline at end of file diff --git a/360/file_browser.h b/360/file_browser.h index 70f251c5e3..6d3afcd6d2 100644 --- a/360/file_browser.h +++ b/360/file_browser.h @@ -16,18 +16,28 @@ * If not, see . */ +#include + #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); \ No newline at end of file +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]) \ No newline at end of file diff --git a/360/menu.cpp b/360/menu.cpp index 023d588932..7fdde89560 100644 --- a/360/menu.cpp +++ b/360/menu.cpp @@ -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; }