Skip to content

Commit

Permalink
Add list of available roms to run and system to save directories to s…
Browse files Browse the repository at this point in the history
…earch for roms
  • Loading branch information
JustDoom committed Mar 28, 2024
1 parent b748c0e commit d9e9e4a
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 9 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@
[submodule "dependencies/nativefiledialog"]
path = dependencies/nativefiledialog
url = git@github.com:AlvaroBarua/nativefiledialog.git
[submodule "dependencies/libconfig"]
path = dependencies/libconfig
url = git@github.com:hyperrealm/libconfig.git
3 changes: 2 additions & 1 deletion dependencies/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/sfml/CMakeLists.txt")
endif()

add_subdirectory(sfml)
add_subdirectory(nativefiledialog)
add_subdirectory(nativefiledialog)
add_subdirectory(libconfig)
1 change: 1 addition & 0 deletions dependencies/libconfig
Submodule libconfig added at f9404f
8 changes: 7 additions & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,13 @@ add_subdirectory(emulator)

target_sources(8ChocChip PUBLIC main.cpp)

target_link_libraries(8ChocChip PRIVATE sfml-graphics sfml-audio sfml-window sfml-system nativefiledialog)
if(CMAKE_HOST_WIN32)
set(libname "libconfig")
else()
set(libname "config")
endif()

target_link_libraries(8ChocChip PRIVATE sfml-graphics sfml-audio sfml-window sfml-system nativefiledialog ${libname}++)

# Copy DLLs needed for runtime on Windows
if(WIN32)
Expand Down
115 changes: 108 additions & 7 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
#include "util/MiscUtil.h"

#include "nfd.h"
#include "libconfig.h"
#include "libconfig.hh"

int launch(const std::string& rom, const std::string& executable) {
if (rom.empty()) {
Expand Down Expand Up @@ -77,6 +79,16 @@ int launch(const std::string& rom, const std::string& executable) {
return 0;
}

std::string getFileFromPath(std::string path) {
size_t lastSlashPos = path.find_last_of('/');

if (lastSlashPos != std::string::npos) {
return path.substr(lastSlashPos + 1);
}

return path;
}

int main(int argc, char **argv) {
bool quickRom = false;
std::string rom;
Expand All @@ -96,6 +108,64 @@ int main(int argc, char **argv) {
}
}

std::string home = std::filesystem::path(getenv("HOME")).string();
std::string configFilePath = (std::filesystem::path(home) / ".8chocchip.cfg").string();

std::vector<std::string> romDirectories;
std::unordered_map<std::string*, std::vector<std::string>> romFiles;

std::ifstream file(configFilePath, std::ios::binary | std::ios::ate);
if (file.good()) {
libconfig::Config config;
config.readFile(configFilePath);

libconfig::Setting &settings = config.getRoot();

if (!settings.exists("directories")) {
settings.add("directories", libconfig::Setting::TypeArray);
}

libconfig::Setting &directories = settings["directories"];
for (int i = 0; i < directories.getLength(); i++) {
libconfig::Setting &string = directories[i];
std::string directoryPath = string.c_str();

romDirectories.emplace_back(directoryPath);

for (const auto& file: std::filesystem::directory_iterator(directoryPath)) {
if (file.is_directory())
continue; // Skip directories

printf("Processing file: %s\n", file.path().c_str());

// Check if the rom directory doesn't exist in romFiles, then add it
if (romFiles.find(&romDirectories.back()) == romFiles.end()) {
romFiles.emplace(&romDirectories.back(), std::vector<std::string>());
}

// Add the file path to the romFiles entry
romFiles.find(&romDirectories.back())->second.emplace_back(file.path());
}
}

} else {
config_t cfg;
config_init(&cfg);

config_setting_t *root = config_root_setting(&cfg);
config_setting_t *list = config_setting_add(root, "directories", CONFIG_TYPE_LIST);

if (config_write_file(&cfg, configFilePath.c_str()) == CONFIG_FALSE) {
std::cerr << "Error creating configuration file." << std::endl;
config_destroy(&cfg);
return 1;
}

std::cout << "Configuration file created successfully." << std::endl;

config_destroy(&cfg);
}

if (quickRom) {
return launch(rom, argv[0]);
} else {
Expand All @@ -110,6 +180,15 @@ int main(int argc, char **argv) {

std::unordered_map<std::string, TextButton> roms;

for (auto& thing : romFiles) {
for (std::string& file : thing.second) {

TextButton romButton(0, 25 * roms.size(), window.getSize().x, 25, getFileFromPath(file), &font);

roms.emplace(file, romButton);
}
}

TextButton button(0, 400, 640, 80, "Select ROM", &font);

while (window.isOpen()) {
Expand All @@ -133,7 +212,6 @@ int main(int argc, char **argv) {
}
}

std::cout << roms.size() << std::endl;
for (auto& romButton : roms) {
romButton.second.update(window);
}
Expand All @@ -146,18 +224,41 @@ int main(int argc, char **argv) {
}
if (button.isClicked()) {
nfdchar_t* outPath = nullptr;
nfdresult_t result = NFD_PickFolder(nullptr, &outPath); //NFD_OpenDialog(nullptr, nullptr, &outPath);
nfdresult_t result = NFD_PickFolder(nullptr, &outPath);

if (result == NFD_OKAY) {
// return launch(outPath, argv[0]);
// free(outPath);
libconfig::Config config;
config.readFile(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) = outPath;

romDirectories.emplace_back(outPath);

int count = 0;
for (const auto& file : std::filesystem::directory_iterator(outPath)) {
if (file.is_directory()) continue;
TextButton romButton(0, 25 * count++, window.getSize().x, 25, file.path().filename().string(), &font);
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 (romFiles.find(&romDirectories.back()) == romFiles.end()) {
romFiles.emplace(&romDirectories.back(), std::vector<std::string>());
}

// Add the file path to the romFiles entry
romFiles.find(&romDirectories.back())->second.emplace_back(file.path());

TextButton romButton(0, 25 * roms.size(), window.getSize().x, 25, file.path().filename().string(), &font);
roms.emplace(file.path().string(), romButton);
}
;
config.writeFile(configFilePath);
}
}

Expand Down

0 comments on commit d9e9e4a

Please sign in to comment.