diff --git a/inc/fld.h b/inc/fld.h deleted file mode 100644 index e018243..0000000 --- a/inc/fld.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -namespace ui -{ - void fldInit(); - void fldExit(); - void fldUpdate(); - void fldDraw(); -} diff --git a/inc/miscui.h b/inc/miscui.h index 549401b..05ff5d7 100644 --- a/inc/miscui.h +++ b/inc/miscui.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "type.h" @@ -16,7 +17,7 @@ typedef enum FUNC_B, FUNC_X, FUNC_Y, -} funcBtn; +} menuFuncTypes; typedef enum { @@ -48,7 +49,7 @@ namespace ui void editParam(int _param, unsigned newVal); //Gets executed when menu changes at all - void setOnChangeFunc(funcPtr func){ onChange = func; } + void setOnChangeFunc(funcPtr func) { onChange = func; } //executed when .update() is called. void setCallback(funcPtr _callback, void *args) { callback = _callback; callbackArgs = args; } @@ -59,7 +60,7 @@ namespace ui void editOpt(int ind, SDL_Texture *_icn, const std::string& ch); void setOptFunc(unsigned _ind, unsigned _funcbtn, funcPtr _func, void *args); - void updateOptArgs(unsigned _ind, unsigned _funcbtn, void *args){ opt[_ind].argPtr[_funcbtn] = args; } + void updateOptArgs(unsigned _ind, unsigned _funcbtn, void *args) { opt[_ind].argPtr[_funcbtn] = args; } int getOptPos(const std::string& txt); @@ -124,6 +125,8 @@ namespace ui slideOutPanel(int _w, int _h, int _y, funcPtr _draw); ~slideOutPanel(); + void update(); + void setCallback(funcPtr _cb, void *_args) { callback = _cb; cbArgs = _args; } void openPanel() { open = true; } void closePanel() { open = false; } bool isOpen() { return open; } @@ -133,7 +136,55 @@ namespace ui int w, h, x = 1280, y, slideSpd = 0; bool open = false; SDL_Texture *panel; - funcPtr drawFunc; + funcPtr drawFunc, callback = NULL; + void *cbArgs = NULL; + }; + + class titleTile + { + public: + titleTile(unsigned _w, unsigned _h, bool _fav, SDL_Texture *_icon) + { + w = _w; + h = _h; + wS = _w; + hS = _h; + fav = _fav; + icon = _icon; + } + + void draw(SDL_Texture *target, int x, int y, bool sel); + + private: + unsigned w, h, wS, hS; + bool fav = false; + SDL_Texture *icon; + }; + + //Todo less hardcode etc + class titleview + { + public: + titleview(const data::user& _u, int _iconW, int _iconH, int _horGap, int _vertGap, int _rowCount, funcPtr _callback); + ~titleview(); + + void update(); + void refresh(); + + void setActive(bool _set) { active = _set; } + bool getActive(){ return active; } + void setSelected(int _set){ selected = _set; } + int getSelected(){ return selected; } + void draw(SDL_Texture *target); + + private: + const data::user *u;//Might not be safe. Users *shouldn't* be touched after initial load + bool active = false, clrAdd = true; + uint8_t clrShft = 0; + funcPtr callback = NULL; + int x = 34, y = 69, selected = 0, selRectX = 10, selRectY = 45; + int iconW, iconH, horGap, vertGap, rowCount; + std::vector tiles; }; //General use diff --git a/inc/ttl.h b/inc/ttl.h index 66327ff..7584e81 100644 --- a/inc/ttl.h +++ b/inc/ttl.h @@ -4,9 +4,11 @@ namespace ui { void ttlInit(); void ttlExit(); + void ttlSetActive(int usr); + void refreshAllViews(); + void populateFldMenu(); //JIC for func ptr - void setupTiles(void *); void ttlReset(); void ttlUpdate(); void ttlDraw(SDL_Texture *target); diff --git a/inc/ui.h b/inc/ui.h index efcc7d6..dfd38cb 100644 --- a/inc/ui.h +++ b/inc/ui.h @@ -12,17 +12,12 @@ #include "uistr.h" #include "usr.h" #include "ttl.h" -#include "fld.h" enum menuState { USR_SEL, TTL_SEL, - FLD_SEL, ADV_MDE, - TXT_USR, - TXT_TTL, - TXT_FLD, EX_MNU, OPT_MNU }; @@ -82,7 +77,8 @@ namespace ui void exit(); //Adds a panel pointer to a vector since they need to be drawn over everything else - void addPanel(slideOutPanel *sop); + int registerMenu(ui::menu *m); + int registerPanel(ui::slideOutPanel *sop); //Just draws a screen and flips JIC boot takes long. void showLoadScreen(); diff --git a/src/file.cpp b/src/file.cpp index 8f0f4a4..291e332 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -878,7 +878,7 @@ void fs::createNewBackup(void *a) } break; } - ui::fldInit(); + ui::populateFldMenu(); } } @@ -910,6 +910,7 @@ void fs::overwriteBackup(void *a) zipClose(zip, NULL); } } + ui::populateFldMenu(); } void fs::restoreBackup(void *a) @@ -970,7 +971,7 @@ void fs::restoreBackup(void *a) } if(data::autoBack) - ui::fldInit(); + ui::populateFldMenu(); } void fs::deleteBackup(void *a) @@ -994,7 +995,7 @@ void fs::deleteBackup(void *a) std::string delPath = util::generatePathByTID(data::curData.saveID) + itemName; fs::delfile(delPath); } - ui::fldInit(); + ui::populateFldMenu(); } } diff --git a/src/ui.cpp b/src/ui.cpp index 4f0c1fd..2055838 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -53,6 +53,7 @@ unsigned leftWidth = 410; //Vector of pointers to slideOutPanels. Is looped and drawn last so they are always on top std::vector panels; +static unsigned int panelCount = 0; void ui::initTheme() { @@ -83,7 +84,7 @@ void ui::initTheme() rectSh = {0x20, 0x20, 0x20, 0xFF}; tboxClr = {0xEB, 0xEB, 0xEB, 0xFF}; divClr = {0xFF, 0xFF, 0xFF, 0xFF}; - slidePanelColor = {0x2F, 0x2F, 0x2F, 0xDD}; + slidePanelColor = {0x00, 0x00, 0x00, 0xDD}; break; } } @@ -159,7 +160,6 @@ void ui::exit() { ui::usrExit(); ui::ttlExit(); - ui::fldExit(); SDL_DestroyTexture(cornerTopLeft); SDL_DestroyTexture(cornerTopRight); @@ -179,9 +179,10 @@ void ui::exit() SDL_DestroyTexture(icn); } -void ui::addPanel(slideOutPanel *sop) +int ui::registerPanel(slideOutPanel *sop) { panels.push_back(sop); + return panelCount++; } void ui::showLoadScreen() @@ -215,7 +216,6 @@ void ui::drawUI() ui::ttlDraw(rightPanel); gfx::texDraw(NULL, rightPanel, 200, 89); gfx::texDraw(NULL, leftPanel, 0, 89); - ui::fldDraw(); for(slideOutPanel *s : panels) s->draw(&ui::slidePanelColor); } @@ -242,10 +242,6 @@ bool ui::runApp() ttlUpdate(); break; - case FLD_SEL: - fldUpdate(); - break; - case OPT_MNU: /*optMenu.update(); if(down & HidNpadButton_B) @@ -282,6 +278,7 @@ void ui::toTTL(void *a) if(data::curUser.titleInfo.size() > 0) { ui::changeState(TTL_SEL); + ui::ttlSetActive(data::selUser); ui::usrMenuSetActive(false); } else diff --git a/src/ui/advmode.cpp b/src/ui/advmode.cpp index 590e1fb..62529fa 100644 --- a/src/ui/advmode.cpp +++ b/src/ui/advmode.cpp @@ -519,10 +519,6 @@ void updateAdvMode(const uint64_t& down, const uint64_t& held) case TTL_SEL: ui::mstate = TTL_SEL; break; - - default: - ui::mstate = ui::textMode ? TXT_FLD : FLD_SEL; - break; } } } diff --git a/src/ui/fld.cpp b/src/ui/fld.cpp deleted file mode 100644 index f05402e..0000000 --- a/src/ui/fld.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include "fld.h" -#include "ui.h" -#include "file.h" -#include "data.h" -#include "util.h" - -static ui::slideOutPanel *fldSlide = NULL; -static ui::menu fldMenu; -static fs::dirList fldList; -static fs::backupArgs backargs; - -static void fldCallback(void *a) -{ - if(ui::padKeysDown() & HidNpadButton_B) - { - fs::unmountSave(); - fldSlide->closePanel(); - ui::changeState(TTL_SEL); - } -} - -static void slideDrawFunc(void *a) -{ - //Slide panel passes texture/target to draw func - SDL_Texture *panel = (SDL_Texture *)a; - fldMenu.draw(panel, &ui::txtCont, true); -} - -void ui::fldInit() -{ - //Only allocate new if null - if(!fldSlide) - { - fldSlide = new ui::slideOutPanel(410, 720, 0, slideDrawFunc); - ui::addPanel(fldSlide); - } - - fldMenu.reset(); - fldMenu.setParams(12, 32, 390, MENU_FONT_SIZE_DEFAULT, 8); - fldMenu.setCallback(fldCallback, NULL); - - util::createTitleDirectoryByTID(data::curUser.titleInfo[data::selData].saveID); - std::string folderPath = util::generatePathByTID(data::curUser.titleInfo[data::selData].saveID); - - fldList.reassign(folderPath); - fs::loadPathFilters(folderPath + "pathFilters.txt"); - - backargs = {&fldMenu, &fldList}; - - fldMenu.addOpt(NULL, "New"); - fldMenu.setOptFunc(0, FUNC_A, fs::createNewBackup, &backargs); - - //Same as above, args updated at press - for(unsigned i = 0; i < fldList.getCount(); i++) - { - fldMenu.addOpt(NULL, fldList.getItem(i)); - - //Pass the menu to the functions so selected can be grabbed - //offset i by 1 since new is always first option - fldMenu.setOptFunc(i + 1, FUNC_A, fs::overwriteBackup, &backargs); - fldMenu.setOptFunc(i + 1, FUNC_X, fs::deleteBackup, &backargs); - fldMenu.setOptFunc(i + 1, FUNC_Y, fs::restoreBackup, &backargs); - } - fldSlide->openPanel(); -} - -void ui::fldExit() -{ - if(fldSlide) - delete fldSlide; -} - -void ui::fldUpdate() -{ - fldMenu.update(); -} - -void ui::fldDraw() -{ - /*if(fldSlide) - fldSlide->draw(&slidePanelColor);*/ -} diff --git a/src/ui/miscui.cpp b/src/ui/miscui.cpp index afe2cfe..61c26fb 100644 --- a/src/ui/miscui.cpp +++ b/src/ui/miscui.cpp @@ -316,7 +316,7 @@ ui::slideOutPanel::slideOutPanel(int _w, int _h, int _y, funcPtr _draw) SDL_SetTextureBlendMode(panel, SDL_BLENDMODE_BLEND); int getDiv = 99; - while(w % getDiv != 0){ getDiv--; } + while(w % getDiv != 0) { getDiv--; } slideSpd = getDiv; } @@ -325,6 +325,12 @@ ui::slideOutPanel::~slideOutPanel() SDL_DestroyTexture(panel); } +void ui::slideOutPanel::update() +{ + if(open && callback) + (*callback)(cbArgs); +} + void ui::slideOutPanel::draw(const SDL_Color *backCol) { gfx::clearTarget(panel, backCol); @@ -346,6 +352,168 @@ void ui::slideOutPanel::draw(const SDL_Color *backCol) } } +//Todo make less hardcoded +void ui::titleTile::draw(SDL_Texture *target, int x, int y, bool sel) +{ + if(sel) + { + unsigned xScale = w * 1.28, yScale = h * 1.28; + if(wS < xScale) + wS += 18; + if(hS < yScale) + hS += 18; + } + else + { + if(wS > w) + wS -= 9; + if(hS > h) + hS -= 9; + } + + int dX = x - ((wS - w) / 2); + int dY = y - ((hS - h) / 2); + gfx::texDrawStretch(target, icon, dX, dY, wS, hS); + if(fav) + gfx::drawTextf(target, 20, dX + 8, dY + 8, &ui::heartColor, "♥"); +} + +ui::titleview::titleview(const data::user& _u, int _iconW, int _iconH, int _horGap, int _vertGap, int _rowCount, funcPtr _callback) +{ + iconW = _iconW; + iconH = _iconH; + horGap = _horGap; + vertGap = _vertGap; + rowCount = _rowCount; + callback = _callback; + u = &_u; + + for(const data::userTitleInfo& t : u->titleInfo) + tiles.emplace_back(new ui::titleTile(_iconW, _iconH, data::isFavorite(t.saveID), data::getTitleIconByTID(t.saveID))); +} + +ui::titleview::~titleview() +{ + for(ui::titleTile *t : tiles) + delete t; +} + +void ui::titleview::refresh() +{ + for(ui::titleTile *t : tiles) + delete t; + + tiles.clear(); + for(const data::userTitleInfo& t : u->titleInfo) + tiles.emplace_back(new ui::titleTile(iconW, iconH, data::isFavorite(t.saveID), data::getTitleIconByTID(t.saveID))); +} + +void ui::titleview::update() +{ + if(selected > tiles.size() - 1) + selected = tiles.size() - 1; + + if(!active) + return; + + switch(ui::padKeysDown()) + { + case HidNpadButton_StickLUp: + case HidNpadButton_StickRUp: + case HidNpadButton_Up: + if((selected -= rowCount) < 0) + selected = 0; + break; + + case HidNpadButton_StickLDown: + case HidNpadButton_StickRDown: + case HidNpadButton_Down: + if((selected += rowCount) > tiles.size() - 1) + selected = tiles.size() - 1; + break; + + case HidNpadButton_StickLLeft: + case HidNpadButton_StickRLeft: + case HidNpadButton_Left: + if(selected > 0) + --selected; + break; + + case HidNpadButton_StickLRight: + case HidNpadButton_StickRRight: + case HidNpadButton_Right: + if(selected < tiles.size() - 1) + ++selected; + break; + + case HidNpadButton_L: + if((selected -= rowCount * 3) < 0) + selected = 0; + break; + + case HidNpadButton_R: + if((selected += rowCount * 3) > tiles.size() - 1) + selected = tiles.size() - 1; + break; + } + + if(callback) + (*callback)(this); +} + +void ui::titleview::draw(SDL_Texture *target) +{ + if(selRectY > 264) + y -= 48; + else if(selRectY > 144) + y -= 24; + else if(selRectY < -82) + y += 48; + else if(selRectY < 38) + y += 24; + + if(clrAdd) + { + clrShft += 6; + if(clrShft >= 0x72) + clrAdd = false; + } + else + { + clrShft -= 3; + if(clrShft <= 0) + clrAdd = true; + } + + int totalTitles = tiles.size(), selX = 32, selY = 64; + for(int tY = y, i = 0; i < totalTitles; tY += iconH + vertGap) + { + int endRow = i + rowCount; + for(int tX = x; i < endRow; tX += iconW + horGap, i++) + { + if(i >= totalTitles) + break; + + if(i == selected && active) + { + //save x and y for later so it's draw over top + selX = tX; + selY = tY; + selRectX = tX - 24; + selRectY = tY - 24; + } + else + tiles[i]->draw(target, tX, tY, false); + } + } + + if(active) + { + ui::drawBoundBox(target, selRectX, selRectY, 176, 176, clrShft); + tiles[selected]->draw(target, selX, selY, true); + } +} + void ui::showMessage(const char *head, const char *fmt, ...) { char tmp[1024]; @@ -576,4 +744,3 @@ void ui::drawPopup(const uint64_t& down) drawTextbox(NULL, popX, popY, popWidth, 64); gfx::drawTextf(NULL, 24, popX + 16, popY + 20, &ui::txtDiag, popText.c_str()); } - diff --git a/src/ui/ttl.cpp b/src/ui/ttl.cpp index 25142ac..a7621ad 100644 --- a/src/ui/ttl.cpp +++ b/src/ui/ttl.cpp @@ -1,38 +1,89 @@ +#include + #include "ui.h" #include "ttl.h" #include "file.h" #include "util.h" -class titleTile -{ - public: - titleTile(unsigned _w, unsigned _h, bool _fav, SDL_Texture *_icon) - { - w = _w; - h = _h; - wS = _w; - hS = _h; - fav = _fav; - icon = _icon; - } - - void draw(SDL_Texture *target, int x, int y, bool sel); - - private: - unsigned w, h, wS, hS; - bool fav = false; - SDL_Texture *icon; -}; - -static uint8_t clrShft = 0; -static bool clrAdd = true; -static int selRectX = 38, selRectY = 38; -static int x = 34, y = 69, ttlHelpX = 0; -static std::vector titleList; -static ui::menu *ttlOpts; -static ui::slideOutPanel *ttlOptsPanel, *infoPanel; +int ttlHelpX = 0; +static std::vector ttlViews; +static ui::menu *ttlOpts, *fldMenu; +static ui::slideOutPanel *ttlOptsPanel, *infoPanel, *fldPanel;//There's no reason to have a separate folder section +static fs::dirList *fldList; +static fs::backupArgs *backargs; static std::string infoPanelString; +void ui::refreshAllViews() +{ + for(int i = 0; i < data::users.size(); i++) + ttlViews[i]->refresh(); +} + +void ui::populateFldMenu() +{ + fldMenu->reset(); + + util::createTitleDirectoryByTID(data::curData.saveID); + std::string targetDir = util::generatePathByTID(data::curData.saveID); + + fldList->reassign(targetDir); + fs::loadPathFilters(targetDir + "pathFilters.txt"); + + *backargs = {fldMenu, fldList}; + + fldMenu->addOpt(NULL, "New"); + fldMenu->setOptFunc(0, FUNC_A, fs::createNewBackup, backargs); + + for(unsigned i = 0; i < fldList->getCount(); i++) + { + fldMenu->addOpt(NULL, fldList->getItem(i)); + + fldMenu->setOptFunc(i + 1, FUNC_A, fs::overwriteBackup, backargs); + fldMenu->setOptFunc(i + 1, FUNC_X, fs::deleteBackup, backargs); + fldMenu->setOptFunc(i + 1, FUNC_Y, fs::restoreBackup, backargs); + } + + fldMenu->setActive(true); + fldPanel->openPanel(); +} + +static void ttlViewCallback(void *a) +{ + data::selData = ttlViews[data::selUser]->getSelected(); + switch(ui::padKeysDown()) + { + case HidNpadButton_A: + if(fs::mountSave(data::curData.saveInfo)) + ui::populateFldMenu(); + break; + + case HidNpadButton_B: + ttlViews[data::selUser]->setActive(false); + ui::usrMenuSetActive(true); + ui::changeState(USR_SEL); + break; + + case HidNpadButton_X: + if(data::curUser.getUID128() != 0)//system + { + data::selData = ttlViews[data::selUser]->getSelected(); + ttlOpts->setActive(true); + ttlOptsPanel->openPanel(); + } + break; + + case HidNpadButton_Y: + { + uint64_t sid = data::curData.saveID; + data::favoriteTitle(sid); + int newSel = data::getTitleIndexInUser(data::curUser, sid); + ttlViews[data::selUser]->refresh(); + ttlViews[data::selUser]->setSelected(newSel); + } + break; + } +} + static void ttlOptsCallback(void *a) { switch(ui::padKeysDown()) @@ -45,6 +96,18 @@ static void ttlOptsCallback(void *a) } } +static void infoPanelCallback(void *a) +{ + switch(ui::padKeysDown()) + { + case HidNpadButton_B: + infoPanel->closePanel(); + ttlOptsPanel->openPanel(); + ttlOpts->setActive(true); + break; + } +} + static void ttlOptsPanelDraw(void *a) { SDL_Texture *panel = (SDL_Texture *)a; @@ -65,7 +128,7 @@ static void ttlOptsBlacklistTitle(void *a) if(ui::confirm(false, ui::confBlacklist.c_str(), title.c_str())) { data::blacklistAdd(data::curData.saveID); - ui::setupTiles(NULL); + ui::refreshAllViews(); } } @@ -81,6 +144,25 @@ static void ttlOptsResetSaveData(void *a) } } +static void fldMenuCallback(void *a) +{ + switch(ui::padKeysDown()) + { + case HidNpadButton_B: + fs::unmountSave(); + fldMenu->setActive(false); + fldPanel->closePanel(); + break; + } + ui::updateInput(); +} + +static void fldPanelDraw(void *a) +{ + SDL_Texture *target = (SDL_Texture *)a; + fldMenu->draw(target, &ui::txtCont, true); +} + static void ttlOptsDeleteSaveData(void *a) { FsSaveDataAttribute attr; @@ -99,14 +181,12 @@ static void ttlOptsDeleteSaveData(void *a) { //Kick back to user ttlOptsPanel->closePanel();//JIC + ttlViews[data::selUser]->setActive(false); ui::usrMenuSetActive(true); ui::changeState(USR_SEL); } - else if(data::selData > (int)data::curUser.titleInfo.size() - 1) - data::selData = data::curUser.titleInfo.size() - 1; - - ui::setupTiles(NULL); ui::showPopup(POP_FRAME_DEFAULT, ui::saveDataDeleteSuccess.c_str(), title.c_str()); + ttlViews[data::selUser]->refresh(); } } @@ -121,15 +201,31 @@ void ui::ttlInit() { ttlHelpX = 1220 - gfx::getTextWidth(ui::titleHelp.c_str(), 18); + 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, 18, 8); + ttlOpts->setCallback(ttlOptsCallback, NULL); + ttlOpts->setActive(false); + + fldMenu = new ui::menu; + fldMenu->setParams(10, 32, 390, 18, 8); + fldMenu->setCallback(fldMenuCallback, NULL); + fldMenu->setActive(false); ttlOptsPanel = new ui::slideOutPanel(410, 720, 0, ttlOptsPanelDraw); - ttlOpts->setCallback(ttlOptsCallback, NULL); - ui::addPanel(ttlOptsPanel); + ui::registerPanel(ttlOptsPanel); infoPanel = new ui::slideOutPanel(410, 720, 0, infoPanelDraw); - ui::addPanel(infoPanel); + ui::registerPanel(infoPanel); + infoPanel->setCallback(infoPanelCallback, NULL); + + fldPanel = new ui::slideOutPanel(410, 720, 0, fldPanelDraw); + ui::registerPanel(fldPanel); + + fldList = new fs::dirList; + backargs = new fs::backupArgs; ttlOpts->setActive(false); ttlOpts->addOpt(NULL, ui::titleOptString[0]); @@ -144,204 +240,40 @@ void ui::ttlInit() void ui::ttlExit() { + for(ui::titleview *t : ttlViews) + delete t; + delete ttlOptsPanel; delete ttlOpts; delete infoPanel; + delete fldPanel; + delete ttlOpts; + delete fldMenu; + delete fldList; + delete backargs; } -void ui::setupTiles(void *) +void ui::ttlSetActive(int usr) { - titleList.clear(); - int infoSize = data::curUser.titleInfo.size(); - for(int i = 0; i < infoSize; i++) - { - uint64_t sid = data::curUser.titleInfo[i].saveID; - SDL_Texture *iconPtr = data::getTitleIconByTID(sid); - bool fav = data::isFavorite(sid); - titleList.emplace_back(128, 128, fav, iconPtr); - } -} - -void ui::ttlReset() -{ - clrShft = 0; - clrAdd = true; - selRectX = 38; - selRectY = 38; - x = 34; - y = 69; - //Reset data - data::selData = 0; -} - -static inline void updateTitleScroll() -{ - if(selRectY > 264) - y -= 48; - else if(selRectY > 144) - y -= 24; - else if(selRectY < -82) - y += 48; - else if(selRectY < 38) - y += 24; + ttlViews[usr]->setActive(true); } void ui::ttlUpdate() { ttlOpts->update(); + infoPanel->update(); + fldMenu->update(); - if(ttlOptsPanel->isOpen() || infoPanel->isOpen()) + //todo: this better + if(ttlOptsPanel->isOpen() || infoPanel->isOpen() || fldPanel->isOpen()) return; - uint64_t down = ui::padKeysDown(); - - switch(down) - { - case HidNpadButton_A: - if(fs::mountSave(data::curData.saveInfo)) - { - fldInit(); - ui::changeState(FLD_SEL); - } - else - ui::showPopup(POP_FRAME_DEFAULT, "Failed to Mount save!"); - break; - - case HidNpadButton_B: - ui::usrMenuSetActive(true); - ui::changeState(USR_SEL); - break; - - case HidNpadButton_X: - ttlOpts->setActive(true); - ttlOptsPanel->openPanel(); - break; - - case HidNpadButton_Y: - { - uint64_t sid = data::curData.saveID; - data::favoriteTitle(sid); - setupTiles(NULL); - if(data::isFavorite(sid)) - data::selData = data::getTitleIndexInUser(data::curUser, sid); - } - break; - - case HidNpadButton_StickLUp: - case HidNpadButton_Up: - data::selData -= 7; - if(data::selData < 0) - data::selData = 0; - break; - - case HidNpadButton_StickLDown: - case HidNpadButton_Down: - data::selData += 7; - if(data::selData > (int)data::curUser.titleInfo.size() - 1) - data::selData = data::curUser.titleInfo.size() - 1; - break; - - case HidNpadButton_StickLLeft: - case HidNpadButton_Left: - if(data::selData > 0) - --data::selData; - break; - - case HidNpadButton_StickLRight: - case HidNpadButton_Right: - if(data::selData < (int)data::curUser.titleInfo.size() - 1) - ++data::selData; - break; - - case HidNpadButton_L: - if(data::selData - 21 > 0) - data::selData -= 21; - else - data::selData = 0; - break; - - case HidNpadButton_R: - if(data::selData + 21 < (int)data::curUser.titleInfo.size()) - data::selData += 21; - else - data::selData = data::curUser.titleInfo.size() - 1; - break; - } + ttlViews[data::selUser]->update(); } void ui::ttlDraw(SDL_Texture *target) { - updateTitleScroll(); - - if(clrAdd) - { - clrShft += 6; - if(clrShft >= 0x72) - clrAdd = false; - } - else - { - clrShft -= 3; - if(clrShft <= 0) - clrAdd = true; - } - - int totalTiles = titleList.size(); - int selX = 0, selY = 0; - for(int tY = y, i = 0; i < totalTiles; tY += 144) - { - int endRow = i + 7; - for(int tX = x; i < endRow; tX += 144, i++) - { - if(i >= totalTiles) - break; - - if(i == data::selData && (ui::mstate == TTL_SEL|| ui::mstate == FLD_SEL)) - { - //save x and y for selected for later so it's drawn on top. - //I can't find anyway to change the Z for SDL. - selX = tX; - selY = tY; - selRectX = tX - 24; - selRectY = tY - 24; - } - else - titleList[i].draw(target, tX, tY, false); - } - } - - if(ui::mstate == TTL_SEL || ui::mstate == FLD_SEL) - { - //Draw selected after so it's on top - ui::drawBoundBox(target, selRectX, selRectY, 176, 176, clrShft); - titleList[data::selData].draw(target, selX, selY, true); - if(ui::mstate == TTL_SEL) - gfx::drawTextf(NULL, 18, ttlHelpX, 673, &ui::txtCont, ui::titleHelp.c_str()); - } -} - -//Todo make less hardcoded -void titleTile::draw(SDL_Texture *target, int x, int y, bool sel) -{ - if(sel) - { - unsigned xScale = w * 1.28, yScale = w * 1.28; - if(wS < xScale) - wS += 18; - if(hS < yScale) - hS += 18; - } - else - { - if(wS > w) - wS -= 18; - if(hS > h) - hS -= 18; - } - - int dX = x - ((wS - w) / 2); - int dY = y - ((hS - h) / 2); - gfx::texDrawStretch(target, icon, dX, dY, wS, hS); - if(fav) - gfx::drawTextf(target, 20, dX + 8, dY + 8, &ui::heartColor, "♥"); + ttlViews[data::selUser]->draw(target); + if(ui::mstate == TTL_SEL) + gfx::drawTextf(NULL, 18, ttlHelpX, 673, &ui::txtCont, ui::titleHelp.c_str()); } diff --git a/src/ui/usr.cpp b/src/ui/usr.cpp index b0287be..a71cc1c 100644 --- a/src/ui/usr.cpp +++ b/src/ui/usr.cpp @@ -15,22 +15,19 @@ static ui::menu *usrMenu, *usrOptMenu, *saveCreateMenu; static ui::slideOutPanel *usrOptPanel, *saveCreatePanel; +//Icons for settings + extras +static SDL_Texture *sett, *ext; + //This stores save ids to match with saveCreateMenu //Probably needs/should be changed static std::vector sids; static unsigned optsPos = 0, extPos = 0, usrHelpX = 0; -fs::backupArgs backargs; - static void onMainChange(void *a) { if(usrMenu->getSelected() < (int)data::users.size()) - { data::selUser = usrMenu->getSelected(); - ui::ttlReset(); - ui::setupTiles(NULL); - } } static void toOPT(void *a) @@ -134,7 +131,7 @@ static void createSaveData(void *a) { ui::showPopup(POP_FRAME_DEFAULT, ui::saveCreated.c_str(), create->title.c_str()); data::loadUsersTitles(false); - ui::setupTiles(NULL); + ui::refreshAllViews(); } else { @@ -162,11 +159,13 @@ void ui::usrInit() usrMenu->setOptFunc(ind, FUNC_A, toTTL, NULL); } - usrMenu->addOpt(NULL, "Settings"); + sett = util::createIconGeneric("Settings", 40); + usrMenu->addOpt(sett, "Settings"); optsPos = usrMenu->getOptPos("Settings"); usrMenu->setOptFunc(optsPos, FUNC_A, toOPT, NULL); - usrMenu->addOpt(NULL, "Extras"); + ext = util::createIconGeneric("Extras", 40); + usrMenu->addOpt(ext, "Extras"); extPos = usrMenu->getOptPos("Extras"); usrMenu->setOptFunc(extPos, FUNC_A, toEXT, NULL); @@ -175,24 +174,24 @@ void ui::usrInit() usrMenu->editParam(MENU_RECT_WIDTH, 126); usrOptPanel = new ui::slideOutPanel(410, 720, 0, usrOptPanelDraw); - ui::addPanel(usrOptPanel); + ui::registerPanel(usrOptPanel); usrOptMenu->addOpt(NULL, ui::usrOptString[0]); usrOptMenu->setOptFunc(0, FUNC_A, usrOptSaveCreate, NULL); usrOptMenu->setActive(false); saveCreatePanel = new ui::slideOutPanel(410, 720, 0, saveCreatePanelDraw); saveCreateMenu->setActive(false); - ui::addPanel(saveCreatePanel); + ui::registerPanel(saveCreatePanel); unsigned i = 0; for(auto& t : data::titles) { - saveCreateMenu->addOpt(NULL, t.second.title); - saveCreateMenu->setOptFunc(i++, FUNC_A, createSaveData, saveCreateMenu); - sids.push_back(t.first); + if(t.second.nacp.user_account_save_data_size > 0) + { + saveCreateMenu->addOpt(NULL, t.second.title); + saveCreateMenu->setOptFunc(i++, FUNC_A, createSaveData, saveCreateMenu); + sids.push_back(t.first); + } } - - setupTiles(NULL); - usrHelpX = 1220 - gfx::getTextWidth(ui::userHelp.c_str(), 18); } @@ -203,6 +202,8 @@ void ui::usrExit() delete usrMenu; delete usrOptMenu; delete saveCreateMenu; + SDL_DestroyTexture(sett); + SDL_DestroyTexture(ext); } void ui::usrMenuSetActive(bool _set)