diff --git a/HBC/META.XML b/HBC/META.XML index f5ad7cec..83466734 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,8 +2,8 @@ USB Loader GX USB Loader GX Team - 2.1 r1086 - 201106032029 + 2.1 r1087 + 201106041627 Loads games from USB-devices USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. diff --git a/source/libwiigui/gui_gamebrowser.cpp b/source/libwiigui/gui_gamebrowser.cpp index a2580a56..bd4f0b1d 100644 --- a/source/libwiigui/gui_gamebrowser.cpp +++ b/source/libwiigui/gui_gamebrowser.cpp @@ -380,7 +380,7 @@ void GuiGameBrowser::Update(GuiTrigger * t) if (i != selectedItem && game[i]->GetState() == STATE_SELECTED) game[i]->ResetState(); else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT) - game[selectedItem]->SetState(STATE_SELECTED, t->chan); + game[selectedItem]->SetState(STATE_SELECTED, -1); } game[i]->Update(t); diff --git a/source/libwiigui/gui_searchbar.cpp b/source/libwiigui/gui_searchbar.cpp index 96dca82b..cb270bf9 100644 --- a/source/libwiigui/gui_searchbar.cpp +++ b/source/libwiigui/gui_searchbar.cpp @@ -36,6 +36,7 @@ GuiSearchBar::GuiSearchBar(const wchar_t *SearchChars) : keyOverImageData(Resources::GetFile("keyboard_key_over.png"), Resources::GetFileSize("keyboard_key_over.png")) { trig.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); cnt = wcslen(SearchChars); @@ -83,6 +84,10 @@ GuiSearchBar::GuiSearchBar(const wchar_t *SearchChars) : ClearBtn = new GuiButton(ClearBtnImg, ClearBtnImg_Over, ALIGN_RIGHT, ALIGN_TOP, -10, 10, &trig, btnSoundOver, btnSoundClick, 1); this->Append(ClearBtn); + CloseBtn = new GuiButton(0, 0); + CloseBtn->SetTrigger(&trigB); + this->Append(CloseBtn); + // SetPosition(100,100); } @@ -99,6 +104,8 @@ GuiSearchBar::~GuiSearchBar() delete ClearBtnImg_Over; delete imgClearBtn; + delete CloseBtn; + delete BacspaceBtn; delete BacspaceBtnImg; delete BacspaceBtnImg_Over; @@ -151,7 +158,8 @@ wchar_t GuiSearchBar::GetClicked() } } if (BacspaceBtn->GetState() == STATE_CLICKED) return 8; - if (ClearBtn->GetState() == STATE_CLICKED) return 7; + else if (ClearBtn->GetState() == STATE_CLICKED) return 7; + else if (CloseBtn->GetState() == STATE_CLICKED) return 27; return 0; } diff --git a/source/libwiigui/gui_searchbar.h b/source/libwiigui/gui_searchbar.h index 32d953f8..da60e909 100644 --- a/source/libwiigui/gui_searchbar.h +++ b/source/libwiigui/gui_searchbar.h @@ -27,12 +27,15 @@ class GuiSearchBar: public GuiWindow GuiImage* ClearBtnImg_Over; GuiButton* ClearBtn; + GuiButton* CloseBtn; + cSearchButton **buttons; int cnt; GuiImageData keyImageData; GuiImageData keyOverImageData; GuiTrigger trig; + GuiTrigger trigB; }; -#endif \ No newline at end of file +#endif diff --git a/source/menu/GameBrowseMenu.cpp b/source/menu/GameBrowseMenu.cpp index fbe451ed..428978a4 100644 --- a/source/menu/GameBrowseMenu.cpp +++ b/source/menu/GameBrowseMenu.cpp @@ -193,6 +193,7 @@ GameBrowseMenu::GameBrowseMenu() favoriteBtnImg_g->SetWidescreen(Settings.widescreen); favoriteBtn = new GuiButton(favoriteBtnImg_g, favoriteBtnImg_g, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, favoriteBtnTT, -15, 52, 0, 3); + favoriteBtn->SetSelectable(false); searchBtnTT = new GuiTooltip(tr( "Set Search-Filter" )); if (Settings.wsprompt) searchBtnTT->SetWidescreen(Settings.widescreen); @@ -203,6 +204,7 @@ GameBrowseMenu::GameBrowseMenu() searchBtnImg_g->SetWidescreen(Settings.widescreen); searchBtn = new GuiButton(searchBtnImg_g, searchBtnImg_g, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, searchBtnTT, -15, 52, 0, 3); + searchBtn->SetSelectable(false); sortBtnTT = new GuiTooltip(" "); if (Settings.wsprompt) sortBtnTT->SetWidescreen(Settings.widescreen); @@ -211,6 +213,7 @@ GameBrowseMenu::GameBrowseMenu() sortBtnImg = new GuiImage(imgabcIcon); sortBtnImg->SetWidescreen(Settings.widescreen); sortBtn = new GuiButton(sortBtnImg, sortBtnImg, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, sortBtnTT, -15, 52, 0, 3); + sortBtn->SetSelectable(false); categBtnTT = new GuiTooltip(tr("Select game categories")); if (Settings.wsprompt) sortBtnTT->SetWidescreen(Settings.widescreen); @@ -221,6 +224,7 @@ GameBrowseMenu::GameBrowseMenu() categBtnImg_g = new GuiImage(imgCategory_gray); categBtnImg_g->SetWidescreen(Settings.widescreen); categBtn = new GuiButton(categBtnImg, categBtnImg, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, categBtnTT, -15, 52, 0, 3); + categBtn->SetSelectable(false); listBtnTT = new GuiTooltip(tr( "Display as a list" )); if (Settings.wsprompt) listBtnTT->SetWidescreen(Settings.widescreen); @@ -230,6 +234,7 @@ GameBrowseMenu::GameBrowseMenu() listBtnImg_g = new GuiImage(imgarrangeList_gray); listBtnImg_g->SetWidescreen(Settings.widescreen); listBtn = new GuiButton(listBtnImg_g, listBtnImg_g, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, listBtnTT, 15, 52, 1, 3); + listBtn->SetSelectable(false); gridBtnTT = new GuiTooltip(tr( "Display as a grid" )); if (Settings.wsprompt) gridBtnTT->SetWidescreen(Settings.widescreen); @@ -239,6 +244,7 @@ GameBrowseMenu::GameBrowseMenu() gridBtnImg_g = new GuiImage(imgarrangeGrid_gray); gridBtnImg_g->SetWidescreen(Settings.widescreen); gridBtn = new GuiButton(gridBtnImg_g, gridBtnImg_g, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, gridBtnTT, 15, 52, 1, 3); + gridBtn->SetSelectable(false); carouselBtnTT = new GuiTooltip(tr( "Display as a carousel" )); if (Settings.wsprompt) carouselBtnTT->SetWidescreen(Settings.widescreen); @@ -248,6 +254,7 @@ GameBrowseMenu::GameBrowseMenu() carouselBtnImg_g = new GuiImage(imgarrangeCarousel_gray); carouselBtnImg_g->SetWidescreen(Settings.widescreen); carouselBtn = new GuiButton(carouselBtnImg_g, carouselBtnImg_g, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, carouselBtnTT, 15, 52, 1, 3); + carouselBtn->SetSelectable(false); lockBtnTT = new GuiTooltip(NULL); if (Settings.wsprompt) lockBtnTT->SetWidescreen(Settings.widescreen); @@ -257,6 +264,7 @@ GameBrowseMenu::GameBrowseMenu() lockBtnImg_g = new GuiImage(imgLock_gray); lockBtnImg_g->SetWidescreen(Settings.widescreen); lockBtn = new GuiButton(lockBtnImg_g, lockBtnImg_g, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, lockBtnTT, 15, 52, 1, 3); + lockBtn->SetSelectable(false); unlockBtnImg = new GuiImage(imgUnlock); unlockBtnImg->SetWidescreen(Settings.widescreen); @@ -272,6 +280,7 @@ GameBrowseMenu::GameBrowseMenu() dvdBtnImg_g->SetWidescreen(Settings.widescreen); dvdBtn = new GuiButton(dvdBtnImg_g, dvdBtnImg_g, ALIGN_LEFT, ALIGN_TOP, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1, dvdBtnTT, 15, 52, 1, 3); + dvdBtn->SetSelectable(false); homebrewBtnTT = new GuiTooltip(tr( "Homebrew Launcher" )); if (Settings.wsprompt) homebrewBtnTT->SetWidescreen(Settings.widescreen); @@ -293,6 +302,7 @@ GameBrowseMenu::GameBrowseMenu() DownloadBtn->SetTrigger(0, trigA); DownloadBtn->SetTrigger(1, trig1); DownloadBtn->SetToolTip(DownloadBtnTT, 205, -30); + DownloadBtn->SetSelectable(false); gameCoverImg = new GuiImage(); gameCoverImg->SetPosition(thInt("26 - cover/download btn pos x"), thInt("58 - cover/download btn pos y")); @@ -307,6 +317,7 @@ GameBrowseMenu::GameBrowseMenu() idBtn->SetSoundOver(btnSoundOver); idBtn->SetTrigger(0, trigA); idBtn->SetToolTip(IDBtnTT, 205, -30); + idBtn->SetSelectable(false); GXColor clockColor = thColor("r=138 g=138 b=138 a=240 - clock color"); clockTimeBack = new GuiText("88:88", 40, (GXColor) {clockColor.r, clockColor.g, clockColor.b, clockColor.a / 6}); @@ -917,11 +928,16 @@ int GameBrowseMenu::MainLoop() gameList.FilterList(newFilter); } - else if (searchChar == 7) //! Close + else if (searchChar == 27) //! Close { show_searchwindow = false; searchBtn->StopEffect(); } + else if (searchChar == 7) //! Clear + { + gameList.FilterList(L""); + Settings.gridRows = GridRowsPreSearch; //! restore old rows amount so we don't stay on one row + } else if (searchChar == 8) //! Backspace { int len = wcslen(gameList.GetCurrentFilter()); diff --git a/source/settings/menus/GameLoadSM.cpp b/source/settings/menus/GameLoadSM.cpp index bd0449e6..d5d78e44 100644 --- a/source/settings/menus/GameLoadSM.cpp +++ b/source/settings/menus/GameLoadSM.cpp @@ -209,9 +209,9 @@ void GameLoadSM::SetOptionValues() if(GameConfig.returnTo) { const char* TitleName = NULL; - int haveTitle = NandTitles.FindU32(Settings.returnTo); - if (haveTitle >= 0) - TitleName = NandTitles.NameFromIndex(haveTitle); + u64 tid = NandTitles.FindU32(Settings.returnTo); + if (tid > 0) + TitleName = NandTitles.NameOf(tid); Options->SetValue(Idx++, "%s", TitleName ? TitleName : strlen(Settings.returnTo) > 0 ? Settings.returnTo : tr( OnOffText[0] )); } diff --git a/source/settings/menus/LoaderSettings.cpp b/source/settings/menus/LoaderSettings.cpp index e70bcd27..067a7cde 100644 --- a/source/settings/menus/LoaderSettings.cpp +++ b/source/settings/menus/LoaderSettings.cpp @@ -228,9 +228,9 @@ void LoaderSettings::SetOptionValues() //! Settings: Return To const char* TitleName = NULL; - int haveTitle = NandTitles.FindU32(Settings.returnTo); - if (haveTitle >= 0) - TitleName = NandTitles.NameFromIndex(haveTitle); + u64 tid = NandTitles.FindU32(Settings.returnTo); + if (tid > 0) + TitleName = NandTitles.NameOf(tid); TitleName = TitleName ? TitleName : strlen(Settings.returnTo) > 0 ? Settings.returnTo : tr(OnOffText[0]); Options->SetValue(Idx++, "%s", TitleName); diff --git a/source/usbloader/GameBooter.cpp b/source/usbloader/GameBooter.cpp index e3d0bf87..317e5cbd 100644 --- a/source/usbloader/GameBooter.cpp +++ b/source/usbloader/GameBooter.cpp @@ -193,7 +193,7 @@ int GameBooter::BootGame(const char * gameID) u8 alternatedol = game_cfg->loadalternatedol; u32 alternatedoloffset = game_cfg->alternatedolstart; u8 reloadblock = game_cfg->iosreloadblock; - u64 returnToChoice = game_cfg->returnTo ? NandTitles.At(NandTitles.FindU32(Settings.returnTo)) : 0; + u64 returnToChoice = game_cfg->returnTo ? NandTitles.FindU32(Settings.returnTo) : 0; //! Prepare alternate dol settings SetupAltDOL(gameHeader.id, alternatedol, alternatedoloffset); diff --git a/source/wad/nandtitle.cpp b/source/wad/nandtitle.cpp index 61b0f46e..40daf370 100644 --- a/source/wad/nandtitle.cpp +++ b/source/wad/nandtitle.cpp @@ -1,4 +1,5 @@ #include +#include #include "nandtitle.h" #include "usbloader/playlog.h" #include "utils/tools.h" @@ -8,28 +9,6 @@ NandTitle NandTitles; static u8 tmd_buf[MAX_SIGNED_TMD_SIZE] ATTRIBUTE_ALIGN( 32 ); -//based on one from comex's nand formatter -static u64 atoi_hex(const char *s) -{ - u64 ret = 0; - u32 n = strlen(s); - - for (u32 i = 0; i < n; i++) - { - if (s[i] > 0x39) - { - ret += (s[i] & ~0x20) - 0x37; - } - else - { - ret += (s[i] - 0x30); - } - if (i != (n - 1)) ret *= 16; - } - - return ret; -} - NandTitle::NandTitle() { currentIndex = 0; @@ -97,25 +76,21 @@ s32 NandTitle::Get() tmd* NandTitle::GetTMD(u64 tid) { - //gprintf("GetTMD( %016llx ): ", tid ); signed_blob *s_tmd = (signed_blob *) tmd_buf; u32 tmd_size; if (ES_GetStoredTMDSize(tid, &tmd_size) < 0) { - //gprintf("!size\n"); return NULL; } s32 ret = ES_GetStoredTMD(tid, s_tmd, tmd_size); if (ret < 0) { - //gprintf("!tmd - %04x\n", ret ); return NULL; } tmd *t = (tmd*) SIGNATURE_PAYLOAD(s_tmd); - //gprintf("ok\n"); return t; } @@ -420,20 +395,31 @@ s32 NandTitle::GetTicketViews(u64 tid, tikview **outbuf, u32 *outlen) return ret; } -int NandTitle::FindU64(const char *s) +u64 NandTitle::FindU64(const char *s) { - u64 tid = atoi_hex(s); - return IndexOf(tid); -} + u64 tid = strtoull(s, NULL, 16); -int NandTitle::FindU32(const char *s) -{ - u64 tid = atoi_hex(s); for (u32 i = 0; i < titleIds.size(); i++) { - if (TITLE_LOWER( titleIds.at( i ) ) == TITLE_LOWER( tid )) return i; + if(titleIds[i] == tid) + return titleIds[i]; } - return WII_EINSTALL; + + return 0; +} + +u64 NandTitle::FindU32(const char *s) +{ + u32 tid = (u32) strtoull(s, NULL, 16); + if(!tid) + return 0; + + for (u32 i = 0; i < titleIds.size(); i++) + { + if (TITLE_LOWER(titleIds[i]) == tid) + return titleIds[i]; + } + return 0; } int NandTitle::LoadFileFromNand(const char *filepath, u8 **outbuffer, u32 *outfilesize) diff --git a/source/wad/nandtitle.h b/source/wad/nandtitle.h index bb42a6db..3a9da6ec 100644 --- a/source/wad/nandtitle.h +++ b/source/wad/nandtitle.h @@ -88,15 +88,12 @@ class NandTitle bool Exists(u64 tid); bool ExistsFromIndex(u32 i); - int FindU64(const char *s); - int FindU32(const char *s); + u64 FindU64(const char *s); + u64 FindU32(const char *s); s32 GetTicketViews(u64 tid, tikview **outbuf, u32 *outlen); - u64 operator[](u32 i) - { - return At(i); - } + u64 operator[](u32 i) { return At(i); } static int LoadFileFromNand(const char *filepath, u8 **outbuffer, u32 *outfilesize); private: diff --git a/source/xml/WiiTDB.cpp b/source/xml/WiiTDB.cpp index a694359a..88c5913b 100644 --- a/source/xml/WiiTDB.cpp +++ b/source/xml/WiiTDB.cpp @@ -650,7 +650,7 @@ bool WiiTDB::GetGenreList(const char * id, vector & genre) ptr++; while(*ptr == ' ') ptr++; - while(genre[genre_num][genre[genre_num].size()-1] == ' ') + while(genre[genre_num].size() > 0 && genre[genre_num][genre[genre_num].size()-1] == ' ') genre[genre_num].erase(genre[genre_num].size()-1); genre_num++; @@ -665,6 +665,9 @@ bool WiiTDB::GetGenreList(const char * id, vector & genre) ++ptr; } + while(genre[genre_num].size() > 0 && genre[genre_num][genre[genre_num].size()-1] == ' ') + genre[genre_num].erase(genre[genre_num].size()-1); + delete [] data; return true;