diff --git a/Makefile b/Makefile index 29d63c6..b0ce713 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ INCLUDES := inc inc/ui EXEFS_SRC := exefs_src APP_TITLE := JKSV APP_AUTHOR := JK -APP_VERSION := 08.01.2021 +APP_VERSION := 08.04.2021 ROMFS := romfs ICON := icon.jpg diff --git a/inc/data.h b/inc/data.h index 6dd7e12..05f605d 100644 --- a/inc/data.h +++ b/inc/data.h @@ -11,7 +11,7 @@ #define curData users[data::selUser].titleInfo[data::selData] #define BLD_MON 8 -#define BLD_DAY 1 +#define BLD_DAY 4 #define BLD_YEAR 2021 namespace data diff --git a/inc/gfx.h b/inc/gfx.h index f449821..0b8ede8 100644 --- a/inc/gfx.h +++ b/inc/gfx.h @@ -71,4 +71,9 @@ namespace gfx SDL_SetRenderDrawColor(gfx::render, clear->r, clear->g, clear->b, clear->a); SDL_RenderClear(gfx::render); } + + inline void resetRender() + { + SDL_SetRenderDrawColor(gfx::render, 0xFF, 0xFF, 0xFF, 0xFF); + } } diff --git a/inc/ui/miscui.h b/inc/ui/miscui.h index b0ba232..c85be79 100644 --- a/inc/ui/miscui.h +++ b/inc/ui/miscui.h @@ -16,6 +16,7 @@ typedef enum MENU_X, MENU_Y, MENU_RECT_WIDTH, + MENU_RECT_HEIGHT, MENU_FONT_SIZE, MENU_MAX_SCROLL } menuParams; @@ -48,6 +49,7 @@ namespace ui { SDL_Texture *icn = NULL; std::string txt; + int txtWidth; std::vector events; } menuOpt; @@ -55,10 +57,8 @@ namespace ui { public: menu() = default; - - //X, Y, Rect width/Max length, Font size, max to show - void setParams(const unsigned& _x, const unsigned& _y, const unsigned& _rW, const unsigned& _fS, const unsigned& _mL); - void editParam(int _param, unsigned newVal); + menu(const int& _x, const int& _y, const int& _rW, const int& _fS, const int& _mL); + void editParam(int _param, int newVal); //Gets executed when menu changes at all void setOnChangeFunc(funcPtr func) { onChange = func; } @@ -106,11 +106,13 @@ namespace ui int x = 0, mY = 0, tY = 0, y = 0, rW = 0, rY = 0, fSize = 0, rH = 0, mL = 0; //Options vector std::vector opt; - //Selected + frame counting for auto-scroll - int selected = 0, fc = 0; + //Selected + frame counting for auto-scroll. Hover count is to not break autoscroll + int selected = 0, fc = 0, hoverCount = 0, spcWidth = 0; //How much we shift the color of the rectangle uint8_t clrSh = 0; - bool clrAdd = true, isActive = true; + bool clrAdd = true, isActive = true, hover = false; + //Option buffer. Basically, text is draw to this so it can't overlap. Also allows scrolling + SDL_Texture *optTex; funcPtr onChange = NULL, callback = NULL; void *callbackArgs, *funcArgs; }; diff --git a/inc/ui/sldpanel.h b/inc/ui/sldpanel.h index 10bf186..26e1bb1 100644 --- a/inc/ui/sldpanel.h +++ b/inc/ui/sldpanel.h @@ -16,6 +16,7 @@ namespace ui slideOutPanel(int _w, int _h, int _y, slidePanelOrientation _side, funcPtr _draw); ~slideOutPanel(); + void resizePanel(int _w, int _h, int _y); void update(); void setCallback(funcPtr _cb, void *_args) { callback = _cb; cbArgs = _args; } void openPanel() { open = true; } diff --git a/inc/ui/ttl.h b/inc/ui/ttl.h index 8bb1921..35dc708 100644 --- a/inc/ui/ttl.h +++ b/inc/ui/ttl.h @@ -5,7 +5,7 @@ namespace ui void ttlInit(); void ttlExit(); void ttlSetActive(int usr); - void refreshAllViews(); + void ttlRefresh(); void populateFldMenu(); //JIC for func ptr diff --git a/inc/ui/usr.h b/inc/ui/usr.h index 047de2b..500e517 100644 --- a/inc/ui/usr.h +++ b/inc/ui/usr.h @@ -4,6 +4,7 @@ namespace ui { void usrInit(); void usrExit(); + void usrRefresh(); void usrUpdate(); void usrDraw(SDL_Texture *target); diff --git a/src/data.cpp b/src/data.cpp index 0d616a5..d48f033 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -211,7 +211,7 @@ static void loadTitlesFromRecords() bool data::loadUsersTitles(bool clearUsers) { - static unsigned systemUserCount = 3; + static unsigned systemUserCount = 4; FsSaveDataInfoReader it; FsSaveDataInfo info; s64 total = 0; @@ -477,7 +477,7 @@ void data::blacklistAdd(void *a) for(unsigned i = 0; i < _u.titleInfo.size(); i++) if(_u.titleInfo[i].saveID == *tid) _u.titleInfo.erase(_u.titleInfo.begin() + i); } - ui::refreshAllViews(); + ui::ttlRefresh(); delete tid; t->finished = true; } diff --git a/src/ui/ext.cpp b/src/ui/ext.cpp index 5dfbeaa..d026cb8 100644 --- a/src/ui/ext.cpp +++ b/src/ui/ext.cpp @@ -117,7 +117,9 @@ static void extMenuMountSysSave(void *a) //Todo: Not so simple now. static void extMenuReloadTitles(void *a) { - + data::loadUsersTitles(false); + ui::usrRefresh(); + ui::ttlRefresh(); } static void extMenuMountRomFS(void *a) @@ -134,8 +136,7 @@ static void extMenuMountRomFS(void *a) void ui::extInit() { - ui::extMenu = new ui::menu; - ui::extMenu->setParams(200, 24, 1002, 24, 4); + ui::extMenu = new ui::menu(200, 24, 1002, 24, 4); ui::extMenu->setCallback(extMenuCallback, NULL); ui::extMenu->setActive(false); for(unsigned i = 0; i < 11; i++) diff --git a/src/ui/fm.cpp b/src/ui/fm.cpp index 74194aa..735079c 100644 --- a/src/ui/fm.cpp +++ b/src/ui/fm.cpp @@ -224,12 +224,23 @@ static void _copyMenuCopy(void *a) menuFuncArgs *ma = (menuFuncArgs *)a; fs::backupArgs *b = ma->b; std::string srcPath, dstPath; - if(ma == devArgs) + int sel = b->m->getSelected(); + if(sel == 0 && ma == devArgs) { - srcPath = *ma->path + b->d->getItem(b->m->getSelected() - 2); - dstPath = *sdmcArgs->path + b->d->getItem(b->m->getSelected() - 2); + srcPath = *ma->path; + dstPath = *sdmcArgs->path; } - else + else if(sel > 1 && ma == devArgs) + { + srcPath = *ma->path + b->d->getItem(sel - 2); + dstPath = *sdmcArgs->path + b->d->getItem(sel - 2); + } + else if(sel == 0 && ma == sdmcArgs) + { + srcPath = *ma->path; + dstPath = *devArgs->path; + } + else if(sel > 1 && ma == sdmcArgs) { srcPath = *ma->path + b->d->getItem(b->m->getSelected() - 2); dstPath = *devArgs->path + b->d->getItem(b->m->getSelected() - 2); @@ -307,7 +318,7 @@ static void _copyMenuDelete(void *a) else if(sel > 1) itmPath = *ma->path + b->d->getItem(sel - 2); - if(sel == 0 || sel > 1) + if(ma == sdmcArgs || (ma == devArgs && (sel == 0 || sel > 1) && (type != FsSaveDataType_System || data::config["sysSaveWrite"]))) { ui::confirmArgs *send = ui::confirmArgsCreate(data::config["holdDel"], _copyMenuDelete_t, a, true, ui::confDel.c_str(), itmPath.c_str()); ui::confirm(send); @@ -381,17 +392,15 @@ void ui::fmInit() sdmcArgs->b = new fs::backupArgs; sdmcArgs->path = &sdPath; - devMenu = new ui::menu; + devMenu = new ui::menu(10, 8, 590, 18, 5); devMenu->setCallback(_devMenuCallback, devArgs); - devMenu->setParams(10, 8, 590, 18, 5); devMenu->setActive(true); devArgs->b->m = devMenu; devPanel = new ui::slideOutPanel(260, 720, 0, ui::SLD_LEFT, _devCopyPanelDraw); - devCopyMenu = new ui::menu; + devCopyMenu = new ui::menu(10, 236, 246, 20, 5); devCopyMenu->setActive(false); devCopyMenu->setCallback(_devCopyMenuCallback, NULL); - devCopyMenu->setParams(10, 236, 246, 20, 5); devCopyMenu->addOpt(NULL, ui::advMenuStr[0] + "SDMC"); for(int i = 1; i < 6; i++) devCopyMenu->addOpt(NULL, advMenuStr[i]); @@ -402,17 +411,15 @@ void ui::fmInit() devCopyMenu->optAddButtonEvent(5, HidNpadButton_A, _copyMenuClose, devArgs); ui::registerPanel(devPanel); - sdMenu = new ui::menu; + sdMenu = new ui::menu(620, 8, 590, 18, 5); sdMenu->setCallback(_sdMenuCallback, sdmcArgs); - sdMenu->setParams(620, 8, 590, 18, 5); sdMenu->setActive(false); sdmcArgs->b->m = sdMenu; sdPanel = new ui::slideOutPanel(260, 720, 0, ui::SLD_RIGHT, _sdCopyPanelDraw); - sdCopyMenu = new ui::menu; + sdCopyMenu = new ui::menu(10, 236, 246, 20, 5); sdCopyMenu->setActive(false); sdCopyMenu->setCallback(_sdCopyMenuCallback, NULL); - sdCopyMenu->setParams(10, 236, 246, 20, 5); for(int i = 0; i < 6; i++) sdCopyMenu->addOpt(NULL, advMenuStr[i]); sdCopyMenu->optAddButtonEvent(0, HidNpadButton_A, _copyMenuCopy, sdmcArgs); diff --git a/src/ui/miscui.cpp b/src/ui/miscui.cpp index 227e2d2..793c902 100644 --- a/src/ui/miscui.cpp +++ b/src/ui/miscui.cpp @@ -19,7 +19,7 @@ static const SDL_Color fillBar = {0x00, 0xDD, 0x00, 0xFF}; static const SDL_Color menuColorLight = {0x32, 0x50, 0xF0, 0xFF}; static const SDL_Color menuColorDark = {0x00, 0xFF, 0xC5, 0xFF}; -void ui::menu::setParams(const unsigned& _x, const unsigned& _y, const unsigned& _rW, const unsigned& _fS, const unsigned& _mL) +ui::menu::menu(const int& _x, const int& _y, const int& _rW, const int& _fS, const int& _mL) { x = _x; mY = _y; @@ -29,10 +29,14 @@ void ui::menu::setParams(const unsigned& _x, const unsigned& _y, const unsigned& rY = _y; fSize = _fS; mL = _mL; - rH = _fS + 32; + rH = _fS + 30; + spcWidth = gfx::getTextWidth(" ", _fS) * 3; + + optTex = SDL_CreateTexture(gfx::render, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC | SDL_TEXTUREACCESS_TARGET, rW - 24, rH - 8); + SDL_SetTextureBlendMode(optTex, SDL_BLENDMODE_BLEND); } -void ui::menu::editParam(int _param, unsigned newVal) +void ui::menu::editParam(int _param, int newVal) { switch(_param) { @@ -48,6 +52,10 @@ void ui::menu::editParam(int _param, unsigned newVal) rW = newVal; break; + case MENU_RECT_HEIGHT: + rH = newVal; + break; + case MENU_FONT_SIZE: fSize = newVal; break; @@ -61,25 +69,8 @@ void ui::menu::editParam(int _param, unsigned newVal) int ui::menu::addOpt(SDL_Texture *_icn, const std::string& add) { ui::menuOpt newOpt; - if((int)gfx::getTextWidth(add.c_str(), fSize) < rW - 56 || rW == 0) - newOpt.txt = add; - else - { - std::string tmp; - for(unsigned i = 0; i < add.length(); ) - { - uint32_t tmpChr = 0; - ssize_t untCnt = decode_utf8(&tmpChr, (uint8_t *)&add.c_str()[i]); - - tmp += add.substr(i, untCnt); - i += untCnt; - if((int)gfx::getTextWidth(tmp.c_str(), fSize) >= rW - 56) - { - newOpt.txt = tmp; - break; - } - } - } + newOpt.txt = add; + newOpt.txtWidth = gfx::getTextWidth(newOpt.txt.c_str(), fSize); newOpt.icn = _icn; opt.push_back(newOpt); return opt.size() - 1; @@ -112,6 +103,7 @@ int ui::menu::getOptPos(const std::string& txt) ui::menu::~menu() { + SDL_DestroyTexture(optTex); opt.clear(); } @@ -132,29 +124,49 @@ void ui::menu::update() fc = 0; int oldSel = selected; - int mSize = opt.size() - 1, scrL = mL - 1; + int mSize = opt.size() - 1; + bool change = false; if( (down & HidNpadButton_AnyUp) || ((held & HidNpadButton_AnyUp) && fc == 10) ) { if(selected > 0) --selected; + + change = true; } else if( (down & HidNpadButton_AnyDown) || ((held & HidNpadButton_AnyDown) && fc == 10)) { if(selected < mSize) ++selected; + + change = true; } else if(down & HidNpadButton_AnyLeft) { selected -= mL; if(selected < 0) selected = 0; + + change = true; } else if(down & HidNpadButton_AnyRight) { selected += mL; if(selected > mSize) selected = mSize; + + change = true; } + + ++hoverCount; + + if(!change && hoverCount >= 90) + hover = true; + else if(change) + { + hoverCount = 0; + hover = false; + } + if(down && !opt[selected].events.empty()) { for(ui::menuOptEvent& e : opt[selected].events) @@ -210,29 +222,59 @@ void ui::menu::draw(SDL_Texture *target, const SDL_Color *textClr, bool drawText if(tY < -rH || tY > tH) continue; - if(i == selected) + //Todo: Clean this up maybe + if(i == selected && drawText) { + gfx::clearTarget(optTex, &ui::transparent); if(isActive) ui::drawBoundBox(target, x, y + (i * rH), rW, rH, clrSh); gfx::drawRect(target, ui::thmID == ColorSetId_Light ? &menuColorLight : &menuColorDark, x + 10, ((y + (rH / 2 - fSize / 2)) + (i * rH)) - 2, 4, fSize + 4); - if(drawText) - gfx::drawTextf(target, fSize, x + 20, (y + (rH / 2 - fSize / 2)) + (i * rH), ui::thmID == ColorSetId_Light ? &menuColorLight : &menuColorDark, opt[i].txt.c_str()); - } - else - { - if(drawText) - gfx::drawTextf(target, fSize, x + 20, (y + (rH / 2 - fSize / 2)) + (i * rH), textClr, opt[i].txt.c_str()); - } - int w, h; - if(opt[i].icn && SDL_QueryTexture(opt[i].icn, NULL, NULL, &w, &h) == 0) + static int dX = 0; + if(hover && opt[i].txtWidth > rW - 24) + { + if((dX -= 2) <= -(opt[i].txtWidth + spcWidth)) + dX = 0; + + gfx::drawTextf(optTex, fSize, dX, ((rH - 8) / 2) - fSize / 2, ui::thmID == ColorSetId_Light ? &menuColorLight : &menuColorDark, opt[i].txt.c_str()); + gfx::drawTextf(optTex, fSize, dX + opt[i].txtWidth + spcWidth, ((rH - 8) / 2) - fSize / 2, ui::thmID == ColorSetId_Light ? &menuColorLight : &menuColorDark, opt[i].txt.c_str()); + } + else + { + dX = 0; + gfx::drawTextf(optTex, fSize, 0, ((rH - 8) / 2) - fSize / 2, ui::thmID == ColorSetId_Light ? &menuColorLight : &menuColorDark, opt[i].txt.c_str()); + } + + gfx::texDraw(target, optTex, x + 20, (y + 4 + (i * rH))); + } + else if(i == selected && !drawText && opt[i].icn) { + int w, h; + SDL_QueryTexture(opt[i].icn, NULL, NULL, &w, &h); float scale = (float)fSize / (float)h; int dW = scale * w; int dH = scale * h; + if(isActive) + ui::drawBoundBox(target, x, y + (i * rH), rW, rH, clrSh); gfx::texDrawStretch(target, opt[i].icn, x + 20, (y + (rH / 2 - fSize / 2)) + (i * rH), dW, dH); + gfx::drawRect(target, ui::thmID == ColorSetId_Light ? &menuColorLight : &menuColorDark, x + 10, ((y + (rH / 2 - fSize / 2)) + (i * rH)) - 2, 4, fSize + 4); + } + else if(drawText) + { + gfx::clearTarget(optTex, &ui::transparent); + gfx::drawTextf(optTex, fSize, 0, ((rH - 8) / 2) - fSize / 2, textClr, opt[i].txt.c_str()); + gfx::texDraw(target, optTex, x + 20, (y + 4 + (i * rH))); + } + else if(!drawText && opt[i].icn) + { + int w, h; + SDL_QueryTexture(opt[i].icn, NULL, NULL, &w, &h); + float scale = (float)fSize / (float)h; + int dW = scale * w; + int dH = scale * h; + gfx::texDrawStretch(target, opt[i].icn, x + 20, (y + (rH / 2 - fSize / 2)) + (i * rH), dW, dH); } } } diff --git a/src/ui/sett.cpp b/src/ui/sett.cpp index 0bf898c..a4b8774 100644 --- a/src/ui/sett.cpp +++ b/src/ui/sett.cpp @@ -110,7 +110,7 @@ static void toggleOpt(void *a) if(++data::sortType > 2) data::sortType = 0; data::loadUsersTitles(false); - ui::refreshAllViews(); + ui::ttlRefresh(); break; case 16: @@ -145,8 +145,7 @@ static void updateMenuText() void ui::settInit() { - ui::settMenu = new ui::menu; - ui::settMenu->setParams(200, 24, 1002, 24, 4); + ui::settMenu = new ui::menu(200, 24, 1002, 24, 4); ui::settMenu->setCallback(settMenuCallback, NULL); ui::settMenu->setActive(false); diff --git a/src/ui/sldpanel.cpp b/src/ui/sldpanel.cpp index c41f345..32cd46d 100644 --- a/src/ui/sldpanel.cpp +++ b/src/ui/sldpanel.cpp @@ -24,6 +24,19 @@ ui::slideOutPanel::~slideOutPanel() SDL_DestroyTexture(panel); } +void ui::slideOutPanel::resizePanel(int _w, int _h, int _y) +{ + w = _w; + h = _h; + y = _y; + if(sldSide == ui::SLD_LEFT) + x = -w; + + SDL_DestroyTexture(panel); + panel = SDL_CreateTexture(gfx::render, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC | SDL_TEXTUREACCESS_TARGET, w, h); + SDL_SetTextureBlendMode(panel, SDL_BLENDMODE_BLEND); +} + void ui::slideOutPanel::update() { if(open && callback) diff --git a/src/ui/ttl.cpp b/src/ui/ttl.cpp index a293373..553ffb9 100644 --- a/src/ui/ttl.cpp +++ b/src/ui/ttl.cpp @@ -15,7 +15,7 @@ static fs::backupArgs *backargs; static std::string infoPanelString; static SDL_Texture *fldBuffer;//This is so folder menu doesn't draw over guide -void ui::refreshAllViews() +void ui::ttlRefresh() { for(int i = 0; i < (int)data::users.size(); i++) ttlViews[i]->refresh(); @@ -116,7 +116,7 @@ static void ttlViewCallback(void *a) uint64_t sid = data::curData.saveID; data::favoriteTitle(sid); int newSel = data::getTitleIndexInUser(data::curUser, sid); - ui::refreshAllViews(); + ui::ttlRefresh(); ttlViews[data::selUser]->setSelected(newSel); } break; @@ -354,13 +354,11 @@ void ui::ttlInit() for(data::user& u : data::users) ttlViews.emplace_back(new ui::titleview(u, 128, 128, 16, 16, 7, ttlViewCallback)); - ttlOpts = new ui::menu; - ttlOpts->setParams(10, 32, 390, 20, 7); + ttlOpts = new ui::menu(10, 32, 390, 20, 7); ttlOpts->setCallback(ttlOptsCallback, NULL); ttlOpts->setActive(false); - fldMenu = new ui::menu; - fldMenu->setParams(10, 32, fldHelpWidth + 44, 20, 7); + fldMenu = new ui::menu(10, 8, fldHelpWidth + 44, 20, 6); fldMenu->setCallback(fldMenuCallback, NULL); fldMenu->setActive(false); @@ -393,7 +391,6 @@ void ui::ttlInit() ttlOpts->optAddButtonEvent(5, HidNpadButton_A, ttlOptsDeleteSaveData, NULL); ttlOpts->addOpt(NULL, ui::titleOptString[6]); ttlOpts->optAddButtonEvent(6, HidNpadButton_A, ttlOptsExtendSaveData, NULL); - } void ui::ttlExit() diff --git a/src/ui/usr.cpp b/src/ui/usr.cpp index 664a191..82b5db0 100644 --- a/src/ui/usr.cpp +++ b/src/ui/usr.cpp @@ -12,6 +12,8 @@ #include "usr.h" #include "ttl.h" +static const char *settText = "Settings", *extText = "Extras"; + //Main menu/Users + options, folder ui::menu *ui::usrMenu; ui::slideOutPanel *ui::usrSelPanel; @@ -127,7 +129,7 @@ static void usrOptSaveCreate(void *a) int bcatPos = m->getOptPos("BCAT"); int cachePos = m->getOptPos("Cache"); - ui::updateInput();//Todo: Need to go through with fine tooth comb so this isn't needed + ui::updateInput(); int sel = m->getSelected(); bool closeUsrOpt = false; if(sel == devPos && deviceSaveMenu->getOptCount() > 0) @@ -179,7 +181,7 @@ static void usrOptDeleteAllUserSaves_t(void *a) } } data::loadUsersTitles(false); - ui::refreshAllViews(); + ui::ttlRefresh(); t->finished = true; } @@ -317,7 +319,7 @@ static void createSaveData_t(void *a) if(R_SUCCEEDED(res = fsCreateSaveDataFileSystem(&attr, &svCreate, &meta))) { data::loadUsersTitles(false); - ui::refreshAllViews(); + ui::ttlRefresh(); } else { @@ -333,77 +335,18 @@ static void createSaveData(void *a) ui::newThread(createSaveData_t, a, NULL); } -void ui::usrInit() +//Sets up save create menus +static void initSaveCreateMenus() { - usrMenu = new ui::menu; - usrOptMenu = new ui::menu; - saveCreateMenu = new ui::menu; - deviceSaveMenu = new ui::menu; - bcatSaveMenu = new ui::menu; - cacheSaveMenu = new ui::menu; + saveCreateMenu->reset(); + deviceSaveMenu->reset(); + bcatSaveMenu->reset(); + cacheSaveMenu->reset(); - usrMenu->setParams(54, 16, 0, 106, 1); - usrOptMenu->setParams(8, 32, 390, 20, 6); - usrOptMenu->setCallback(usrOptCallback, NULL); - - saveCreateMenu->setParams(8, 32, 492, 20, 6); - saveCreateMenu->setActive(false); - saveCreateMenu->setCallback(saveCreateCallback, NULL); - - deviceSaveMenu->setParams(8, 32, 492, 20, 6); - deviceSaveMenu->setActive(false); - deviceSaveMenu->setCallback(saveCreateCallback, NULL); - - bcatSaveMenu->setParams(8, 32, 492, 20, 6); - bcatSaveMenu->setActive(false); - bcatSaveMenu->setCallback(saveCreateCallback, NULL); - - cacheSaveMenu->setParams(8, 32, 492, 20, 6); - cacheSaveMenu->setActive(false); - cacheSaveMenu->setCallback(saveCreateCallback, NULL); - - for(data::user u : data::users) - { - int usrPos = usrMenu->addOpt(u.getUserIcon(), u.getUsername()); - usrMenu->optAddButtonEvent(usrPos, HidNpadButton_A, toTTL, NULL); - } - - sett = util::createIconGeneric("Settings", 48, false); - int pos = usrMenu->addOpt(sett, "Settings"); - usrMenu->optAddButtonEvent(pos, HidNpadButton_A, toOPT, NULL); - - ext = util::createIconGeneric("Extras", 48, false); - pos = usrMenu->addOpt(ext, "Extras"); - usrMenu->optAddButtonEvent(pos, HidNpadButton_A, toEXT, NULL); - - usrMenu->setOnChangeFunc(onMainChange); - usrMenu->editParam(MENU_RECT_WIDTH, 136); - - usrSelPanel = new ui::slideOutPanel(200, 559, 89, ui::SLD_LEFT, _usrSelPanelDraw); - usrSelPanel->setX(0); - ui::registerPanel(usrSelPanel); - usrSelPanel->openPanel(); - - usrOptPanel = new ui::slideOutPanel(410, 720, 0, ui::SLD_RIGHT, usrOptPanelDraw); - ui::registerPanel(usrOptPanel); - - usrOptMenu->addOpt(NULL, ui::usrOptString[0]); - usrOptMenu->optAddButtonEvent(0, HidNpadButton_A, usrOptSaveCreate, usrMenu); - usrOptMenu->addOpt(NULL, ui::usrOptString[1]); - usrOptMenu->optAddButtonEvent(1, HidNpadButton_A, usrOptDeleteAllUserSaves, NULL); - usrOptMenu->setActive(false); - - saveCreatePanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, saveCreatePanelDraw); - ui::registerPanel(saveCreatePanel); - - deviceSavePanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, deviceSavePanelDraw); - ui::registerPanel(deviceSavePanel); - - bcatSavePanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, bcatSavePanelDraw); - ui::registerPanel(bcatSavePanel); - - cacheSavePanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, cacheSavePanelDraw); - ui::registerPanel(cacheSavePanel); + accSids.clear(); + devSids.clear(); + bcatSids.clear(); + cacheSids.clear(); accCreate = {FsSaveDataType_Account, saveCreateMenu}; devCreate = {FsSaveDataType_Device, deviceSaveMenu}; @@ -457,6 +400,76 @@ void ui::usrInit() cacheSaveMenu->addOpt(NULL, data::getTitleNameByTID(cacheSids[i])); cacheSaveMenu->optAddButtonEvent(i, HidNpadButton_A, createSaveData, &cacheCreate); } +} + +void ui::usrInit() +{ + usrMenu = new ui::menu(50, 16, 0, 112, 1); + usrOptMenu = new ui::menu(8, 32, 390, 20, 6); + saveCreateMenu = new ui::menu(8, 32, 492, 20, 6); + deviceSaveMenu = new ui::menu(8, 32, 492, 20, 6); + bcatSaveMenu = new ui::menu(8, 32, 492, 20, 6); + cacheSaveMenu = new ui::menu(8, 32, 492, 20, 6); + + usrOptMenu->setCallback(usrOptCallback, NULL); + + saveCreateMenu->setActive(false); + saveCreateMenu->setCallback(saveCreateCallback, NULL); + + deviceSaveMenu->setActive(false); + deviceSaveMenu->setCallback(saveCreateCallback, NULL); + + bcatSaveMenu->setActive(false); + bcatSaveMenu->setCallback(saveCreateCallback, NULL); + + cacheSaveMenu->setActive(false); + cacheSaveMenu->setCallback(saveCreateCallback, NULL); + + for(data::user u : data::users) + { + int usrPos = usrMenu->addOpt(u.getUserIcon(), u.getUsername()); + usrMenu->optAddButtonEvent(usrPos, HidNpadButton_A, toTTL, NULL); + } + + sett = util::createIconGeneric(settText, 48, false); + int pos = usrMenu->addOpt(sett, settText); + usrMenu->optAddButtonEvent(pos, HidNpadButton_A, toOPT, NULL); + + ext = util::createIconGeneric(extText, 48, false); + pos = usrMenu->addOpt(ext, extText); + usrMenu->optAddButtonEvent(pos, HidNpadButton_A, toEXT, NULL); + + usrMenu->setOnChangeFunc(onMainChange); + usrMenu->editParam(MENU_RECT_WIDTH, 142); + usrMenu->editParam(MENU_RECT_HEIGHT, 130); + + usrSelPanel = new ui::slideOutPanel(200, 559, 89, ui::SLD_LEFT, _usrSelPanelDraw); + usrSelPanel->setX(0); + ui::registerPanel(usrSelPanel); + usrSelPanel->openPanel(); + + usrOptPanel = new ui::slideOutPanel(410, 720, 0, ui::SLD_RIGHT, usrOptPanelDraw); + ui::registerPanel(usrOptPanel); + + usrOptMenu->addOpt(NULL, ui::usrOptString[0]); + usrOptMenu->optAddButtonEvent(0, HidNpadButton_A, usrOptSaveCreate, usrMenu); + usrOptMenu->addOpt(NULL, ui::usrOptString[1]); + usrOptMenu->optAddButtonEvent(1, HidNpadButton_A, usrOptDeleteAllUserSaves, NULL); + usrOptMenu->setActive(false); + + saveCreatePanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, saveCreatePanelDraw); + ui::registerPanel(saveCreatePanel); + + deviceSavePanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, deviceSavePanelDraw); + ui::registerPanel(deviceSavePanel); + + bcatSavePanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, bcatSavePanelDraw); + ui::registerPanel(bcatSavePanel); + + cacheSavePanel = new ui::slideOutPanel(512, 720, 0, ui::SLD_RIGHT, cacheSavePanelDraw); + ui::registerPanel(cacheSavePanel); + + initSaveCreateMenus(); usrHelpX = 1220 - gfx::getTextWidth(ui::userHelp.c_str(), 18); } @@ -481,16 +494,13 @@ void ui::usrExit() SDL_DestroyTexture(ext); } +void ui::usrRefresh() +{ + initSaveCreateMenus(); +} + void ui::usrUpdate() { - usrMenu->update(); - usrOptMenu->update(); - saveCreateMenu->update(); - deviceSaveMenu->update(); - bcatSaveMenu->update(); - cacheSaveMenu->update(); - - //Todo: Not this if(usrMenu->getActive()) { switch(ui::padKeysDown()) @@ -508,6 +518,12 @@ void ui::usrUpdate() break; } } + usrMenu->update(); + usrOptMenu->update(); + saveCreateMenu->update(); + deviceSaveMenu->update(); + bcatSaveMenu->update(); + cacheSaveMenu->update(); } void ui::usrDraw(SDL_Texture *target)