diff --git a/inc/cfg.h b/inc/cfg.h index e49a867..5bd49b1 100644 --- a/inc/cfg.h +++ b/inc/cfg.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include namespace cfg @@ -18,6 +19,7 @@ namespace cfg bool isBlacklisted(const uint64_t& tid); void addTitleToBlacklist(void *a); + void removeTitleFromBlacklist(const uint64_t& tid); bool isFavorite(const uint64_t& tid); void addTitleToFavorites(const uint64_t& tid); @@ -29,5 +31,7 @@ namespace cfg void addPathToFilter(const uint64_t& tid, const std::string& _p); extern std::unordered_map config; + extern std::vector blacklist; + extern std::vector favorites; extern uint8_t sortType; } diff --git a/inc/data.h b/inc/data.h index f4dec65..13ddd9b 100644 --- a/inc/data.h +++ b/inc/data.h @@ -8,7 +8,7 @@ #include "gfx.h" #define BLD_MON 8 -#define BLD_DAY 19 +#define BLD_DAY 24 #define BLD_YEAR 2021 namespace data diff --git a/romfs/lang/en-US.txt b/romfs/lang/en-US.txt index 3ed96dd..5467ef9 100644 --- a/romfs/lang/en-US.txt +++ b/romfs/lang/en-US.txt @@ -72,23 +72,24 @@ saveDataResetSuccess = 0, "Save for #%s# reset!" settingsMenu = 0, "Empty Trash Bin" settingsMenu = 1, "Check for Updates" settingsMenu = 2, "Set JKSV Save Output Folder" -settingsMenu = 3, "Delete All Save Backups" -settingsMenu = 4, "Include Device Saves With Users: " -settingsMenu = 5, "Auto Backup On Restore: " -settingsMenu = 6, "Auto-Name Backups: " -settingsMenu = 7, "Overclock/CPU Boost: " -settingsMenu = 8, "Hold To Delete: " -settingsMenu = 9, "Hold To Restore: " -settingsMenu = 10, "Hold To Overwrite: " -settingsMenu = 11, "Force Mount: " -settingsMenu = 12, "Account System Saves: " -settingsMenu = 13, "Enable Writing to System Saves: " -settingsMenu = 14, "Use FS Commands Directly: " -settingsMenu = 15, "Export Saves to ZIP: " -settingsMenu = 16, "Force English To Be Used: " -settingsMenu = 17, "Enable Trash Bin: " -settingsMenu = 18, "Title Sorting Type: " -settingsMenu = 19, "Animation Scale: " +settingsMenu = 3, "Edit Blacklisted Titles" +settingsMenu = 4, "Delete All Save Backups" +settingsMenu = 5, "Include Device Saves With Users: " +settingsMenu = 6, "Auto Backup On Restore: " +settingsMenu = 7, "Auto-Name Backups: " +settingsMenu = 8, "Overclock/CPU Boost: " +settingsMenu = 9, "Hold To Delete: " +settingsMenu = 10, "Hold To Restore: " +settingsMenu = 11, "Hold To Overwrite: " +settingsMenu = 12, "Force Mount: " +settingsMenu = 13, "Account System Saves: " +settingsMenu = 14, "Enable Writing to System Saves: " +settingsMenu = 15, "Use FS Commands Directly: " +settingsMenu = 16, "Export Saves to ZIP: " +settingsMenu = 17, "Force English To Be Used: " +settingsMenu = 18, "Enable Trash Bin: " +settingsMenu = 19, "Title Sorting Type: " +settingsMenu = 20, "Animation Scale: " settingsOff = 0, "Off" settingsOn = 0, ">On>" sortType = 0, "Alphabetical" diff --git a/src/cfg.cpp b/src/cfg.cpp index 8f3e44e..144069e 100644 --- a/src/cfg.cpp +++ b/src/cfg.cpp @@ -10,8 +10,8 @@ #include "type.h" std::unordered_map cfg::config; -static std::vector blacklist; -static std::vector favorites; +std::vector cfg::blacklist; +std::vector cfg::favorites; static std::unordered_map pathDefs; uint8_t cfg::sortType; const char *cfgPath = "sdmc:/config/JKSV/JKSV.cfg", *titleDefPath = "sdmc:/config/JKSV/titleDefs.txt", *workDirLegacy = "sdmc:/switch/jksv_dir.txt"; @@ -27,7 +27,7 @@ const std::string _true_ = "true", _false_ = "false"; bool cfg::isBlacklisted(const uint64_t& tid) { - for(uint64_t& bid : blacklist) + for(uint64_t& bid : cfg::blacklist) if(tid == bid) return true; return false; @@ -39,7 +39,7 @@ void cfg::addTitleToBlacklist(void *a) threadInfo *t = (threadInfo *)a; data::userTitleInfo *d = data::getCurrentUserTitleInfo(); uint64_t tid = d->tid; - blacklist.push_back(tid); + cfg::blacklist.push_back(tid); for(data::user& u : data::users) { for(unsigned i = 0; i < u.titleInfo.size(); i++) @@ -49,9 +49,20 @@ void cfg::addTitleToBlacklist(void *a) t->finished = true; } +void cfg::removeTitleFromBlacklist(const uint64_t& tid) +{ + for(unsigned i = 0; i < cfg::blacklist.size(); i++) + { + if(cfg::blacklist[i] == tid) + cfg::blacklist.erase(cfg::blacklist.begin() + i); + } + data::loadUsersTitles(false); + ui::ttlRefresh(); +} + bool cfg::isFavorite(const uint64_t& tid) { - for(uint64_t& fid : favorites) + for(uint64_t& fid : cfg::favorites) if(tid == fid) return true; return false; @@ -59,9 +70,9 @@ bool cfg::isFavorite(const uint64_t& tid) static int getFavoriteIndex(const uint64_t& tid) { - for(unsigned i = 0; i < favorites.size(); i++) + for(unsigned i = 0; i < cfg::favorites.size(); i++) { - if(tid == favorites[i]) + if(tid == cfg::favorites[i]) return i; } return -1; @@ -72,10 +83,10 @@ void cfg::addTitleToFavorites(const uint64_t& tid) if(cfg::isFavorite(tid)) { int rem = getFavoriteIndex(tid); - favorites.erase(favorites.begin() + rem); + cfg::favorites.erase(cfg::favorites.begin() + rem); } else - favorites.push_back(tid); + cfg::favorites.push_back(tid); data::sortUserTitles(); ui::ttlRefresh(); @@ -222,12 +233,12 @@ static void loadConfigLegacy() static void loadFavoritesLegacy() { - std::string legacyFavPath = fs::getWorkDir() + "favorites.txt"; + std::string legacyFavPath = fs::getWorkDir() + "cfg::favorites.txt"; if(fs::fileExists(legacyFavPath)) { fs::dataFile fav(legacyFavPath); while(fav.readNextLine(false)) - favorites.push_back(strtoul(fav.getLine().c_str(), NULL, 16)); + cfg::favorites.push_back(strtoul(fav.getLine().c_str(), NULL, 16)); fav.close(); fs::delfile(legacyFavPath); } @@ -235,12 +246,12 @@ static void loadFavoritesLegacy() static void loadBlacklistLegacy() { - std::string legacyBlPath = fs::getWorkDir() + "blacklist.txt"; + std::string legacyBlPath = fs::getWorkDir() + "cfg::blacklist.txt"; if(fs::fileExists(legacyBlPath)) { fs::dataFile bl(legacyBlPath); while(bl.readNextLine(false)) - blacklist.push_back(strtoul(bl.getLine().c_str(), NULL, 16)); + cfg::blacklist.push_back(strtoul(bl.getLine().c_str(), NULL, 16)); bl.close(); fs::delfile(legacyBlPath); } @@ -355,14 +366,14 @@ void cfg::loadConfig() case 16: { std::string tid = cfgRead.getNextValueStr(); - favorites.push_back(strtoul(tid.c_str(), NULL, 16)); + cfg::favorites.push_back(strtoul(tid.c_str(), NULL, 16)); } break; case 17: { std::string tid = cfgRead.getNextValueStr(); - blacklist.push_back(strtoul(tid.c_str(), NULL, 16)); + cfg::blacklist.push_back(strtoul(tid.c_str(), NULL, 16)); } break; @@ -404,17 +415,17 @@ void cfg::saveConfig() fprintf(cfgOut, "titleSortType = %s\n", sortTypeText().c_str()); fprintf(cfgOut, "animationScale = %f\n", ui::animScale); - if(!favorites.empty()) + if(!cfg::favorites.empty()) { fprintf(cfgOut, "\n#favorites\n"); - for(uint64_t& f : favorites) + for(uint64_t& f : cfg::favorites) fprintf(cfgOut, "favorite = 0x%016lX\n", f); } - if(!blacklist.empty()) + if(!cfg::blacklist.empty()) { fprintf(cfgOut, "\n#blacklist\n"); - for(uint64_t& b : blacklist) + for(uint64_t& b : cfg::blacklist) fprintf(cfgOut, "blacklist = 0x%016lX\n", b); } fclose(cfgOut); diff --git a/src/data.cpp b/src/data.cpp index 2db6501..549a763 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -219,6 +219,9 @@ bool data::loadUsersTitles(bool clearUsers) else tid = info.application_id; + if(!titleIsLoaded(tid)) + addTitleToList(tid); + //Don't bother with this stuff if(cfg::isBlacklisted(tid) || !accountSystemSaveCheck(info) || !testMount(info)) continue; @@ -258,9 +261,6 @@ bool data::loadUsersTitles(bool clearUsers) break; } - if(!titleIsLoaded(tid)) - addTitleToList(tid); - int u = getUserIndex(info.uid); if(u == -1) { @@ -273,7 +273,6 @@ bool data::loadUsersTitles(bool clearUsers) pdmqryQueryPlayStatisticsByApplicationIdAndUserAccountId(info.application_id, info.uid, false, &playStats); else memset(&playStats, 0, sizeof(PdmPlayStatistics)); - users[u].addUserTitleInfo(tid, &info, &playStats); } fsSaveDataInfoReaderClose(&it); diff --git a/src/ui/sett.cpp b/src/ui/sett.cpp index 621e7b0..89d24b3 100644 --- a/src/ui/sett.cpp +++ b/src/ui/sett.cpp @@ -8,6 +8,8 @@ #include "util.h" ui::menu *ui::settMenu; +static ui::slideOutPanel *blEditPanel; +static ui::menu *blEditMenu; //This is the name of strings used here static const char *settMenuStr = "settingsMenu"; @@ -27,6 +29,9 @@ static inline void toggleBool(bool& b) b = true; } +//Declaration, implementation further down +static void blEditMenuPopulate(); + static void settMenuCallback(void *a) { switch(ui::padKeysDown()) @@ -67,6 +72,49 @@ static void settMenuDeleteAllBackups(void *a) ui::confirm(send); } +static void blEditDrawFunc(void *a) +{ + SDL_Texture *target = (SDL_Texture *)a; + blEditMenu->draw(target, &ui::txtCont, true); +} + +static void blEditMenuCallback(void *a) +{ + switch(ui::padKeysDown()) + { + case HidNpadButton_B: + ui::updateInput(); + blEditMenu->setActive(false); + ui::settMenu->setActive(true); + blEditPanel->closePanel(); + break; + } +} + +static void blEditMenuRemoveTitle(void *a) +{ + uint64_t remTID = cfg::blacklist[blEditMenu->getSelected()]; + cfg::removeTitleFromBlacklist(remTID); + if(cfg::blacklist.size() > 0) + blEditMenuPopulate(); + else + { + blEditMenu->setActive(false); + ui::settMenu->setActive(true); + blEditPanel->closePanel(); + } +} + +static void blEditMenuPopulate() +{ + blEditMenu->reset(); + for(unsigned i = 0; i < cfg::blacklist.size(); i++) + { + blEditMenu->addOpt(NULL, data::getTitleNameByTID(cfg::blacklist[i])); + blEditMenu->optAddButtonEvent(i, HidNpadButton_A, blEditMenuRemoveTitle, NULL); + } +} + //Todo: this different static void toggleOpt(void *a) { @@ -98,73 +146,83 @@ static void toggleOpt(void *a) break; case 3: - settMenuDeleteAllBackups(NULL); + if(cfg::blacklist.size() > 0) + { + blEditMenuPopulate(); + ui::settMenu->setActive(false); + blEditMenu->setActive(true); + blEditPanel->openPanel(); + } break; case 4: - toggleBool(cfg::config["incDev"]); + settMenuDeleteAllBackups(NULL); break; case 5: - toggleBool(cfg::config["autoBack"]); + toggleBool(cfg::config["incDev"]); break; case 6: - toggleBool(cfg::config["autoName"]); + toggleBool(cfg::config["autoBack"]); break; case 7: - toggleBool(cfg::config["ovrClk"]); + toggleBool(cfg::config["autoName"]); break; case 8: - toggleBool(cfg::config["holdDel"]); + toggleBool(cfg::config["ovrClk"]); break; case 9: - toggleBool(cfg::config["holdRest"]); + toggleBool(cfg::config["holdDel"]); break; case 10: - toggleBool(cfg::config["holdOver"]); + toggleBool(cfg::config["holdRest"]); break; case 11: - toggleBool(cfg::config["forceMount"]); + toggleBool(cfg::config["holdOver"]); break; case 12: - toggleBool(cfg::config["accSysSave"]); + toggleBool(cfg::config["forceMount"]); break; case 13: - toggleBool(cfg::config["sysSaveWrite"]); + toggleBool(cfg::config["accSysSave"]); break; case 14: - toggleBool(cfg::config["directFsCmd"]); + toggleBool(cfg::config["sysSaveWrite"]); break; case 15: - toggleBool(cfg::config["zip"]); + toggleBool(cfg::config["directFsCmd"]); break; case 16: - toggleBool(cfg::config["langOverride"]); + toggleBool(cfg::config["zip"]); break; case 17: - toggleBool(cfg::config["trashBin"]); + toggleBool(cfg::config["langOverride"]); break; case 18: + toggleBool(cfg::config["trashBin"]); + break; + + case 19: if(++cfg::sortType > 2) cfg::sortType = 0; data::loadUsersTitles(false); ui::ttlRefresh(); break; - case 19: + case 20: ui::animScale += 0.5f; if(ui::animScale > 8) ui::animScale = 1; @@ -174,25 +232,25 @@ static void toggleOpt(void *a) static void updateMenuText() { - ui::settMenu->editOpt(4, NULL, ui::getUIString(settMenuStr, 4) + getBoolText(cfg::config["incDev"])); - ui::settMenu->editOpt(5, NULL, ui::getUIString(settMenuStr, 5) + getBoolText(cfg::config["autoBack"])); - ui::settMenu->editOpt(6, NULL, ui::getUIString(settMenuStr, 6) + getBoolText(cfg::config["autoName"])); - ui::settMenu->editOpt(7, NULL, ui::getUIString(settMenuStr, 7) + getBoolText(cfg::config["ovrClk"])); - ui::settMenu->editOpt(8, NULL, ui::getUIString(settMenuStr, 8) + getBoolText(cfg::config["holdDel"])); - ui::settMenu->editOpt(9, NULL, ui::getUIString(settMenuStr, 9) + getBoolText(cfg::config["holdRest"])); - ui::settMenu->editOpt(10, NULL, ui::getUIString(settMenuStr, 10) + getBoolText(cfg::config["holdOver"])); - ui::settMenu->editOpt(11, NULL, ui::getUIString(settMenuStr, 11) + getBoolText(cfg::config["forceMount"])); - ui::settMenu->editOpt(12, NULL, ui::getUIString(settMenuStr, 12) + getBoolText(cfg::config["accSysSave"])); - ui::settMenu->editOpt(13, NULL, ui::getUIString(settMenuStr, 13) + getBoolText(cfg::config["sysSaveWrite"])); - ui::settMenu->editOpt(14, NULL, ui::getUIString(settMenuStr, 14) + getBoolText(cfg::config["directFsCmd"])); - ui::settMenu->editOpt(15, NULL, ui::getUIString(settMenuStr, 15) + getBoolText(cfg::config["zip"])); - ui::settMenu->editOpt(16, NULL, ui::getUIString(settMenuStr, 16) + getBoolText(cfg::config["langOverride"])); - ui::settMenu->editOpt(17, NULL, ui::getUIString(settMenuStr, 17) + getBoolText(cfg::config["trashBin"])); - ui::settMenu->editOpt(18, NULL, ui::getUIString(settMenuStr, 18) + ui::getUICString("sortType", cfg::sortType)); + ui::settMenu->editOpt(5, NULL, ui::getUIString(settMenuStr, 5) + getBoolText(cfg::config["incDev"])); + ui::settMenu->editOpt(6, NULL, ui::getUIString(settMenuStr, 6) + getBoolText(cfg::config["autoBack"])); + ui::settMenu->editOpt(7, NULL, ui::getUIString(settMenuStr, 7) + getBoolText(cfg::config["autoName"])); + ui::settMenu->editOpt(8, NULL, ui::getUIString(settMenuStr, 8) + getBoolText(cfg::config["ovrClk"])); + ui::settMenu->editOpt(9, NULL, ui::getUIString(settMenuStr, 9) + getBoolText(cfg::config["holdDel"])); + ui::settMenu->editOpt(10, NULL, ui::getUIString(settMenuStr, 10) + getBoolText(cfg::config["holdRest"])); + ui::settMenu->editOpt(11, NULL, ui::getUIString(settMenuStr, 11) + getBoolText(cfg::config["holdOver"])); + ui::settMenu->editOpt(12, NULL, ui::getUIString(settMenuStr, 12) + getBoolText(cfg::config["forceMount"])); + ui::settMenu->editOpt(13, NULL, ui::getUIString(settMenuStr, 13) + getBoolText(cfg::config["accSysSave"])); + ui::settMenu->editOpt(14, NULL, ui::getUIString(settMenuStr, 14) + getBoolText(cfg::config["sysSaveWrite"])); + ui::settMenu->editOpt(15, NULL, ui::getUIString(settMenuStr, 15) + getBoolText(cfg::config["directFsCmd"])); + ui::settMenu->editOpt(16, NULL, ui::getUIString(settMenuStr, 16) + getBoolText(cfg::config["zip"])); + ui::settMenu->editOpt(17, NULL, ui::getUIString(settMenuStr, 17) + getBoolText(cfg::config["langOverride"])); + ui::settMenu->editOpt(18, NULL, ui::getUIString(settMenuStr, 18) + getBoolText(cfg::config["trashBin"])); + ui::settMenu->editOpt(19, NULL, ui::getUIString(settMenuStr, 19) + ui::getUICString("sortType", cfg::sortType)); char tmp[16]; sprintf(tmp, "%.1f", ui::animScale); - ui::settMenu->editOpt(19, NULL, ui::getUIString(settMenuStr, 19) + std::string(tmp)); + ui::settMenu->editOpt(20, NULL, ui::getUIString(settMenuStr, 20) + std::string(tmp)); } void ui::settInit() @@ -201,9 +259,15 @@ void ui::settInit() ui::settMenu->setCallback(settMenuCallback, NULL); ui::settMenu->setActive(false); + blEditPanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, blEditDrawFunc); + blEditMenu = new ui::menu(8, 32, 492, 20, 6); + blEditMenu->setCallback(blEditMenuCallback, NULL); + blEditMenu->setActive(false); + ui::registerPanel(blEditPanel); + optHelpX = 1220 - gfx::getTextWidth(ui::getUICString("helpSettings", 0), 18); - for(unsigned i = 0; i < 20; i++) + for(unsigned i = 0; i < 21; i++) { ui::settMenu->addOpt(NULL, ui::getUIString("settingsMenu", i)); ui::settMenu->optAddButtonEvent(i, HidNpadButton_A, toggleOpt, NULL); @@ -213,10 +277,13 @@ void ui::settInit() void ui::settExit() { delete ui::settMenu; + delete blEditMenu; + delete blEditPanel; } void ui::settUpdate() { + blEditMenu->update(); ui::settMenu->update(); } diff --git a/src/ui/uistr.cpp b/src/ui/uistr.cpp index 16650ed..8a6f480 100644 --- a/src/ui/uistr.cpp +++ b/src/ui/uistr.cpp @@ -76,23 +76,24 @@ void ui::initStrings() addUIString("settingsMenu", 0, "Empty Trash Bin"); addUIString("settingsMenu", 1, "Check for Updates"); addUIString("settingsMenu", 2, "Set JKSV Save Output Folder"); - addUIString("settingsMenu", 3, "Delete All Save Backups"); - addUIString("settingsMenu", 4, "Include Device Saves With Users: "); - addUIString("settingsMenu", 5, "Auto Backup On Restore: "); - addUIString("settingsMenu", 6, "Auto-Name Backups: "); - addUIString("settingsMenu", 7, "Overclock/CPU Boost: "); - addUIString("settingsMenu", 8, "Hold To Delete: "); - addUIString("settingsMenu", 9, "Hold To Restore: "); - addUIString("settingsMenu", 10, "Hold To Overwrite: "); - addUIString("settingsMenu", 11, "Force Mount: "); - addUIString("settingsMenu", 12, "Account System Saves: "); - addUIString("settingsMenu", 13, "Enable Writing to System Saves: "); - addUIString("settingsMenu", 14, "Use FS Commands Directly: "); - addUIString("settingsMenu", 15, "Export Saves to ZIP: "); - addUIString("settingsMenu", 16, "Force English To Be Used: "); - addUIString("settingsMenu", 17, "Enable Trash Bin: "); - addUIString("settingsMenu", 18, "Title Sorting Type: "); - addUIString("settingsMenu", 19, "Animation Scale: "); + addUIString("settingsMenu", 3, "Edit Blacklisted Titles"); + addUIString("settingsMenu", 4, "Delete All Save Backups"); + addUIString("settingsMenu", 5, "Include Device Saves With Users: "); + addUIString("settingsMenu", 6, "Auto Backup On Restore: "); + addUIString("settingsMenu", 7, "Auto-Name Backups: "); + addUIString("settingsMenu", 8, "Overclock/CPU Boost: "); + addUIString("settingsMenu", 9, "Hold To Delete: "); + addUIString("settingsMenu", 10, "Hold To Restore: "); + addUIString("settingsMenu", 11, "Hold To Overwrite: "); + addUIString("settingsMenu", 12, "Force Mount: "); + addUIString("settingsMenu", 13, "Account System Saves: "); + addUIString("settingsMenu", 14, "Enable Writing to System Saves: "); + addUIString("settingsMenu", 15, "Use FS Commands Directly: "); + addUIString("settingsMenu", 16, "Export Saves to ZIP: "); + addUIString("settingsMenu", 17, "Force English To Be Used: "); + addUIString("settingsMenu", 18, "Enable Trash Bin: "); + addUIString("settingsMenu", 19, "Title Sorting Type: "); + addUIString("settingsMenu", 20, "Animation Scale: "); //Sort Strings for ^ addUIString("sortType", 0, "Alphabetical");