mirror of
https://github.com/J-D-K/JKSV.git
synced 2026-03-21 17:24:37 -05:00
update/fix some stuff
This commit is contained in:
parent
3f8a53a3d8
commit
f75cf63cf7
|
|
@ -1,9 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
namespace ui
|
||||
{
|
||||
void fldInit();
|
||||
void fldExit();
|
||||
void fldUpdate();
|
||||
void fldDraw();
|
||||
}
|
||||
59
inc/miscui.h
59
inc/miscui.h
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
8
inc/ui.h
8
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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
13
src/ui.cpp
13
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<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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);*/
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
368
src/ui/ttl.cpp
368
src/ui/ttl.cpp
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user