diff --git a/src/Client/Client.vcxproj.filters b/src/Client/Client.vcxproj.filters index d761e1cbd..6c2597dda 100644 --- a/src/Client/Client.vcxproj.filters +++ b/src/Client/Client.vcxproj.filters @@ -404,9 +404,6 @@ Source Files\Math - - Source Files\Graphics - Source Files\Graphics @@ -596,5 +593,8 @@ Source Files\Math + + Source Files\Graphics + \ No newline at end of file diff --git a/src/Client/Platform.h b/src/Client/Platform.h index 4f3092360..05a9112c5 100644 --- a/src/Client/Platform.h +++ b/src/Client/Platform.h @@ -27,6 +27,8 @@ DateTime Platform_CurrentLocalTime(void); bool Platform_DirectoryExists(STRING_PURE String* path); ReturnCode Platform_DirectoryCreate(STRING_PURE String* path); bool Platform_FileExists(STRING_PURE String* path); +typedef void Platform_EnumFilesCallback(STRING_PURE String* path, void* obj); +ReturnCode Platform_EnumFiles(STRING_PURE String* path, void* obj, Platform_EnumFilesCallback callback); ReturnCode Platform_FileCreate(void** file, STRING_PURE String* path); ReturnCode Platform_FileOpen(void** file, STRING_PURE String* path, bool readOnly); diff --git a/src/Client/Screens.c b/src/Client/Screens.c index 5c41d635f..d7ec9decc 100644 --- a/src/Client/Screens.c +++ b/src/Client/Screens.c @@ -511,8 +511,7 @@ typedef struct FilesScreen_ { } FilesScreen; FilesScreen FilesScreen_Instance; -String FilesScreen_Get(UInt32 index) { - FilesScreen* screen = &FilesScreen_Instance; +String FilesScreen_Get(FilesScreen* screen, UInt32 index) { if (index < screen->Entries.Count) { return StringsBuffer_UNSAFE_Get(&screen->Entries, index); } else { @@ -520,52 +519,51 @@ String FilesScreen_Get(UInt32 index) { } } -void FilesScreen_MakeText(ButtonWidget* widget, Int32 x, Int32 y, String* text) { - FilesScreen* screen = &FilesScreen_Instance; +void FilesScreen_MakeText(FilesScreen* screen, Int32 idx, Int32 x, Int32 y, String* text) { + ButtonWidget* widget = &screen->Buttons[idx]; ButtonWidget_Create(widget, text, 300, &screen->Font, screen->TextButtonClick); Widget_SetLocation(&widget->Base, ANCHOR_CENTRE, ANCHOR_CENTRE, x, y); } -void FilesScreen_Make(ButtonWidget* widget, Int32 x, Int32 y, String* text, Gui_MouseHandler onClick) { - FilesScreen* screen = &FilesScreen_Instance; +void FilesScreen_Make(FilesScreen* screen, Int32 idx, Int32 x, Int32 y, String* text, Gui_MouseHandler onClick) { + ButtonWidget* widget = &screen->Buttons[idx]; ButtonWidget_Create(widget, text, 40, &screen->Font, onClick); Widget_SetLocation(&widget->Base, ANCHOR_CENTRE, ANCHOR_CENTRE, x, y); } -void FilesScreen_UpdateArrows(void) { - FilesScreen* screen = &FilesScreen_Instance; +void FilesScreen_UpdateArrows(FilesScreen* screen) { Int32 start = FILES_SCREEN_ITEMS, end = screen->Entries.Count - FILES_SCREEN_ITEMS; screen->Buttons[5].Base.Disabled = screen->CurrentIndex < start; screen->Buttons[6].Base.Disabled = screen->CurrentIndex >= end; } -void FilesScreen_SetCurrentIndex(Int32 index) { - FilesScreen* screen = &FilesScreen_Instance; +void FilesScreen_SetCurrentIndex(FilesScreen* screen, Int32 index) { if (index >= screen->Entries.Count) index -= FILES_SCREEN_ITEMS; if (index < 0) index = 0; UInt32 i; for (i = 0; i < FILES_SCREEN_ITEMS; i++) { - String str = FilesScreen_Get(index + i); + String str = FilesScreen_Get(screen, index + i); ButtonWidget_SetText(&screen->Buttons[i], &str); } screen->CurrentIndex = index; - FilesScreen_UpdateArrows(); + FilesScreen_UpdateArrows(screen); } -void FilesScreen_PageClick(bool forward) { - FilesScreen* screen = &FilesScreen_Instance; +void FilesScreen_PageClick(FilesScreen* screen, bool forward) { Int32 delta = forward ? FILES_SCREEN_ITEMS : -FILES_SCREEN_ITEMS; - FilesScreen_SetCurrentIndex(screen->CurrentIndex + delta); + FilesScreen_SetCurrentIndex(screen, screen->CurrentIndex + delta); } bool FilesScreen_MoveBackwards(GuiElement* elem, Int32 x, Int32 y, MouseButton btn) { - LeftOnly(FilesScreen_PageClick(false)); + FilesScreen* screen = (FilesScreen*)elem; + LeftOnly(FilesScreen_PageClick(screen, false)); } bool FilesScreen_MoveForwards(GuiElement* elem, Int32 x, Int32 y, MouseButton btn) { - LeftOnly(FilesScreen_PageClick(true)); + FilesScreen* screen = (FilesScreen*)elem; + LeftOnly(FilesScreen_PageClick(screen, true)); } void FilesScreen_ContextLost(void* obj) { @@ -580,14 +578,14 @@ void FilesScreen_ContextRecreated(void* obj) { UInt32 i; for (i = 0; i < FILES_SCREEN_ITEMS; i++) { - String str = FilesScreen_Get(i); - FilesScreen_MakeText(&screen->Buttons[i], 0, 50 * (Int32)i - 100, &str); + String str = FilesScreen_Get(screen, i); + FilesScreen_MakeText(screen, i, 0, 50 * (Int32)i - 100, &str); } String lArrow = String_FromConst("<"); - FilesScreen_Make(&screen->Buttons[5], -220, 0, &lArrow, FilesScreen_MoveBackwards); + FilesScreen_Make(screen, 5, -220, 0, &lArrow, FilesScreen_MoveBackwards); String rArrow = String_FromConst(">"); - FilesScreen_Make(&screen->Buttons[6], 220, 0, &rArrow, FilesScreen_MoveForwards); + FilesScreen_Make(screen, 6, 220, 0, &rArrow, FilesScreen_MoveForwards); Screen_MakeDefaultBack(&screen->Buttons[7], false, &screen->Font, Screen_SwitchPause); screen->Widgets[0] = &screen->Title.Base; @@ -595,7 +593,7 @@ void FilesScreen_ContextRecreated(void* obj) { screen->Widgets[i + 1] = &screen->Buttons[i].Base; } ClickableScreen_Init(&screen->Clickable, &screen->Base.Base, screen->Widgets, Array_NumElements(screen->Widgets)); - FilesScreen_UpdateArrows(); + FilesScreen_UpdateArrows(screen); } void FilesScreen_Init(GuiElement* elem) { @@ -627,9 +625,9 @@ bool FilesScreen_HandlesKeyDown(GuiElement* elem, Key key) { if (key == Key_Escape) { Gui_SetNewScreen(NULL); } else if (key == Key_Left) { - FilesScreen_PageClick(false); + FilesScreen_PageClick(screen, false); } else if (key == Key_Right) { - FilesScreen_PageClick(true); + FilesScreen_PageClick(screen, true); } else { return false; } diff --git a/src/Client/WinPlatform.c b/src/Client/WinPlatform.c index 178614e23..00591e831 100644 --- a/src/Client/WinPlatform.c +++ b/src/Client/WinPlatform.c @@ -125,6 +125,30 @@ ReturnCode Platform_DirectoryCreate(STRING_PURE String* path) { return success ? 0 : GetLastError(); } +ReturnCode Platform_EnumFiles(STRING_PURE String* path, void* obj, Platform_EnumFilesCallback callback) { + /* Need to do directory\* to search for files in directory */ + UInt8 searchPatternBuffer[FILENAME_SIZE + 10]; + String searchPattern = String_InitAndClearArray(searchPatternBuffer); + String_AppendString(&searchPattern, path); + String_AppendConst(&searchPattern, "\\*"); + + WIN32_FIND_DATAA data; + HANDLE find = FindFirstFileA(searchPattern.buffer, &data); + if (find == INVALID_HANDLE_VALUE) return GetLastError(); + + do { + String filePath = String_FromRawArray(data.cFileName); + if (!(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + callback(&filePath, obj); + } + } while (FindNextFileA(find, &data)); + + /* get return code from FindNextFile before closing find handle */ + ReturnCode code = GetLastError(); + FindClose(find); + return code == ERROR_NO_MORE_FILES ? 0 : code; +} + ReturnCode Platform_FileOpen(void** file, STRING_PURE String* path, bool readOnly) { UINT32 access = GENERIC_READ;