#include "zelda_support.h" #include #include "nfd.h" #include "RmlUi/Core.h" namespace zelda64 { // MARK: - Internal Helpers void perform_file_dialog_operation(const std::function& callback) { nfdnchar_t* native_path = nullptr; nfdresult_t result = NFD_OpenDialogN(&native_path, nullptr, 0, nullptr); bool success = (result == NFD_OKAY); std::filesystem::path path; if (success) { path = std::filesystem::path{native_path}; NFD_FreePathN(native_path); } callback(success, path); } // MARK: - Public API std::filesystem::path get_asset_path(const char* asset) { std::filesystem::path base_path = ""; #if defined(__APPLE__) base_path = get_bundle_resource_directory(); #endif return base_path / "assets" / asset; } void open_file_dialog(std::function callback) { #ifdef __APPLE__ dispatch_on_ui_thread([callback]() { perform_file_dialog_operation(callback); }); #else perform_file_dialog_operation(callback); #endif } void show_error_message_box(const char *title, const char *message) { #ifdef __APPLE__ std::string title_copy(title); std::string message_copy(message); dispatch_on_ui_thread([title_copy, message_copy] { SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title_copy.c_str(), message_copy.c_str(), nullptr); }); #else SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, message, nullptr); #endif } }