consolidate file related functions, add nativefiledialog-extended to build
This commit is contained in:
@@ -34,6 +34,8 @@ foreach (FILE ${YAZE_RESOURCE_FILES})
|
|||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
add_subdirectory(lib/nativefiledialog-extended)
|
||||||
|
|
||||||
if (YAZE_BUILD_APP)
|
if (YAZE_BUILD_APP)
|
||||||
include(app/app.cmake)
|
include(app/app.cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -48,6 +48,11 @@ target_include_directories(
|
|||||||
${PROJECT_BINARY_DIR}
|
${PROJECT_BINARY_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_link_libraries(
|
||||||
|
yaze PRIVATE
|
||||||
|
nfd
|
||||||
|
)
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
yaze PUBLIC
|
yaze PUBLIC
|
||||||
asar-static
|
asar-static
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#include "app/core/platform/font_loader.h"
|
#include "app/core/platform/font_loader.h"
|
||||||
#include "app/editor/editor_manager.h"
|
#include "app/editor/editor_manager.h"
|
||||||
#include "app/gui/style.h"
|
#include "app/gui/style.h"
|
||||||
#include "core/utils/file_util.h"
|
#include "app/core/platform/file_dialog.h"
|
||||||
#include "imgui/backends/imgui_impl_sdl2.h"
|
#include "imgui/backends/imgui_impl_sdl2.h"
|
||||||
#include "imgui/backends/imgui_impl_sdlrenderer2.h"
|
#include "imgui/backends/imgui_impl_sdlrenderer2.h"
|
||||||
#include "imgui/imgui.h"
|
#include "imgui/imgui.h"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "absl/status/status.h"
|
#include "absl/status/status.h"
|
||||||
#include "app/core/platform/renderer.h"
|
#include "app/core/platform/renderer.h"
|
||||||
#include "app/core/utils/file_util.h"
|
#include "app/core/platform/file_dialog.h"
|
||||||
#include "app/editor/editor.h"
|
#include "app/editor/editor.h"
|
||||||
#include "app/editor/editor_manager.h"
|
#include "app/editor/editor_manager.h"
|
||||||
#include "imgui/backends/imgui_impl_sdl2.h"
|
#include "imgui/backends/imgui_impl_sdl2.h"
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ set(
|
|||||||
app/core/controller.cc
|
app/core/controller.cc
|
||||||
app/emu/emulator.cc
|
app/emu/emulator.cc
|
||||||
app/core/project.cc
|
app/core/project.cc
|
||||||
app/core/utils/file_util.cc
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (WIN32 OR MINGW OR UNIX AND NOT APPLE)
|
if (WIN32 OR MINGW OR UNIX AND NOT APPLE)
|
||||||
@@ -17,12 +16,12 @@ endif()
|
|||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
list(APPEND YAZE_APP_CORE_SRC
|
list(APPEND YAZE_APP_CORE_SRC
|
||||||
|
app/core/platform/file_dialog.cc
|
||||||
app/core/platform/file_dialog.mm
|
app/core/platform/file_dialog.mm
|
||||||
app/core/platform/app_delegate.mm
|
app/core/platform/app_delegate.mm
|
||||||
app/core/platform/font_loader.cc
|
app/core/platform/font_loader.cc
|
||||||
app/core/platform/font_loader.mm
|
app/core/platform/font_loader.mm
|
||||||
app/core/platform/clipboard.mm
|
app/core/platform/clipboard.mm
|
||||||
app/core/platform/file_path.mm
|
|
||||||
)
|
)
|
||||||
|
|
||||||
find_library(COCOA_LIBRARY Cocoa)
|
find_library(COCOA_LIBRARY Cocoa)
|
||||||
|
|||||||
@@ -4,11 +4,95 @@
|
|||||||
// Include Windows-specific headers
|
// Include Windows-specific headers
|
||||||
#include <shobjidl.h>
|
#include <shobjidl.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif // _WIN32
|
#else // Linux and MacOS
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
namespace yaze {
|
namespace yaze {
|
||||||
namespace core {
|
namespace core {
|
||||||
|
|
||||||
|
std::string GetFileExtension(const std::string &filename) {
|
||||||
|
size_t dot = filename.find_last_of(".");
|
||||||
|
if (dot == std::string::npos) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return filename.substr(dot + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetFileName(const std::string &filename) {
|
||||||
|
size_t slash = filename.find_last_of("/");
|
||||||
|
if (slash == std::string::npos) {
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
return filename.substr(slash + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string LoadFile(const std::string &filename) {
|
||||||
|
std::string contents;
|
||||||
|
std::ifstream file(filename);
|
||||||
|
if (file.is_open()) {
|
||||||
|
std::stringstream buffer;
|
||||||
|
buffer << file.rdbuf();
|
||||||
|
contents = buffer.str();
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
// Throw an exception
|
||||||
|
throw std::runtime_error("Could not open file: " + filename);
|
||||||
|
}
|
||||||
|
return contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string LoadConfigFile(const std::string &filename) {
|
||||||
|
std::string contents;
|
||||||
|
Platform platform;
|
||||||
|
#if defined(_WIN32)
|
||||||
|
platform = Platform::kWindows;
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
platform = Platform::kMacOS;
|
||||||
|
#else
|
||||||
|
platform = Platform::kLinux;
|
||||||
|
#endif
|
||||||
|
std::string filepath = GetConfigDirectory(platform) + "/" + filename;
|
||||||
|
std::ifstream file(filepath);
|
||||||
|
if (file.is_open()) {
|
||||||
|
std::stringstream buffer;
|
||||||
|
buffer << file.rdbuf();
|
||||||
|
contents = buffer.str();
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
return contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SaveFile(const std::string &filename, const std::string &contents,
|
||||||
|
Platform platform) {
|
||||||
|
std::string filepath = GetConfigDirectory(platform) + "/" + filename;
|
||||||
|
std::ofstream file(filepath);
|
||||||
|
if (file.is_open()) {
|
||||||
|
file << contents;
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetConfigDirectory(Platform platform) {
|
||||||
|
std::string config_directory = ".yaze";
|
||||||
|
switch (platform) {
|
||||||
|
case Platform::kWindows:
|
||||||
|
config_directory = "~/AppData/Roaming/yaze";
|
||||||
|
break;
|
||||||
|
case Platform::kMacOS:
|
||||||
|
case Platform::kLinux:
|
||||||
|
config_directory = "~/.config/yaze";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return config_directory;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
std::string FileDialogWrapper::ShowOpenFileDialog() {
|
std::string FileDialogWrapper::ShowOpenFileDialog() {
|
||||||
@@ -119,8 +203,27 @@ std::vector<std::string> FileDialogWrapper::GetFilesInFolder(
|
|||||||
|
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
|
|
||||||
|
#include <nfd.h>
|
||||||
|
|
||||||
std::string FileDialogWrapper::ShowOpenFileDialog() {
|
std::string FileDialogWrapper::ShowOpenFileDialog() {
|
||||||
return "Linux: Open file dialog";
|
NFD_Init();
|
||||||
|
nfdu8char_t *out_path = NULL;
|
||||||
|
nfdu8filter_item_t filters[1] = {{ "Rom File", "sfc,smc" } };
|
||||||
|
nfdopendialogu8args_t args = { 0 };
|
||||||
|
args.filterList = filters;
|
||||||
|
args.filterCount = 1;
|
||||||
|
nfdresult_t result = NFD_OpenDialogU8_With(&out_path, &args);
|
||||||
|
if (result == NFD_OKAY) {
|
||||||
|
std::string file_path_linux(out_path);
|
||||||
|
NFD_Free(out_path);
|
||||||
|
NFD_Quit();
|
||||||
|
return file_path_linux;
|
||||||
|
} else if (result == NFD_CANCEL) {
|
||||||
|
NFD_Quit();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
NFD_Quit();
|
||||||
|
return "Error: NFD_OpenDialog";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string FileDialogWrapper::ShowOpenFolderDialog() {
|
std::string FileDialogWrapper::ShowOpenFolderDialog() {
|
||||||
|
|||||||
@@ -21,11 +21,28 @@ class FileDialogWrapper {
|
|||||||
*/
|
*/
|
||||||
static std::string ShowOpenFolderDialog();
|
static std::string ShowOpenFolderDialog();
|
||||||
static std::vector<std::string> GetSubdirectoriesInFolder(
|
static std::vector<std::string> GetSubdirectoriesInFolder(
|
||||||
const std::string& folder_path);
|
const std::string &folder_path);
|
||||||
static std::vector<std::string> GetFilesInFolder(
|
static std::vector<std::string> GetFilesInFolder(
|
||||||
const std::string& folder_path);
|
const std::string &folder_path);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GetBundleResourcePath returns the path to the bundle resource
|
||||||
|
* directory. Specific to MacOS.
|
||||||
|
*/
|
||||||
|
std::string GetBundleResourcePath();
|
||||||
|
|
||||||
|
enum class Platform { kUnknown, kMacOS, kiOS, kWindows, kLinux };
|
||||||
|
|
||||||
|
std::string GetFileExtension(const std::string &filename);
|
||||||
|
std::string GetFileName(const std::string &filename);
|
||||||
|
std::string LoadFile(const std::string &filename);
|
||||||
|
std::string LoadConfigFile(const std::string &filename);
|
||||||
|
std::string GetConfigDirectory(Platform platform);
|
||||||
|
|
||||||
|
void SaveFile(const std::string &filename, const std::string &data,
|
||||||
|
Platform platform);
|
||||||
|
|
||||||
} // namespace core
|
} // namespace core
|
||||||
} // namespace yaze
|
} // namespace yaze
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
#include "app/core/platform/file_dialog.h"
|
#include "app/core/platform/file_dialog.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "imgui/imgui.h"
|
|
||||||
|
|
||||||
#if defined(__APPLE__) && defined(__MACH__)
|
#if defined(__APPLE__) && defined(__MACH__)
|
||||||
/* Apple OSX and iOS (Darwin). */
|
/* Apple OSX and iOS (Darwin). */
|
||||||
|
#include <Foundation/Foundation.h>
|
||||||
#include <TargetConditionals.h>
|
#include <TargetConditionals.h>
|
||||||
|
|
||||||
#import <CoreText/CoreText.h>
|
#import <CoreText/CoreText.h>
|
||||||
@@ -53,6 +54,13 @@ std::vector<std::string> yaze::core::FileDialogWrapper::GetSubdirectoriesInFolde
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string yaze::core::GetBundleResourcePath() {
|
||||||
|
NSBundle* bundle = [NSBundle mainBundle];
|
||||||
|
NSString* resourceDirectoryPath = [bundle bundlePath];
|
||||||
|
NSString* path = [resourceDirectoryPath stringByAppendingString:@"/"];
|
||||||
|
return [path UTF8String];
|
||||||
|
}
|
||||||
|
|
||||||
#elif TARGET_OS_MAC == 1
|
#elif TARGET_OS_MAC == 1
|
||||||
/* macOS */
|
/* macOS */
|
||||||
|
|
||||||
@@ -125,6 +133,14 @@ std::vector<std::string> yaze::core::FileDialogWrapper::GetSubdirectoriesInFolde
|
|||||||
}
|
}
|
||||||
return subdirectories;
|
return subdirectories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string yaze::core::GetBundleResourcePath() {
|
||||||
|
NSBundle* bundle = [NSBundle mainBundle];
|
||||||
|
NSString* resourceDirectoryPath = [bundle bundlePath];
|
||||||
|
NSString* path = [resourceDirectoryPath stringByAppendingString:@"/"];
|
||||||
|
return [path UTF8String];
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
// Unsupported platform
|
// Unsupported platform
|
||||||
#endif // TARGET_OS_MAC
|
#endif // TARGET_OS_MAC
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
#ifndef YAZE_APP_CORE_PLATFORM_FILE_PATH_H
|
|
||||||
#define YAZE_APP_CORE_PLATFORM_FILE_PATH_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace yaze {
|
|
||||||
namespace core {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief GetBundleResourcePath returns the path to the bundle resource
|
|
||||||
* directory. Specific to MacOS.
|
|
||||||
*/
|
|
||||||
std::string GetBundleResourcePath();
|
|
||||||
|
|
||||||
} // namespace core
|
|
||||||
} // namespace yaze
|
|
||||||
|
|
||||||
#endif // YAZE_APP_CORE_PLATFORM_FILE_PATH_H
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#include "file_path.h"
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#if defined(__APPLE__) && defined(__MACH__)
|
|
||||||
#include <Foundation/Foundation.h>
|
|
||||||
#include <TargetConditionals.h>
|
|
||||||
|
|
||||||
#if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
|
|
||||||
std::string yaze::core::GetBundleResourcePath() {
|
|
||||||
NSBundle* bundle = [NSBundle mainBundle];
|
|
||||||
NSString* resourceDirectoryPath = [bundle bundlePath];
|
|
||||||
NSString* path = [resourceDirectoryPath stringByAppendingString:@"/"];
|
|
||||||
return [path UTF8String];
|
|
||||||
}
|
|
||||||
#elif TARGET_OS_MAC == 1
|
|
||||||
std::string yaze::core::GetBundleResourcePath() {
|
|
||||||
NSBundle* bundle = [NSBundle mainBundle];
|
|
||||||
NSString* resourceDirectoryPath = [bundle bundlePath];
|
|
||||||
NSString* path = [resourceDirectoryPath stringByAppendingString:@"/"];
|
|
||||||
return [path UTF8String];
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
#include "absl/status/status.h"
|
#include "absl/status/status.h"
|
||||||
#include "absl/strings/str_cat.h"
|
#include "absl/strings/str_cat.h"
|
||||||
#include "absl/strings/str_format.h"
|
#include "absl/strings/str_format.h"
|
||||||
#include "app/core/platform/file_path.h"
|
#include "app/core/platform/file_dialog.h"
|
||||||
#include "app/gui/icons.h"
|
#include "app/gui/icons.h"
|
||||||
#include "imgui/imgui.h"
|
#include "imgui/imgui.h"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#include "absl/status/status.h"
|
#include "absl/status/status.h"
|
||||||
#include "app/core/common.h"
|
#include "app/core/common.h"
|
||||||
#include "app/core/utils/file_util.h"
|
#include "app/core/platform/file_dialog.h"
|
||||||
|
|
||||||
namespace yaze {
|
namespace yaze {
|
||||||
|
|
||||||
|
|||||||
@@ -1,95 +0,0 @@
|
|||||||
#include "file_util.h"
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
|
||||||
#include <windows.h>
|
|
||||||
#else
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
namespace yaze {
|
|
||||||
namespace core {
|
|
||||||
|
|
||||||
std::string GetFileExtension(const std::string &filename) {
|
|
||||||
size_t dot = filename.find_last_of(".");
|
|
||||||
if (dot == std::string::npos) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return filename.substr(dot + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetFileName(const std::string &filename) {
|
|
||||||
size_t slash = filename.find_last_of("/");
|
|
||||||
if (slash == std::string::npos) {
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
return filename.substr(slash + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string LoadFile(const std::string &filename) {
|
|
||||||
std::string contents;
|
|
||||||
std::ifstream file(filename);
|
|
||||||
if (file.is_open()) {
|
|
||||||
std::stringstream buffer;
|
|
||||||
buffer << file.rdbuf();
|
|
||||||
contents = buffer.str();
|
|
||||||
file.close();
|
|
||||||
} else {
|
|
||||||
// Throw an exception
|
|
||||||
throw std::runtime_error("Could not open file: " + filename);
|
|
||||||
}
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string LoadConfigFile(const std::string &filename) {
|
|
||||||
std::string contents;
|
|
||||||
Platform platform;
|
|
||||||
#if defined(_WIN32)
|
|
||||||
platform = Platform::kWindows;
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
platform = Platform::kMacOS;
|
|
||||||
#else
|
|
||||||
platform = Platform::kLinux;
|
|
||||||
#endif
|
|
||||||
std::string filepath = GetConfigDirectory(platform) + "/" + filename;
|
|
||||||
std::ifstream file(filepath);
|
|
||||||
if (file.is_open()) {
|
|
||||||
std::stringstream buffer;
|
|
||||||
buffer << file.rdbuf();
|
|
||||||
contents = buffer.str();
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SaveFile(const std::string &filename, const std::string &contents,
|
|
||||||
Platform platform) {
|
|
||||||
std::string filepath = GetConfigDirectory(platform) + "/" + filename;
|
|
||||||
std::ofstream file(filepath);
|
|
||||||
if (file.is_open()) {
|
|
||||||
file << contents;
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetConfigDirectory(Platform platform) {
|
|
||||||
std::string config_directory = ".yaze";
|
|
||||||
switch (platform) {
|
|
||||||
case Platform::kWindows:
|
|
||||||
config_directory = "~/AppData/Roaming/yaze";
|
|
||||||
break;
|
|
||||||
case Platform::kMacOS:
|
|
||||||
case Platform::kLinux:
|
|
||||||
config_directory = "~/.config/yaze";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return config_directory;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace core
|
|
||||||
} // namespace yaze
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#ifndef YAZE_APP_CORE_UTILS_FILE_UTIL_H
|
|
||||||
#define YAZE_APP_CORE_UTILS_FILE_UTIL_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace yaze {
|
|
||||||
namespace core {
|
|
||||||
|
|
||||||
enum class Platform { kUnknown, kMacOS, kiOS, kWindows, kLinux };
|
|
||||||
|
|
||||||
std::string GetFileExtension(const std::string &filename);
|
|
||||||
std::string GetFileName(const std::string &filename);
|
|
||||||
std::string LoadFile(const std::string &filename);
|
|
||||||
std::string LoadConfigFile(const std::string &filename);
|
|
||||||
std::string GetConfigDirectory(Platform platform);
|
|
||||||
|
|
||||||
void SaveFile(const std::string &filename, const std::string &data,
|
|
||||||
Platform platform);
|
|
||||||
|
|
||||||
} // namespace core
|
|
||||||
} // namespace yaze
|
|
||||||
|
|
||||||
#endif // YAZE_APP_CORE_UTILS_FILE_UTIL_H
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#include "style.h"
|
#include "style.h"
|
||||||
|
|
||||||
#include "app/core/utils/file_util.h"
|
#include "app/core/platform/file_dialog.h"
|
||||||
#include "gui/color.h"
|
#include "gui/color.h"
|
||||||
#include "imgui/imgui.h"
|
#include "imgui/imgui.h"
|
||||||
#include "imgui/imgui_internal.h"
|
#include "imgui/imgui_internal.h"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "app/core/platform/file_path.h"
|
#include "app/core/platform/file_dialog.h"
|
||||||
#include "app/gui/canvas.h"
|
#include "app/gui/canvas.h"
|
||||||
#include "app/gui/input.h"
|
#include "app/gui/input.h"
|
||||||
#include "imgui/imgui.h"
|
#include "imgui/imgui.h"
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ add_executable(
|
|||||||
app/rom.cc
|
app/rom.cc
|
||||||
app/core/common.cc
|
app/core/common.cc
|
||||||
app/core/project.cc
|
app/core/project.cc
|
||||||
app/core/platform/file_path.mm
|
app/core/platform/file_dialog.mm
|
||||||
app/core/utils/file_util.cc
|
|
||||||
${YAZE_APP_EMU_SRC}
|
${YAZE_APP_EMU_SRC}
|
||||||
${YAZE_APP_GFX_SRC}
|
${YAZE_APP_GFX_SRC}
|
||||||
${YAZE_APP_ZELDA3_SRC}
|
${YAZE_APP_ZELDA3_SRC}
|
||||||
|
|||||||
Reference in New Issue
Block a user