From 237ac76ce25c5c9809a0244e67f9ba963350796a Mon Sep 17 00:00:00 2001 From: doom <61824552+JustDoom@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:22:40 +1000 Subject: [PATCH] Switch from nativefiledialog-extended to using SDL's built in file dialog --- .github/workflows/build.yml | 31 +--------- .gitmodules | 3 - CMakeLists.txt | 6 +- README.md | 3 +- dependencies/CMakeLists.txt | 2 - dependencies/nativefiledialog | 1 - src/emulator/Renderer.cpp | 4 +- src/sdl/MainMenu.cpp | 105 ++++++++++++++++++++-------------- src/sdl/MainMenu.h | 7 +-- 9 files changed, 71 insertions(+), 91 deletions(-) delete mode 160000 dependencies/nativefiledialog diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4296f58..49531a3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -58,8 +58,6 @@ jobs: mkdir -p output ls build ls build/bin -# cp build/bin/8ChocChip output/ -# cp -r build/bin/assets output/ - name: Upload executable uses: actions/upload-artifact@v4 @@ -125,11 +123,7 @@ jobs: dir build dir build/bin dir build/bin/Release - cp build/dependencies/nativefiledialog/src/Release/* build/bin/Release cp build/out/Release/libconfig++.* build/bin/Release -# cp build/src/Release/* build/bin/ -# cp build/src/Release/assets/* build/bin/assets -# cp -r assets output/ - name: Upload build artifacts uses: actions/upload-artifact@v4 @@ -139,27 +133,4 @@ jobs: - name: Test working-directory: ${{ steps.strings.outputs.build-output-dir }} - run: ctest --build-config ${{ matrix.build_type }} - - - # build-macos: - # runs-on: macos-latest - - # steps: - # - name: Checkout code - # uses: actions/checkout@v2 - - # - name: Install dependencies - # run: brew update && brew install cmake sfml - - # - name: Configure and build - # run: | - # mkdir build && cd build - # cmake .. - # cmake --build . - - # - name: Upload executable - # uses: actions/upload-artifact@v2 - # with: - # name: macos-executable - # path: build/src/8ChocChip + run: ctest --build-config ${{ matrix.build_type }} \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 669f44f..0e7bc15 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "dependencies/sdl"] path = dependencies/sdl url = git@github.com:libsdl-org/SDL.git -[submodule "dependencies/nativefiledialog"] - path = dependencies/nativefiledialog - url = git@github.com:btzy/nativefiledialog-extended.git [submodule "dependencies/libconfig"] path = dependencies/libconfig url = https://github.com/hyperrealm/libconfig.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 75a5031..209298b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ else() set(libname "config") endif() -target_link_libraries(8ChocChip PRIVATE SDL3::SDL3 SDL3_ttf::SDL3_ttf nfd ${libname}++) +target_link_libraries(8ChocChip PRIVATE SDL3::SDL3 SDL3_ttf::SDL3_ttf ${libname}++) set_target_properties(8ChocChip PROPERTIES INSTALL_RPATH "$ORIGIN" @@ -28,10 +28,6 @@ set_target_properties(8ChocChip PROPERTIES # Copy nfd and config++ libraries to the executable directory if (UNIX AND NOT APPLE) - add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - "$" - "$") add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "$" diff --git a/README.md b/README.md index b66d6a8..cfe3eb1 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ 8ChocChip is an emulator for the Chip8 software that I am working on to learn the basics around emulation. This uses SDL to handle graphics, input, audio and some other small things. -libconfig is used to manage config and save data files, and NativeFileDialog-extended is used for basic popup windows like the file/directory selector. +libconfig is used to manage config and save data files. ## TODO @@ -48,5 +48,4 @@ Thanks to these two blogs that helped me through creating this emulator. These a Currently, three libraries are being used - [SDL](https://github.com/libsdl-org/SDL) - UI, graphics, input and sounds -- [NativeFileDialog-extended](https://github.com/btzy/nativefiledialog-extended) - Handles file dialogs for selecting files/directories. Fork of [nativefiledialog](https://github.com/mlabbe/nativefiledialog) which I used a fork of that added only CMake support, this new one adds that plus new fixes/features - [libconfig](https://github.com/hyperrealm/libconfig) - Library to manage save data (like directories that hold ROMs) and possible future config files diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt index 1ad37b3..fa1a6c2 100644 --- a/dependencies/CMakeLists.txt +++ b/dependencies/CMakeLists.txt @@ -1,5 +1,3 @@ -add_subdirectory(nativefiledialog) - set(BUILD_EXAMPLES OFF CACHE BOOL "Disable examples for libconfig" FORCE) set(BUILD_TESTS ON CACHE BOOL "Disable tests for libconfig" FORCE) add_subdirectory(libconfig EXCLUDE_FROM_ALL) diff --git a/dependencies/nativefiledialog b/dependencies/nativefiledialog deleted file mode 160000 index 388549a..0000000 --- a/dependencies/nativefiledialog +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 388549a5badaa7cbd138f5f189f50c67d5bf060c diff --git a/src/emulator/Renderer.cpp b/src/emulator/Renderer.cpp index 28445f5..66ab55f 100644 --- a/src/emulator/Renderer.cpp +++ b/src/emulator/Renderer.cpp @@ -17,8 +17,8 @@ void Renderer::render(SDL_Renderer* renderer) { bool Renderer::setPixel(uint8_t x, uint16_t y) { // Wrap around if x or y is out of bounds - x %= this->columns; - y %= this->rows; + // x %= this->columns; + // y %= this->rows; const uint16_t pixelLoc = x + (y * this->columns); this->display[pixelLoc] = !this->display[pixelLoc]; diff --git a/src/sdl/MainMenu.cpp b/src/sdl/MainMenu.cpp index 3bc70e9..b1cecfc 100644 --- a/src/sdl/MainMenu.cpp +++ b/src/sdl/MainMenu.cpp @@ -16,7 +16,8 @@ MainMenu::MainMenu(TTF_Font* font, std::string configFilePath, std::unordered_map> &romFiles, std::vector &romDirectories, std::vector> &windows) : - configFilePath(configFilePath), romDirectories(romDirectories), romFiles(romFiles), windows(windows), font(font) {} + configFilePath(configFilePath), romDirectories(romDirectories), romFiles(romFiles), windows(windows), font(font), + mutex(SDL_CreateMutex()) {} void MainMenu::init() { Window::init(); @@ -90,47 +91,7 @@ void MainMenu::update() { if (this->chooseFolder->isJustClicked()) { - if (nfdresult_t result = PickFolder(this->outPath); result == NFD_OKAY) { - libconfig::Config config; - config.readFile(this->configFilePath); - - libconfig::Setting &settings = config.getRoot(); - - if (!settings.exists("directories")) { - settings.add("directories", libconfig::Setting::TypeArray); - } - - libconfig::Setting &directories = settings["directories"]; - directories.add(libconfig::Setting::TypeString) = this->outPath.get(); - - this->romDirectories.emplace_back(this->outPath.get()); - - for (const auto &file: std::filesystem::directory_iterator(this->outPath.get())) { - if (file.is_directory()) { - continue; // TODO: Make sure its a file that can be emulated, at least basic checks so it isn't like - // a word doc - } - - printf("Processing file - : %s\n", file.path().c_str()); - - // Check if the rom directory doesn't exist in romFiles, then add it - if (this->romFiles.find(&this->romDirectories.back()) == this->romFiles.end()) { - this->romFiles.emplace(&this->romDirectories.back(), std::vector()); - } - - // Add the file path to the romFiles entry - this->romFiles.find(&this->romDirectories.back())->second.emplace_back(file.path().string()); - - TTF_Text* text = TTF_CreateText(this->textEngine, this->font, file.path().filename().string().c_str(), 0); - if (!text) { - SDL_Log("Failed to create text: %s\n", SDL_GetError()); - return; - } - - this->roms.emplace(file.path().string(), TextButton(0, 25.0f * this->roms.size(), WIDTH, 25, text)); - } - config.writeFile(this->configFilePath); - } + SDL_ShowOpenFolderDialog(callback, this, this->window, "/home", false); } this->inputHandler.updateLastKeys(); @@ -169,9 +130,69 @@ void MainMenu::close() { window->close(); } TTF_DestroyRendererTextEngine(this->textEngine); + SDL_DestroyMutex(this->mutex); Window::close(); } void MainMenu::refreshRoms() { +} + +void MainMenu::callback(void* userdata, const char* const* directory, int filter) { + if (!directory) { + SDL_Log("An error occured: %s", SDL_GetError()); + return; + } + if (!*directory) { + SDL_Log("The user did not select any file."); + SDL_Log("Most likely, the dialog was canceled."); + return; + } + + auto* instance = static_cast(userdata); + + std::cout << *directory << std::endl; + std::string directoryString = *directory; + + SDL_LockMutex(instance->mutex); + libconfig::Config config; + config.readFile(instance->configFilePath); + + libconfig::Setting &settings = config.getRoot(); + + if (!settings.exists("directories")) { + settings.add("directories", libconfig::Setting::TypeArray); + } + + libconfig::Setting &directories = settings["directories"]; + directories.add(libconfig::Setting::TypeString) = directoryString; + + instance->romDirectories.emplace_back(directoryString); + + for (const auto &file: std::filesystem::directory_iterator(directoryString)) { + if (file.is_directory()) { + continue; // TODO: Make sure its a file that can be emulated, at least basic checks so it isn't like + // a word doc + } + + printf("Processing file - : %s\n", file.path().c_str()); + + // Check if the rom directory doesn't exist in romFiles, then add it + if (instance->romFiles.find(&instance->romDirectories.back()) == instance->romFiles.end()) { + instance->romFiles.emplace(&instance->romDirectories.back(), std::vector()); + } + + // Add the file path to the romFiles entry + instance->romFiles.find(&instance->romDirectories.back())->second.emplace_back(file.path().string()); + + TTF_Text *text = TTF_CreateText(instance->textEngine, instance->font, file.path().filename().string().c_str(), 0); + if (!text) { + SDL_Log("Failed to create text: %s\n", SDL_GetError()); + return; + } + + instance->roms.emplace(file.path().string(), TextButton(0, 25.0f * instance->roms.size(), WIDTH, 25, text)); + } + config.writeFile(instance->configFilePath); + SDL_UnlockMutex(instance->mutex); } diff --git a/src/sdl/MainMenu.h b/src/sdl/MainMenu.h index 2f5b1cd..b6e230e 100644 --- a/src/sdl/MainMenu.h +++ b/src/sdl/MainMenu.h @@ -1,11 +1,11 @@ #ifndef MAINMENU_H #define MAINMENU_H +#include #include #include #include -#include #include #include "InputHandler.h" @@ -19,9 +19,6 @@ class MainMenu : public Window { std::unordered_map>& romFiles; std::vector>& windows; - NFD::Guard nfdGuard; - NFD::UniquePath outPath; - std::unordered_map roms; std::unique_ptr chooseFolder; @@ -29,6 +26,7 @@ class MainMenu : public Window { TTF_TextEngine* textEngine; TTF_Font* font = nullptr; + SDL_Mutex* mutex; public: MainMenu(TTF_Font* font, std::string configFilePath, std::unordered_map>& romFiles, std::vector& romDirectories, @@ -42,6 +40,7 @@ class MainMenu : public Window { void close() override; void refreshRoms(); + static void SDLCALL callback(void* userdata, const char* const* filelist, int filter); }; #endif \ No newline at end of file