diff --git a/Makefile b/Makefile index bbf1643..e0360c9 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ INCLUDES := inc EXEFS_SRC := exefs_src APP_TITLE := JKSV APP_AUTHOR := JK -APP_VERSION := 05.24.2020 +APP_VERSION := 05.25.2020 ROMFS := romfs ICON := romfs/icon.jpg diff --git a/inc/data.h b/inc/data.h index efa6e92..51ce135 100644 --- a/inc/data.h +++ b/inc/data.h @@ -8,6 +8,9 @@ #include "gfx.h" +#define curUser users[data::selUser] +#define curData users[data::selUser].titles[data::selData] + namespace data { extern bool forceMount; @@ -135,8 +138,7 @@ namespace data //Adds title to blacklist void blacklistAdd(data::titledata& t); //Adds title to favorite list - void favoriteAdd(data::titledata& t); - void favoriteRemove(data::titledata& t); + void favoriteTitle(data::titledata& t); //User vector extern std::vector icons; @@ -146,11 +148,6 @@ namespace data extern int selUser, selData; extern SetLanguage sysLang; extern bool incDev, autoBack, ovrClk, holdDel, holdRest, holdOver, forceMount, accSysSave, sysSaveWrite, directFsCmd, skipUser; - - //Inline shortcuts to current user and current title. I might need to think of another way. - //Previous versions made full copies of vectors in memory, which i didn't like - inline data::user& curUser(){ return data::users[data::selUser]; } - inline data::titledata& curData(){ return curUser().titles[data::selData]; } } #endif // DATA_H diff --git a/inc/file.h b/inc/file.h index 4dd6678..865c911 100644 --- a/inc/file.h +++ b/inc/file.h @@ -67,6 +67,7 @@ namespace fs class dirList { public: + dirList() = default; dirList(const std::string& _path); void reassign(const std::string& _path); void rescan(); diff --git a/src/data.cpp b/src/data.cpp index f2be2d1..fbbfe6f 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -23,6 +23,9 @@ SetLanguage data::sysLang; bool data::incDev = false, data::autoBack = true, data::ovrClk = false, data::holdDel = true, data::holdRest = true, data::holdOver = true; bool data::forceMount = true, data::accSysSave = false, data::sysSaveWrite = false, data::directFsCmd = false, data::skipUser = false; +//For other save types +static bool sysBCATPushed = false, cachePushed = false, tempPushed = false; + static std::vector blacklist; static std::vector favorites; @@ -118,13 +121,17 @@ bool data::loadUsersTitles(bool clearUsers) for(data::user& u : data::users) u.titles.clear(); if(clearUsers) + { data::users.clear(); + sysBCATPushed = false; + cachePushed = false; + tempPushed = false; + } //Push system users - users.push_back(data::user(util::u128ToAccountUID(3), "Device Saves", createDeviceIcon())); - users.push_back(data::user(util::u128ToAccountUID(2), "BCAT")); - users.push_back(data::user(util::u128ToAccountUID(1), "System")); - //users.push_back(data::user(util::u128ToAccountUID(4), "Sys. BCAT")); + users.emplace_back(util::u128ToAccountUID(3), "Device Saves", createDeviceIcon()); + users.emplace_back(util::u128ToAccountUID(2), "BCAT"); + users.emplace_back(util::u128ToAccountUID(1), "System"); NsApplicationControlData *dat = new NsApplicationControlData; while(R_SUCCEEDED(fsSaveDataInfoReaderRead(&it, &info, 1, &total)) && total != 0) @@ -145,7 +152,30 @@ bool data::loadUsersTitles(bool clearUsers) break; case FsSaveDataType_SystemBcat: - //info.uid = util::u128ToAccountUID(4); + info.uid = util::u128ToAccountUID(4); + if(!sysBCATPushed) + { + sysBCATPushed = true; + users.emplace_back(util::u128ToAccountUID(4), "Sys. BCAT"); + } + break; + + case FsSaveDataType_Cache: + info.uid = util::u128ToAccountUID(5); + if(!cachePushed) + { + cachePushed = true; + users.emplace_back(util::u128ToAccountUID(5), "Cache"); + } + break; + + case FsSaveDataType_Temporary: + info.uid = util::u128ToAccountUID(6); + if(!tempPushed) + { + tempPushed = true; + users.emplace_back(util::u128ToAccountUID(6), "Temp"); + } break; } @@ -155,7 +185,7 @@ bool data::loadUsersTitles(bool clearUsers) int u = getUserIndex(info.uid); if(u == -1) { - users.insert(users.end() - 3, data::user(info.uid, "")); + users.emplace(users.end() - 3, info.uid, ""); u = getUserIndex(info.uid); } @@ -346,6 +376,8 @@ data::user::user(const AccountUid& _id, const std::string& _backupName) userSafe = _backupName.empty() ? getIDStr((uint64_t)uID128) : _backupName; userIcon = util::createIconGeneric(_backupName.c_str()); } + + titles.reserve(64); } data::user::user(const AccountUid& _id, const std::string& _backupName, tex *img) : user(_id, _backupName) @@ -390,30 +422,31 @@ void data::blacklistAdd(titledata& t) blacklist.push_back(tid); } -void data::favoriteAdd(titledata& t) +void data::favoriteTitle(titledata& t) { uint64_t tid = t.getID(); - for(data::user& _u : data::users) + if(!t.getFav()) { - for(unsigned i = 0; i < _u.titles.size(); i++) - if(_u.titles[i].getID() == tid) _u.titles[i].setFav(true); + for(data::user& _u : data::users) + { + for(unsigned i = 0; i < _u.titles.size(); i++) + if(_u.titles[i].getID() == tid) _u.titles[i].setFav(true); - std::sort(_u.titles.begin(), _u.titles.end(), sortTitles); + std::sort(_u.titles.begin(), _u.titles.end(), sortTitles); + } + favorites.push_back(tid); } - favorites.push_back(tid); -} - -void data::favoriteRemove(data::titledata& t) -{ - uint64_t tid = t.getID(); - auto ind = std::find(favorites.begin(), favorites.end(), tid); - favorites.erase(ind); - for(data::user& _u : data::users) + else { - for(unsigned i = 0; i < _u.titles.size(); i++) - if(_u.titles[i].getID() == tid) _u.titles[i].setFav(false); + auto ind = std::find(favorites.begin(), favorites.end(), tid); + favorites.erase(ind); + for(data::user& _u : data::users) + { + for(unsigned i = 0; i < _u.titles.size(); i++) + if(_u.titles[i].getID() == tid) _u.titles[i].setFav(false); - std::sort(_u.titles.begin(), _u.titles.end(), sortTitles); + std::sort(_u.titles.begin(), _u.titles.end(), sortTitles); + } } } diff --git a/src/ui.cpp b/src/ui.cpp index ca52b31..6050acf 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -10,7 +10,7 @@ #include "util.h" #include "file.h" -#define VER_STRING "v. 05.24.2020" +#define VER_STRING "v. 05.25.2020" //text mode bool ui::textMode = false; @@ -223,7 +223,7 @@ void ui::init() if(ui::textMode && data::skipUser) { - ui::textTitlePrep(data::curUser()); + ui::textTitlePrep(data::curUser); mstate = TXT_TTL; } else if(ui::textMode) diff --git a/src/ui/advmode.cpp b/src/ui/advmode.cpp index f6f20dd..89610a5 100644 --- a/src/ui/advmode.cpp +++ b/src/ui/advmode.cpp @@ -18,7 +18,7 @@ static std::string savePath, sdPath, dev; static int advMenuCtrl, advPrev; //Dir listings -fs::dirList saveList(""), sdList("sdmc:/"); +fs::dirList saveList, sdList; static bool commit = false; diff --git a/src/ui/fldrsel.cpp b/src/ui/fldrsel.cpp index b0cdfc7..7bd684b 100644 --- a/src/ui/fldrsel.cpp +++ b/src/ui/fldrsel.cpp @@ -28,11 +28,11 @@ void ui::createNewBackup(const uint64_t& held) std::string folder; if(held & KEY_R) - folder = data::curUser().getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YMD); + folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YMD); else if(held & KEY_L) - folder = data::curUser().getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YDM); + folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YDM); else if(held & KEY_ZL) - folder = data::curUser().getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_HOYSTE); + folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_HOYSTE); else { const std::string dict[] = @@ -42,31 +42,31 @@ void ui::createNewBackup(const uint64_t& held) util::getDateTime(util::DATE_FMT_HOYSTE), util::getDateTime(util::DATE_FMT_JHK), util::getDateTime(util::DATE_FMT_ASC), - data::curUser().getUsernameSafe(), - data::curData().getTitleSafe().length() < 24 ? data::curData().getTitleSafe() : util::generateAbbrev(data::curData()) + data::curUser.getUsernameSafe(), + data::curData.getTitleSafe().length() < 24 ? data::curData.getTitleSafe() : util::generateAbbrev(data::curData) }; folder = util::getStringInput("", "Enter a folder name", 64, 7, dict); } if(!folder.empty()) { - std::string path = data::curData().getPath() + "/" + folder; + std::string path = data::curData.getPath() + "/" + folder; mkdir(path.c_str(), 777); path += "/"; fs::copyDirToDir("sv:/", path); - folderMenuPrepare(data::curUser(), data::curData()); + folderMenuPrepare(data::curUser, data::curData); } } void ui::overwriteBackup(unsigned ind) { - fs::dirList list(data::curData().getPath()); + fs::dirList list(data::curData.getPath()); std::string folderName = list.getItem(ind); if(confirm(data::holdOver, ui::confOverwrite.c_str(), folderName.c_str())) { - std::string toPath = data::curData().getPath() + folderName + "/"; + std::string toPath = data::curData.getPath() + folderName + "/"; //Delete and recreate fs::delDir(toPath); mkdir(toPath.c_str(), 777); @@ -79,16 +79,16 @@ void ui::overwriteBackup(unsigned ind) void ui::restoreBackup(unsigned ind) { - if((data::curData().getType() != FsSaveDataType_System || data::sysSaveWrite) && folderMenu.getSelected() > 0) + if((data::curData.getType() != FsSaveDataType_System || data::sysSaveWrite) && folderMenu.getSelected() > 0) { - fs::dirList list(data::curData().getPath()); + fs::dirList list(data::curData.getPath()); std::string folderName = list.getItem(ind); if(confirm(data::holdRest, ui::confRestore.c_str(), folderName.c_str())) { if(data::autoBack) { - std::string autoFolder = data::curData().getPath() + "/AUTO - " + data::curUser().getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_ASC); + std::string autoFolder = data::curData.getPath() + "/AUTO - " + data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_ASC); mkdir(autoFolder.c_str(), 777); autoFolder += "/"; @@ -96,7 +96,7 @@ void ui::restoreBackup(unsigned ind) fs::copyDirToDir(root, autoFolder); } - std::string fromPath = data::curData().getPath() + folderName + "/"; + std::string fromPath = data::curData.getPath() + folderName + "/"; std::string root = "sv:/"; fs::delDir(root); @@ -106,23 +106,23 @@ void ui::restoreBackup(unsigned ind) //Rescan init folder menu if autobak to show changes if(data::autoBack) - folderMenuPrepare(data::curUser(), data::curData()); + folderMenuPrepare(data::curUser, data::curData); } } } void ui::deleteBackup(unsigned ind) { - fs::dirList list(data::curData().getPath()); + fs::dirList list(data::curData.getPath()); std::string folderName = list.getItem(folderMenu.getSelected() - 1); if(ui::confirmDelete(folderName)) { - std::string delPath = data::curData().getPath() + folderName + "/"; + std::string delPath = data::curData.getPath() + folderName + "/"; fs::delDir(delPath); } - folderMenuPrepare(data::curUser(), data::curData()); + folderMenuPrepare(data::curUser, data::curData); } void ui::updateFolderMenu(const uint64_t& down, const uint64_t& held) @@ -132,7 +132,7 @@ void ui::updateFolderMenu(const uint64_t& down, const uint64_t& held) //Draw folder menu folderMenu.draw(ui::txtCont); - data::curData().icon.draw(96, 98); + data::curData.icon.draw(96, 98); drawTextWrap(folderMenuInfo.c_str(), frameBuffer, ui::shared, 60, 370, 16, ui::txtCont, 360); @@ -149,10 +149,10 @@ void ui::updateFolderMenu(const uint64_t& down, const uint64_t& held) ui::deleteBackup(folderMenu.getSelected() - 1); else if(down & KEY_MINUS) { - advModePrep("sv:/", data::curData().getType(), true); + advModePrep("sv:/", data::curData.getType(), true); mstate = ADV_MDE; } - else if(down & KEY_ZR && data::curData().getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData().getTitle().c_str())) + else if(down & KEY_ZR && data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData.getTitle().c_str())) { fs::delDir("sv:/"); fsdevCommitDevice("sv"); diff --git a/src/ui/ttlsel.cpp b/src/ui/ttlsel.cpp index 395704c..a615c33 100644 --- a/src/ui/ttlsel.cpp +++ b/src/ui/ttlsel.cpp @@ -37,8 +37,8 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) unsigned x = 70, y = 98; unsigned endTitle = start + 32; - if(start + 32 > (int)data::curUser().titles.size()) - endTitle = data::curUser().titles.size(); + if(start + 32 > (int)data::curUser.titles.size()) + endTitle = data::curUser.titles.size(); //draw Rect so it's always behind icons drawBoundBox(selRectX, selRectY, 140, 140, clrShft); @@ -56,7 +56,7 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) selRectX = tX - 6; selRectY = y - 6; - std::string title = data::curData().getTitle(); + std::string title = data::curData.getTitle(); unsigned titleWidth = textGetWidth(title.c_str(), ui::shared, 18); int rectWidth = titleWidth + 32, rectX = (tX + 64) - (rectWidth / 2); if(rectX < 16) @@ -68,16 +68,16 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) drawText(title.c_str(), frameBuffer, ui::shared, rectX + 16, y - 40, 18, ui::txtDiag); } - if(data::curUser().titles[i].getFav()) - data::curUser().titles[i].icon.drawFavHalf(tX, y); + if(data::curUser.titles[i].getFav()) + data::curUser.titles[i].icon.drawFavHalf(tX, y); else - data::curUser().titles[i].icon.drawHalf(tX, y); + data::curUser.titles[i].icon.drawHalf(tX, y); } } if(down & KEY_RIGHT) { - if(data::selData < (int)data::curUser().titles.size() - 1) + if(data::selData < (int)data::curUser.titles.size() - 1) data::selData++; if(data::selData >= (int)start + 32) @@ -103,26 +103,26 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) else if(down & KEY_DOWN) { data::selData += 8; - if(data::selData > (int)data::curUser().titles.size() - 1) - data::selData = data::curUser().titles.size() - 1; + if(data::selData > (int)data::curUser.titles.size() - 1) + data::selData = data::curUser.titles.size() - 1; if(data::selData - start >= 32) start += 8; } - else if(down & KEY_A && fs::mountSave(data::curUser(), data::curData())) + else if(down & KEY_A && fs::mountSave(data::curUser, data::curData)) { - folderMenuPrepare(data::curUser(), data::curData()); + folderMenuPrepare(data::curUser, data::curData); //Wanna change this sometime - ui::folderMenuInfo = util::getInfoString(data::curUser(), data::curData()); + ui::folderMenuInfo = util::getInfoString(data::curUser, data::curData); mstate = FLD_SEL; } else if(down & KEY_Y) - fs::dumpAllUserSaves(data::curUser()); + fs::dumpAllUserSaves(data::curUser); else if(down & KEY_MINUS) { - if(ui::confirm(false, ui::confBlacklist.c_str(), data::curUser().titles[data::selData].getTitle().c_str())) - data::blacklistAdd(data::curData()); + if(ui::confirm(false, ui::confBlacklist.c_str(), data::curUser.titles[data::selData].getTitle().c_str())) + data::blacklistAdd(data::curData); } else if(down & KEY_B) { @@ -141,9 +141,7 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) start = 0; data::selData = 0; selRectX = 64, selRectY = 90; - data::curUser() = data::users[data::selUser]; - - ui::showPopup(data::curUser().getUsername(), POP_FRAME_DEFAULT); + ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT); } else if(down & KEY_R) { @@ -153,13 +151,11 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) start = 0; data::selData = 0; selRectX = 64, selRectY = 90; - data::curUser() = data::users[data::selUser]; - - ui::showPopup(data::curUser().getUsername(), POP_FRAME_DEFAULT); + ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT); } else if(down & KEY_ZR) { - data::titledata tempData = data::curUser().titles[data::selData]; + data::titledata tempData = data::curUser.titles[data::selData]; if(tempData.getType() == FsSaveDataType_System) ui::showMessage("*NO*", "Deleting system save archives is disabled."); else if(confirm(true, ui::confEraseNand.c_str(), tempData.getTitle().c_str())) @@ -170,11 +166,6 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held) } } else if(down & KEY_X) - { - if(!data::curData().getFav()) - data::favoriteAdd(data::curData()); - else - data::favoriteRemove(data::curData()); - } + data::favoriteTitle(data::curData); } diff --git a/src/ui/txtui.cpp b/src/ui/txtui.cpp index bdd49e8..64d482e 100644 --- a/src/ui/txtui.cpp +++ b/src/ui/txtui.cpp @@ -88,7 +88,7 @@ void ui::textUserMenuUpdate(const uint64_t& down, const uint64_t& held) if(data::users[userMenu.getSelected()].titles.size() > 0) { data::selUser = userMenu.getSelected(); - textTitlePrep(data::curUser()); + textTitlePrep(data::curUser); mstate = TXT_TTL; } else @@ -122,66 +122,54 @@ void ui::textTitleMenuUpdate(const uint64_t& down, const uint64_t& held) if(down & KEY_A) { data::selData = titleMenu.getSelected(); - if(fs::mountSave(data::curUser(), data::curData())) + if(fs::mountSave(data::curUser, data::curData)) { - textFolderPrep(data::curUser(), data::curData()); + textFolderPrep(data::curUser, data::curData); mstate = TXT_FLD; } } else if(down & KEY_Y) { - fs::dumpAllUserSaves(data::curUser()); + fs::dumpAllUserSaves(data::curUser); } else if(down & KEY_MINUS) { data::selData = titleMenu.getSelected(); - if(ui::confirm(false, ui::confBlacklist.c_str(), data::curData().getTitle().c_str())) - data::blacklistAdd(data::curData()); + if(ui::confirm(false, ui::confBlacklist.c_str(), data::curData.getTitle().c_str())) + data::blacklistAdd(data::curData); - textTitlePrep(data::curUser()); + textTitlePrep(data::curUser); } else if(down & KEY_L) { if(--data::selUser < 0) data::selUser = data::users.size() - 1; - - data::curUser() = data::users[data::selUser]; - textTitlePrep(data::curUser()); - - ui::showPopup(data::curUser().getUsername(), POP_FRAME_DEFAULT); + textTitlePrep(data::curUser); + ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT); } else if(down & KEY_R) { if(++data::selUser > (int)data::users.size() - 1) data::selUser = 0; - - data::curUser() = data::users[data::selUser]; - textTitlePrep(data::curUser()); - - ui::showPopup(data::curUser().getUsername(), POP_FRAME_DEFAULT); + textTitlePrep(data::curUser); + ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT); } else if(down & KEY_X) { data::selData = titleMenu.getSelected(); - if(!data::curData().getFav()) - data::favoriteAdd(data::curData()); - else - data::favoriteRemove(data::curData()); - - textTitlePrep(data::curUser()); + data::favoriteTitle(data::curData); + textTitlePrep(data::curUser); } else if(down & KEY_ZR) { - data::titledata tempData = data::curUser().titles[titleMenu.getSelected()]; + data::titledata tempData = data::curUser.titles[titleMenu.getSelected()]; if(tempData.getType() == FsSaveDataType_System) ui::showMessage("*NO*", "Deleting system save archives is disabled."); else if(confirm(true, ui::confEraseNand.c_str(), tempData.getTitle().c_str())) { fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId_User, tempData.getSaveID()); - data::loadUsersTitles(false); - data::curUser() = data::users[data::selUser]; - ui::textTitlePrep(data::curUser()); + ui::textTitlePrep(data::curUser); } } else if(down & KEY_B) @@ -207,10 +195,10 @@ void ui::textFolderMenuUpdate(const uint64_t& down, const uint64_t& held) deleteBackup(folderMenu.getSelected() - 1); else if(down & KEY_MINUS) { - advModePrep("sv:/", data::curData().getType(), true); + advModePrep("sv:/", data::curData.getType(), true); mstate = ADV_MDE; } - else if(down & KEY_ZR && data::curData().getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData().getTitle().c_str())) + else if(down & KEY_ZR && data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData.getTitle().c_str())) { fs::delDir("sv:/"); fsdevCommitDevice("sv"); @@ -238,12 +226,12 @@ void ui::updateExMenu(const uint64_t& down, const uint64_t& held) { fsdevUnmountDevice("sv"); FsFileSystem sv; - data::curData().setType(FsSaveDataType_System); + data::curData.setType(FsSaveDataType_System); switch(exMenu.getSelected()) { case 0: - data::curData().setType(FsSaveDataType_Bcat); - advModePrep("sdmc:/", data::curData().getType(), false); + data::curData.setType(FsSaveDataType_Bcat); + advModePrep("sdmc:/", data::curData.getType(), false); mstate = ADV_MDE; prevState = EX_MNU; break; @@ -326,8 +314,7 @@ void ui::updateExMenu(const uint64_t& down, const uint64_t& held) if(R_SUCCEEDED(fsOpen_SystemSaveData(&sv, FsSaveDataSpaceId_System, mountID, (AccountUid) {0}))) { fsdevMountDevice("sv", sv); - advModePrep("sv:/", data::curData().getType(), true); - data::curData().setType(FsSaveDataType_SystemBcat); + advModePrep("sv:/", data::curData.getType(), true); prevState = EX_MNU; mstate = ADV_MDE; } @@ -346,7 +333,6 @@ void ui::updateExMenu(const uint64_t& down, const uint64_t& held) { fsdevMountDevice("tromfs", tromfs); advModePrep("tromfs:/", FsSaveDataType_Account, false); - data::curData().setType(FsSaveDataType_System); ui::mstate = ADV_MDE; ui::prevState = EX_MNU; } diff --git a/src/ui/usrsel.cpp b/src/ui/usrsel.cpp index 93818e4..529501e 100644 --- a/src/ui/usrsel.cpp +++ b/src/ui/usrsel.cpp @@ -15,7 +15,7 @@ void ui::updateUserMenu(const uint64_t& down, const uint64_t& held) static uint8_t clrShft = 0; static bool clrAdd = true; - static unsigned selRectX = 364, selRectY = 160; + static unsigned selRectX = 276, selRectY = 160; if(clrAdd) { @@ -30,14 +30,14 @@ void ui::updateUserMenu(const uint64_t& down, const uint64_t& held) clrAdd = true; } - unsigned x = 368, y = 164; + unsigned x = 280, y = 164; unsigned endUser = data::users.size(); drawBoundBox(selRectX, selRectY, 140, 140, clrShft); for(unsigned i = start; i < endUser; y += 136) { - unsigned endRow = i + 4; + unsigned endRow = i + 5; for(unsigned tX = x; i < endRow; i++, tX += 144) { if(i == endUser)