Clean up some stuff.

This commit is contained in:
J-D-K 2020-06-23 22:25:07 -04:00
parent 2918aedff9
commit 3969716bb9
14 changed files with 472 additions and 308 deletions

View File

@ -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

10
inc/curlfuncs.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef CURLFUNCS_H
#define CURLFUNCS_H
#include <string>
#include <vector>
std::string getJSONURL(std::string *headers, const std::string& _url);
bool getBinURL(std::vector<uint8_t> *out, const std::string& _url);
#endif // CURLFUNCS_H

View File

@ -5,6 +5,7 @@
#include <vector>
#include <string>
#include <unordered_map>
#include "gfx.h"
@ -119,6 +120,7 @@ namespace data
//User vector
extern std::vector<user> users;
extern std::unordered_map<uint64_t, std::pair<tex *, tex *>> icons;
//Options and info
//Restores config to default

View File

@ -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

View File

@ -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);

55
src/curfuncs.cpp Normal file
View File

@ -0,0 +1,55 @@
#include <string>
#include <vector>
#include <curl/curl.h>
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<uint8_t> *binData = (std::vector<uint8_t> *)u;
binData->reserve(sizeIn);
binData->insert(binData->end(), buff, buff + sizeIn);
return sizeIn;
}
bool getBinURL(std::vector<uint8_t> *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;
}

View File

@ -31,7 +31,7 @@ static bool sysBCATPushed = false, cachePushed = false, tempPushed = false;
static std::vector<uint64_t> blacklist;
static std::vector<uint64_t> favorites;
static std::unordered_map<uint64_t, std::string> pathDefs;
static std::unordered_map<uint64_t, std::pair<tex *, tex *>> icons;
std::unordered_map<uint64_t, std::pair<tex *, tex *>> 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();

View File

@ -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();
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;
}
}