diff --git a/Makefile b/Makefile index 085edad..f88d767 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ INCLUDES := inc EXEFS_SRC := exefs_src APP_TITLE := JKSV APP_AUTHOR := JK -APP_VERSION := 06.10.2020 +APP_VERSION := 06.23.2020 ROMFS := romfs ICON := romfs/icon.jpg @@ -50,14 +50,14 @@ ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE override CFLAGS += -g -Wall -O2 -ffunction-sections \ $(ARCH) $(DEFINES) -override CFLAGS += $(INCLUDE) -D__SWITCH__ `freetype-config --cflags` +override CFLAGS += $(INCLUDE) -D__SWITCH__ `freetype-config --cflags` `curl-config --cflags` CXXFLAGS:= $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17 ASFLAGS := -g $(ARCH) LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -LIBS := `freetype-config --libs` -lpng -ljpeg -lz -lminizip -lnx +LIBS := `freetype-config --libs` `curl-config --libs` -lpng -ljpeg -lz -lminizip -lnx #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/inc/curlfuncs.h b/inc/curlfuncs.h new file mode 100644 index 0000000..7690a72 --- /dev/null +++ b/inc/curlfuncs.h @@ -0,0 +1,10 @@ +#ifndef CURLFUNCS_H +#define CURLFUNCS_H + +#include +#include + +std::string getJSONURL(std::string *headers, const std::string& _url); +bool getBinURL(std::vector *out, const std::string& _url); + +#endif // CURLFUNCS_H diff --git a/inc/data.h b/inc/data.h index 3adcd07..be47502 100644 --- a/inc/data.h +++ b/inc/data.h @@ -5,6 +5,7 @@ #include #include +#include #include "gfx.h" @@ -119,6 +120,7 @@ namespace data //User vector extern std::vector users; + extern std::unordered_map> icons; //Options and info //Restores config to default diff --git a/inc/txtui.h b/inc/txtui.h index 2cb2655..1454152 100644 --- a/inc/txtui.h +++ b/inc/txtui.h @@ -9,14 +9,23 @@ namespace ui void textTitlePrep(data::user& u); void textUserMenuUpdate(const uint64_t& down, const uint64_t& held); + void drawTextUserMenu(); + void textTitleMenuUpdate(const uint64_t& down, const uint64_t& held); + void drawTextTitleMenu(); + void textFolderMenuUpdate(const uint64_t& down, const uint64_t& held); + void drawTextFolderMenu(); + void updateExMenu(const uint64_t& down, const uint64_t& held); + void drawExMenu(); + void exMenuPrep(); //Options void optMenuInit(); void updateOptMenu(const uint64_t& down, const uint64_t& held); + void drawOptMenu(); } #endif diff --git a/inc/uiupdate.h b/inc/uiupdate.h index 0aeae4f..f73fd9e 100644 --- a/inc/uiupdate.h +++ b/inc/uiupdate.h @@ -6,9 +6,16 @@ namespace ui { void updateUserMenu(const uint64_t& down, const uint64_t& held); + void drawUserMenu(); + void updateTitleMenu(const uint64_t& down, const uint64_t& held); + void drawTitleMenu(); + void updateFolderMenu(const uint64_t& down, const uint64_t& held); + void drawFolderMenu(); + void updateAdvMode(const uint64_t& down, const uint64_t& held); + void drawAdvMode(); //needed here since it uses static menu void folderMenuPrepare(data::user& usr, data::titledata& dat); diff --git a/src/curfuncs.cpp b/src/curfuncs.cpp new file mode 100644 index 0000000..eb58faf --- /dev/null +++ b/src/curfuncs.cpp @@ -0,0 +1,55 @@ +#include +#include +#include + +size_t writeDataString(void *buff, size_t sz, size_t cnt, void *u) +{ + std::string *json = (std::string *)u; + json->append((const char *)buff); + return sz * cnt; +} + +std::string getJSONURL(std::string *headers, const std::string& _url) +{ + std::string ret; + CURL *handle = curl_easy_init(); + curl_easy_setopt(handle, CURLOPT_URL, _url.c_str()); + curl_easy_setopt(handle, CURLOPT_HTTPGET, 1); + curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeDataString); + curl_easy_setopt(handle, CURLOPT_WRITEDATA, &ret); + if(headers) + { + curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, writeDataString); + curl_easy_setopt(handle, CURLOPT_HEADERDATA, headers); + } + + if(curl_easy_perform(handle) != CURLE_OK) + ret.clear();//JIC + + curl_easy_cleanup(handle); + return ret; +} + +size_t writeDataBin(uint8_t *buff, size_t sz, size_t cnt, void *u) +{ + size_t sizeIn = sz * cnt; + std::vector *binData = (std::vector *)u; + binData->reserve(sizeIn); + binData->insert(binData->end(), buff, buff + sizeIn); + return sizeIn; +} + +bool getBinURL(std::vector *out, const std::string& _url) +{ + bool ret = false; + CURL *handle = curl_easy_init(); + curl_easy_setopt(handle, CURLOPT_URL, _url.c_str()); + curl_easy_setopt(handle, CURLOPT_HTTPGET, 1); + curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeDataBin); + curl_easy_setopt(handle, CURLOPT_WRITEDATA, out); + if(curl_easy_perform(handle) == CURLE_OK) + ret = true; + + curl_easy_cleanup(handle); + return ret; +} diff --git a/src/data.cpp b/src/data.cpp index 59510e4..e03e8a7 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -31,7 +31,7 @@ static bool sysBCATPushed = false, cachePushed = false, tempPushed = false; static std::vector blacklist; static std::vector favorites; static std::unordered_map pathDefs; -static std::unordered_map> icons; +std::unordered_map> data::icons; //Sorts titles sort-of alphabetically static struct @@ -117,8 +117,8 @@ static inline void loadCreateIcon(const uint64_t& _id, size_t _sz, const NsAppli fclose(jpegOut); } - icons[_id].first = texLoadJPEGMem(_d->icon, _sz); - icons[_id].second = createFavIcon(icons[_id].first); + data::icons[_id].first = texLoadJPEGMem(_d->icon, _sz); + data::icons[_id].second = createFavIcon(data::icons[_id].first); } static void loadCreateSystemIcon(const uint64_t& _id) @@ -126,8 +126,8 @@ static void loadCreateSystemIcon(const uint64_t& _id) char tmp[16]; sprintf(tmp, "%08X", (uint32_t)_id); - icons[_id].first = util::createIconGeneric(tmp); - icons[_id].second = createFavIcon(icons[_id].first); + data::icons[_id].first = util::createIconGeneric(tmp); + data::icons[_id].second = createFavIcon(data::icons[_id].first); } static inline std::string getIDStr(const uint64_t& _id) @@ -174,6 +174,7 @@ static bool testMount(const FsSaveDataInfo& _inf) bool data::loadUsersTitles(bool clearUsers) { + static unsigned systemUserCount = 3; FsSaveDataInfoReader it; FsSaveDataInfo info; s64 total = 0; @@ -185,6 +186,7 @@ bool data::loadUsersTitles(bool clearUsers) u.titles.clear(); if(clearUsers) { + systemUserCount = 3; for(data::user& u : data::users) u.delIcon(); @@ -218,6 +220,7 @@ bool data::loadUsersTitles(bool clearUsers) info.uid = util::u128ToAccountUID(4); if(!sysBCATPushed) { + ++systemUserCount; sysBCATPushed = true; users.emplace_back(util::u128ToAccountUID(4), "Sys. BCAT"); } @@ -227,6 +230,7 @@ bool data::loadUsersTitles(bool clearUsers) info.uid = util::u128ToAccountUID(5); if(!cachePushed) { + ++systemUserCount; cachePushed = true; users.emplace_back(util::u128ToAccountUID(5), "Cache"); } @@ -236,6 +240,7 @@ bool data::loadUsersTitles(bool clearUsers) info.uid = util::u128ToAccountUID(6); if(!tempPushed) { + ++systemUserCount; tempPushed = true; users.emplace_back(util::u128ToAccountUID(6), "Temp"); } @@ -245,7 +250,7 @@ bool data::loadUsersTitles(bool clearUsers) int u = getUserIndex(info.uid); if(u == -1) { - users.emplace(data::users.end() - 3, info.uid, ""); + users.emplace(data::users.end() - systemUserCount, info.uid, ""); u = getUserIndex(info.uid); } users[u].titles.emplace_back(info, dat); @@ -293,8 +298,11 @@ void data::exit() for(data::user& u : data::users) u.delIcon(); for(auto& icn : icons) { - texDestroy(icn.second.first); - texDestroy(icn.second.second); + if(icn.second.first) + texDestroy(icn.second.first); + + if(icn.second.second) + texDestroy(icn.second.second); } saveFav(); diff --git a/src/main.cpp b/src/main.cpp index 6a7747e..ac52eb9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,7 @@ extern "C" setInitialize(); accountInitialize(AccountServiceType_System); pmshellInitialize(); + //socketInitializeDefault(); } void userAppExit(void) @@ -34,6 +35,7 @@ extern "C" setExit(); accountExit(); pmshellExit(); + //socketExit(); } } diff --git a/src/ui.cpp b/src/ui.cpp index 7abf5f5..45ca623 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -10,7 +10,7 @@ #include "util.h" #include "file.h" -#define VER_STRING "v. 06.10.2020" +#define VER_STRING "v. 06.23.2020" //text mode bool ui::textMode = false; @@ -408,43 +408,52 @@ void ui::drawUI() { case USR_SEL: texDrawNoAlpha(usrGuide, frameBuffer, userHelpX, 673); + ui::drawUserMenu(); break; case TTL_SEL: texDrawNoAlpha(ttlGuide, frameBuffer, titleHelpX, 673); + ui::drawTitleMenu(); break; case FLD_SEL: texDrawNoAlpha(sideBar, frameBuffer, 0, 88); texDrawNoAlpha(fldrGuide, frameBuffer, folderHelpX, 673); + ui::drawFolderMenu(); break; case TXT_USR: texDrawNoAlpha(sideBar, frameBuffer, 0, 88); texDrawNoAlpha(usrGuide, frameBuffer, userHelpX, 673); + ui::drawTextUserMenu(); break; case TXT_TTL: texDrawNoAlpha(sideBar, frameBuffer, 0, 88); texDrawNoAlpha(ttlGuide, frameBuffer, titleHelpX, 673); + ui::drawTextTitleMenu(); break; case TXT_FLD: texDrawNoAlpha(sideBar, frameBuffer, 0, 88); texDrawNoAlpha(fldrGuide, frameBuffer, folderHelpX, 673); + ui::drawTextFolderMenu(); break; case EX_MNU: texDrawNoAlpha(sideBar, frameBuffer, 0, 88); + ui::drawExMenu(); break; case OPT_MNU: texDrawNoAlpha(sideBar, frameBuffer, 0, 88); texDrawNoAlpha(optGuide, frameBuffer, optHelpX, 673); + ui::drawOptMenu(); break; case ADV_MDE: drawRect(frameBuffer, 640, 88, 1, 559, ui::txtCont); + drawAdvMode(); break; } } @@ -492,9 +501,6 @@ void ui::drawBoundBox(int x, int y, int w, int h, int clrSh) void ui::runApp(const uint64_t& down, const uint64_t& held) { - //Draw first. Shouldn't, but it simplifies the showX functions - drawUI(); - switch(mstate) { case USR_SEL: @@ -533,5 +539,6 @@ void ui::runApp(const uint64_t& down, const uint64_t& held) updateOptMenu(down, held); break; } + drawUI(); drawPopup(down); } diff --git a/src/ui/advmode.cpp b/src/ui/advmode.cpp index 8cac0b7..af484b2 100644 --- a/src/ui/advmode.cpp +++ b/src/ui/advmode.cpp @@ -369,6 +369,37 @@ void ui::advModePrep(const std::string& svDev, const FsSaveDataType& _type, bool advMenuCtrl = 0; } +void ui::drawAdvMode() +{ + saveMenu.draw(ui::txtCont); + sdMenu.draw(ui::txtCont); + + drawTextWrap(savePath.c_str(), frameBuffer, ui::shared, 30, 654, 14, ui::txtCont, 600); + drawTextWrap(sdPath.c_str(), frameBuffer, ui::shared, 640, 654, 14, ui::txtCont, 600); + + //draw copy menu if it's supposed to be up + if(advMenuCtrl == 2) + { + switch(advPrev) + { + case 0: + copyMenu.setParams(176, 278, 304); + copyMenu.editOpt(0, advMenuStr[0] + "sdmc"); + ui::drawTextbox(frameBuffer, 168, 236, 320, 268); + drawText(dev.c_str(), frameBuffer, ui::shared, 176, 250, 18, ui::txtDiag); + break; + + case 1: + copyMenu.setParams(816, 278, 304); + copyMenu.editOpt(0, advMenuStr[0] + dev); + ui::drawTextbox(frameBuffer, 808, 236, 320, 268); + drawText("SDMC", frameBuffer, ui::shared, 816, 250, 18, ui::txtDiag); + break; + } + copyMenu.draw(ui::txtDiag); + } +} + void ui::updateAdvMode(const uint64_t& down, const uint64_t& held) { //0 = save; 1 = sd; 2 = cpy @@ -387,12 +418,6 @@ void ui::updateAdvMode(const uint64_t& down, const uint64_t& held) break; } - saveMenu.draw(ui::txtCont); - sdMenu.draw(ui::txtCont); - - drawTextWrap(savePath.c_str(), frameBuffer, ui::shared, 30, 654, 14, ui::txtCont, 600); - drawTextWrap(sdPath.c_str(), frameBuffer, ui::shared, 640, 654, 14, ui::txtCont, 600); - //OH BOY HERE WE GO if(down & KEY_A) { @@ -501,27 +526,5 @@ void ui::updateAdvMode(const uint64_t& down, const uint64_t& held) break; } } - - //draw copy menu if it's supposed to be up - if(advMenuCtrl == 2) - { - switch(advPrev) - { - case 0: - copyMenu.setParams(176, 278, 304); - copyMenu.editOpt(0, advMenuStr[0] + "sdmc"); - ui::drawTextbox(frameBuffer, 168, 236, 320, 268); - drawText(dev.c_str(), frameBuffer, ui::shared, 176, 250, 18, ui::txtDiag); - break; - - case 1: - copyMenu.setParams(816, 278, 304); - copyMenu.editOpt(0, advMenuStr[0] + dev); - ui::drawTextbox(frameBuffer, 808, 236, 320, 268); - drawText("SDMC", frameBuffer, ui::shared, 816, 250, 18, ui::txtDiag); - break; - } - copyMenu.draw(ui::txtDiag); - } } diff --git a/src/ui/fldrsel.cpp b/src/ui/fldrsel.cpp index 9fb7143..2a05331 100644 --- a/src/ui/fldrsel.cpp +++ b/src/ui/fldrsel.cpp @@ -173,41 +173,53 @@ void ui::deleteBackup(unsigned ind) folderMenuPrepare(data::curUser, data::curData); } +void ui::drawFolderMenu() +{ + texDraw(data::curData.getIcon(), frameBuffer, 96, 98); + drawTextWrap(folderMenuInfo.c_str(), frameBuffer, ui::shared, 60, 370, 16, ui::txtCont, 360); + folderMenu.draw(ui::txtCont); +} + void ui::updateFolderMenu(const uint64_t& down, const uint64_t& held) { folderMenu.handleInput(down, held); - //Draw folder menu - folderMenu.draw(ui::txtCont); + switch(down) + { + case KEY_A: + if(folderMenu.getSelected() == 0) + ui::createNewBackup(held); + else + ui::overwriteBackup(folderMenu.getSelected() - 1); + break; - texDraw(data::curData.getIcon(), frameBuffer, 96, 98); - drawTextWrap(folderMenuInfo.c_str(), frameBuffer, ui::shared, 60, 370, 16, ui::txtCont, 360); + case KEY_B: + fs::unmountSave(); + ui::changeState(TTL_SEL); + break; - if(down & KEY_A) - { - if(folderMenu.getSelected() == 0) - ui::createNewBackup(held); - else - ui::overwriteBackup(folderMenu.getSelected() - 1); - } - else if(down & KEY_Y) - ui::restoreBackup(folderMenu.getSelected() - 1); - else if(down & KEY_X && folderMenu.getSelected() > 0) - ui::deleteBackup(folderMenu.getSelected() - 1); - else if(down & KEY_MINUS) - { - advModePrep("sv:/", data::curData.getType(), true); - ui::changeState(ADV_MDE); - } - else if(down & KEY_ZR && data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData.getTitle().c_str())) - { - fs::delDir("sv:/"); - fsdevCommitDevice("sv"); - } - else if(down & KEY_B) - { - fs::unmountSave(); - ui::changeState(TTL_SEL); + case KEY_X: + if(folderMenu.getSelected() > 0) + ui::deleteBackup(folderMenu.getSelected() - 1); + break; + + case KEY_Y: + if(folderMenu.getSelected() > 0) + ui::restoreBackup(folderMenu.getSelected() - 1); + break; + + case KEY_ZR: + if(data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData.getTitle().c_str())) + { + fs::delDir("sv:/"); + fsdevCommitDevice("sv"); + } + break; + + case KEY_MINUS: + advModePrep("sv:/", data::curData.getType(), true); + ui::changeState(ADV_MDE); + break; } } diff --git a/src/ui/ttlsel.cpp b/src/ui/ttlsel.cpp index c7fffea..df2122e 100644 --- a/src/ui/ttlsel.cpp +++ b/src/ui/ttlsel.cpp @@ -26,7 +26,7 @@ static inline void reset() data::selData = 0; } -void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) +void ui::drawTitleMenu() { if(clrAdd) { @@ -79,90 +79,92 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) texDrawSkipNoAlpha(data::curUser.titles[i].getIcon(), frameBuffer, tX, y); } } - - if(down & KEY_RIGHT) - { - if(data::selData < (int)data::curUser.titles.size() - 1) - data::selData++; - - if(data::selData >= (int)start + 32) - start += 8; - } - else if(down & KEY_LEFT) - { - if(data::selData > 0) - data::selData--; - - if(data::selData < (int)start) - start -= 8; - } - else if(down & KEY_UP) - { - data::selData -= 8; - if(data::selData < 0) - data::selData = 0; - - if(data::selData < start) - start -= 8; - } - else if(down & KEY_DOWN) - { - data::selData += 8; - if(data::selData > (int)data::curUser.titles.size() - 1) - data::selData = data::curUser.titles.size() - 1; - - if(data::selData - start >= 32) - start += 8; - } - else if(down & KEY_A && fs::mountSave(data::curUser, data::curData)) - { - folderMenuPrepare(data::curUser, data::curData); - //Wanna change this sometime - ui::folderMenuInfo = util::getInfoString(data::curUser, data::curData); - - ui::changeState(FLD_SEL); - } - else if(down & KEY_Y) - fs::dumpAllUserSaves(data::curUser); - else if(down & KEY_MINUS) - { - if(ui::confirm(false, ui::confBlacklist.c_str(), data::curUser.titles[data::selData].getTitle().c_str())) - data::blacklistAdd(data::curData); - } - else if(down & KEY_B) - { - reset(); - ui::changeState(USR_SEL); - return; - } - else if(down & KEY_L) - { - if(--data::selUser < 0) - data::selUser = data::users.size() - 1; - - reset(); - ui::showPopup(POP_FRAME_DEFAULT, data::curUser.getUsername().c_str()); - } - else if(down & KEY_R) - { - if(++data::selUser > (int)data::users.size() - 1) - data::selUser = 0; - - reset(); - ui::showPopup(POP_FRAME_DEFAULT, data::curUser.getUsername().c_str()); - } - else if(down & KEY_ZR) - { - if(data::curData.getType() == FsSaveDataType_System) - ui::showMessage("*NO*", "Deleting system save archives is disabled."); - else if(confirm(true, ui::confEraseNand.c_str(), data::curData.getTitle().c_str())) - { - fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId_User, data::curData.getSaveID()); - data::loadUsersTitles(false); - data::selData = 0; - } - } - else if(down & KEY_X) - data::favoriteTitle(data::curData); +} + +void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) +{ + switch(down) + { + case KEY_A: + if(fs::mountSave(data::curUser, data::curData)) + { + folderMenuPrepare(data::curUser, data::curData); + ui::folderMenuInfo = util::getInfoString(data::curUser, data::curData); + ui::changeState(FLD_SEL); + } + break; + + case KEY_B: + reset(); + ui::changeState(USR_SEL); + break; + + case KEY_X: + data::favoriteTitle(data::curData); + break; + + case KEY_Y: + fs::dumpAllUserSaves(data::curUser); + break; + + case KEY_L: + if(--data::selUser < 0) + data::selUser = data::users.size() - 1; + reset(); + ui::showPopup(POP_FRAME_DEFAULT, data::curUser.getUsername().c_str()); + break; + + case KEY_R: + if(++data::selUser == (int)data::users.size()) + data::selUser = 0; + reset(); + ui::showPopup(POP_FRAME_DEFAULT, data::curUser.getUsername().c_str()); + break; + + case KEY_ZR: + if(data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseNand.c_str(), data::curData.getTitle().c_str())) + { + fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId_User, data::curData.getSaveID()); + data::loadUsersTitles(false); + data::selData = 0; + } + break; + + case KEY_MINUS: + if(ui::confirm(false, ui::confBlacklist.c_str(), data::curUser.titles[data::selData].getTitle().c_str())) + data::blacklistAdd(data::curData); + break; + + case KEY_LSTICK_UP: + case KEY_DUP: + data::selData -= 8; + if(data::selData < 0) + data::selData = 0; + break; + + case KEY_LSTICK_DOWN: + case KEY_DDOWN: + data::selData += 8; + if(data::selData > (int)data::curUser.titles.size() - 1) + data::selData = data::curUser.titles.size() - 1; + break; + + case KEY_LSTICK_LEFT: + case KEY_DLEFT: + if(data::selData > 0) + --data::selData; + break; + + case KEY_LSTICK_RIGHT: + case KEY_DRIGHT: + if(data::selData < (int)data::curUser.titles.size() - 1) + ++data::selData; + break; + } + + if(data::selData < start) + start -= 8; + else if(data::selData - start >= 32) + start += 8; } diff --git a/src/ui/txtui.cpp b/src/ui/txtui.cpp index 486ee48..e71334a 100644 --- a/src/ui/txtui.cpp +++ b/src/ui/txtui.cpp @@ -49,137 +49,165 @@ void ui::textTitlePrep(data::user& u) void ui::textUserMenuUpdate(const uint64_t& down, const uint64_t& held) { userMenu.handleInput(down, held); - userMenu.draw(ui::txtCont); data::selUser = userMenu.getSelected(); - if(down & KEY_A) + switch(down) { - if(data::curUser.titles.size() > 0) - { - textTitlePrep(data::curUser); - ui::changeState(TXT_TTL); - } - else - ui::showPopup(POP_FRAME_DEFAULT, ui::noSavesFound.c_str(), data::curUser.getUsername().c_str()); + case KEY_A: + if(data::curUser.titles.size() > 0) + { + ui::textTitlePrep(data::curUser); + ui::changeState(TXT_TTL); + } + else + ui::showPopup(POP_FRAME_DEFAULT, ui::noSavesFound.c_str(), data::curUser.getUsername().c_str()); + break; + + case KEY_X: + ui::textMode = false; + ui::changeState(USR_SEL); + break; + + case KEY_Y: + { + bool cont = true; + for(unsigned i = 0; i < data::users.size() - 2; i++) + { + if(cont) + cont = fs::dumpAllUserSaves(data::users[i]); + } + } + break; + + case KEY_ZR: + ui::changeState(EX_MNU); + break; + + case KEY_MINUS: + ui::changeState(OPT_MNU); + break; } - else if(down & KEY_Y) - { - for(unsigned i = 0; i < data::users.size(); i++) - fs::dumpAllUserSaves(data::users[i]); - } - else if(down & KEY_X) - { - ui::textMode = false; - ui::changeState(USR_SEL); - } - else if(down & KEY_ZR) - { - fs::unmountSave(); - ui::exMenuPrep(); - ui::changeState(EX_MNU); - } - else if(down & KEY_MINUS) - ui::changeState(OPT_MNU); +} + +void ui::drawTextUserMenu() +{ + userMenu.draw(ui::txtCont); } void ui::textTitleMenuUpdate(const uint64_t& down, const uint64_t& held) { titleMenu.handleInput(down, held); - titleMenu.draw(ui::txtCont); data::selData = titleMenu.getSelected(); - if(down & KEY_A) + switch(down) { - if(fs::mountSave(data::curUser, data::curData)) - { - folderMenuPrepare(data::curUser, data::curData); - ui::changeState(TXT_FLD); - } - } - else if(down & KEY_Y) - { - fs::dumpAllUserSaves(data::curUser); - } - else if(down & KEY_MINUS) - { - if(ui::confirm(false, ui::confBlacklist.c_str(), data::curData.getTitle().c_str())) - data::blacklistAdd(data::curData); + case KEY_A: + if(fs::mountSave(data::curUser, data::curData)) + { + folderMenuPrepare(data::curUser, data::curData); + ui::folderMenuInfo = util::getInfoString(data::curUser, data::curData); + ui::changeState(TXT_FLD); + } + break; - textTitlePrep(data::curUser); - } - else if(down & KEY_L) - { - if(--data::selUser < 0) - data::selUser = data::users.size() - 1; - textTitlePrep(data::curUser); - ui::showPopup(POP_FRAME_DEFAULT, data::curUser.getUsername().c_str()); - } - else if(down & KEY_R) - { - if(++data::selUser > (int)data::users.size() - 1) - data::selUser = 0; - textTitlePrep(data::curUser); - ui::showPopup(POP_FRAME_DEFAULT, data::curUser.getUsername().c_str()); - } - else if(down & KEY_X) - { - data::favoriteTitle(data::curData); - textTitlePrep(data::curUser); - } - else if(down & KEY_ZR) - { - if(data::curData.getType() == FsSaveDataType_System) - ui::showMessage("*NO*", "Deleting system save archives is disabled."); - else if(confirm(true, ui::confEraseNand.c_str(), data::curData.getTitle().c_str())) - { - fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId_User, data::curData.getSaveID()); - data::loadUsersTitles(false); + case KEY_B: + ui::changeState(TXT_USR); + break; + + case KEY_X: + data::favoriteTitle(data::curData); + break; + + case KEY_Y: + fs::dumpAllUserSaves(data::curUser); + break; + + case KEY_L: + if(--data::selUser < 0) + data::selUser = data::users.size() - 1; ui::textTitlePrep(data::curUser); - } - } - else if(down & KEY_B) - { - data::selData = 0; - ui::changeState(TXT_USR); + ui::showPopup(POP_FRAME_DEFAULT, data::curUser.getUsername().c_str()); + break; + + case KEY_R: + if(++data::selUser == (int)data::users.size()) + data::selUser = 0; + ui::textTitlePrep(data::curUser); + ui::showPopup(POP_FRAME_DEFAULT, data::curUser.getUsername().c_str()); + break; + + case KEY_ZR: + if(data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseNand.c_str(), data::curData.getTitle().c_str())) + { + fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId_User, data::curData.getSaveID()); + data::loadUsersTitles(false); + data::selData = 0; + } + break; + + case KEY_MINUS: + if(ui::confirm(false, ui::confBlacklist.c_str(), data::curUser.titles[data::selData].getTitle().c_str())) + data::blacklistAdd(data::curData); + break; } } +void ui::drawTextTitleMenu() +{ + titleMenu.draw(ui::txtCont); +} + void ui::textFolderMenuUpdate(const uint64_t& down, const uint64_t& held) { - titleMenu.draw(ui::txtCont); folderMenu.handleInput(down, held); - folderMenu.draw(ui::txtCont); - if(down & KEY_A) + switch(down) { - if(folderMenu.getSelected() == 0) - createNewBackup(held); - else - overwriteBackup(folderMenu.getSelected() - 1); - } - else if(down & KEY_Y && folderMenu.getSelected() > 0) - restoreBackup(folderMenu.getSelected() - 1); - else if(down & KEY_X && folderMenu.getSelected() > 0) - deleteBackup(folderMenu.getSelected() - 1); - else if(down & KEY_MINUS) - { - advModePrep("sv:/", data::curData.getType(), true); - ui::changeState(ADV_MDE); - } - else if(down & KEY_ZR && data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData.getTitle().c_str())) - { - fs::delDir("sv:/"); - fsdevCommitDevice("sv"); - } - else if(down & KEY_B) - { - fsdevUnmountDevice("sv"); - ui::changeState(TXT_TTL); + case KEY_A: + if(folderMenu.getSelected() == 0) + ui::createNewBackup(held); + else + ui::overwriteBackup(folderMenu.getSelected() - 1); + break; + + case KEY_B: + fs::unmountSave(); + ui::changeState(TXT_TTL); + break; + + case KEY_X: + if(folderMenu.getSelected() > 0) + ui::deleteBackup(folderMenu.getSelected() - 1); + break; + + case KEY_Y: + if(folderMenu.getSelected() > 0) + ui::restoreBackup(folderMenu.getSelected() - 1); + break; + + case KEY_ZR: + if(data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData.getTitle().c_str())) + { + fs::delDir("sv:/"); + fsdevCommitDevice("sv"); + } + break; + + case KEY_MINUS: + advModePrep("sv:/", data::curData.getType(), true); + ui::changeState(ADV_MDE); + break; } } +void ui::drawTextFolderMenu() +{ + titleMenu.draw(ui::txtCont); + folderMenu.draw(ui::txtCont); +} + void ui::exMenuPrep() { exMenu.reset(); @@ -318,7 +346,10 @@ void ui::updateExMenu(const uint64_t& down, const uint64_t& held) ui::changeState(ui::textMode ? TXT_USR : USR_SEL); prevState = USR_SEL; } +} +void ui::drawExMenu() +{ exMenu.draw(ui::txtCont); } @@ -409,7 +440,10 @@ void ui::updateOptMenu(const uint64_t& down, const uint64_t& held) data::restoreDefaultConfig(); else if(down & KEY_B) ui::changeState(ui::textMode ? TXT_USR : USR_SEL); +} +void ui::drawOptMenu() +{ optMenu.draw(ui::txtCont); drawTextWrap(ui::optMenuExp[optMenu.getSelected()].c_str(), frameBuffer, ui::shared, 466, 98, 18, ui::txtCont, 730); } diff --git a/src/ui/usrsel.cpp b/src/ui/usrsel.cpp index d1cfe2d..6dfe7aa 100644 --- a/src/ui/usrsel.cpp +++ b/src/ui/usrsel.cpp @@ -7,7 +7,7 @@ #include "uiupdate.h" #include "file.h" -void ui::updateUserMenu(const uint64_t& down, const uint64_t& held) +void ui::drawUserMenu() { //Static so they don't get reset every loop static int start = 0; @@ -61,50 +61,63 @@ void ui::updateUserMenu(const uint64_t& down, const uint64_t& held) data::users[i].drawIconHalf(tX, y); } } - - if(down & KEY_RIGHT && data::selUser < (int)data::users.size() - 1) - data::selUser++; - else if(down & KEY_LEFT && data::selUser > 0) - data::selUser--; - else if(down & KEY_UP) - { - data::selUser -= 4; - if(data::selUser < 0) - data::selUser = 0; - } - else if(down & KEY_DOWN) - { - data::selUser += 4; - if(data::selUser > (int)data::users.size() - 1) - data::selUser = data::users.size() - 1; - } - else if(down & KEY_A) - { - if(data::users[data::selUser].titles.size() > 0) - ui::changeState(TTL_SEL); - else - ui::showPopup(POP_FRAME_DEFAULT, ui::noSavesFound.c_str(), data::curUser.getUsername().c_str()); - } - else if(down & KEY_Y) - { - bool cont = true; - for(unsigned i = 0; i < data::users.size() - 2; i++) - { - if(cont) - cont = fs::dumpAllUserSaves(data::users[i]); - } - } - else if(down & KEY_X) - { - ui::textMode = true; - ui::changeState(TXT_USR); - } - else if(down & KEY_ZR) - { - fs::unmountSave(); - ui::changeState(EX_MNU); - } - else if(down & KEY_MINUS) - ui::changeState(OPT_MNU); } +void ui::updateUserMenu(const uint64_t& down, const uint64_t& held) +{ + switch(down) + { + case KEY_A: + if(data::curUser.titles.size() > 0) + ui::changeState(TTL_SEL); + else + ui::showPopup(POP_FRAME_DEFAULT, ui::noSavesFound.c_str(), data::curUser.getUsername().c_str()); + break; + + case KEY_X: + ui::textMode = true; + ui::changeState(TXT_USR); + break; + + case KEY_Y: + { + bool cont = true; + for(unsigned i = 0; i < data::users.size() - 2; i++) + { + if(cont) + cont = fs::dumpAllUserSaves(data::users[i]); + } + } + break; + + case KEY_ZR: + ui::changeState(EX_MNU); + break; + + case KEY_MINUS: + ui::changeState(OPT_MNU); + break; + + case KEY_LSTICK_UP: + case KEY_DUP: + data::selUser - 5 < 0 ? data::selUser = 0 : data::selUser -= 4; + break; + + case KEY_LSTICK_DOWN: + case KEY_DDOWN: + data::selUser + 5 > (int)data::users.size() - 1 ? data::selUser = data::users.size() - 1 : data::selUser += 5; + break; + + case KEY_LSTICK_LEFT: + case KEY_DLEFT: + if(data::selUser > 0) + --data::selUser; + break; + + case KEY_LSTICK_RIGHT: + case KEY_DRIGHT: + if(data::selUser < (int)data::users.size() - 1) + ++data::selUser; + break; + } +}