update/fix some stuff

This commit is contained in:
J-D-K 2021-07-11 02:47:45 -04:00
parent 3f8a53a3d8
commit f75cf63cf7
11 changed files with 406 additions and 354 deletions

View File

@ -1,9 +0,0 @@
#pragma once
namespace ui
{
void fldInit();
void fldExit();
void fldUpdate();
void fldDraw();
}

View File

@ -1,5 +1,6 @@
#pragma once
#include <vector>
#include <SDL.h>
#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<ui::titleTile *> tiles;
};
//General use

View File

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

View File

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

View File

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

View File

@ -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<ui::slideOutPanel *> 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

View File

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

View File

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

View File

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

View File

@ -1,38 +1,89 @@
#include <vector>
#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<titleTile> titleList;
static ui::menu *ttlOpts;
static ui::slideOutPanel *ttlOptsPanel, *infoPanel;
int ttlHelpX = 0;
static std::vector<ui::titleview *> 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());
}

View File

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