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;