diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 215903b919b52e41481696c6bece709702fe6ccc..ba36074a0597568d2f561a687c98ac384d3d91d6 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -120,6 +120,7 @@ as release notes for end user on a Recalbox upgrade. - Fix webmanager on Raspberry Pi 3 - Remove the keyboard layout option for pi5 as the option is not applied - Fix rg353m v2 support +- Fix go to game from search and gameclip ### Bumps - Bump retroarch to 1.19.1 diff --git a/projects/frontend/es-app/src/views/ViewController.cpp b/projects/frontend/es-app/src/views/ViewController.cpp index ab9fc43eb850791e1431faec5b6783a6f8344ac1..986289a5fcd44cb247aa43a972e6ba6ef5aa85a4 100755 --- a/projects/frontend/es-app/src/views/ViewController.cpp +++ b/projects/frontend/es-app/src/views/ViewController.cpp @@ -180,7 +180,15 @@ void ViewController::selectGamelistAndCursor(FileData *file) goToGameList(&system); ISimpleGameListView* view = GetOrCreateGamelistView(&system); view->Gamelist().RebuildFolderStack(file); - view->Gamelist().SetSelectedGame(file); + if (view->Gamelist().LookupGameIndex(file) == -1) + { + view->populateList(*file->Parent(), file); + } + else + { + view->Gamelist().SetSelectedGame(file); + } + } SystemData* ViewController::goToNextGameList() diff --git a/projects/frontend/es-app/src/views/container/TextGamelist.cpp b/projects/frontend/es-app/src/views/container/TextGamelist.cpp index 0ae99043433cc398d35a7a322b8885c72af27957..68f2a71398a0f754f3f85f302dc458b4c2546cdf 100644 --- a/projects/frontend/es-app/src/views/container/TextGamelist.cpp +++ b/projects/frontend/es-app/src/views/container/TextGamelist.cpp @@ -74,7 +74,7 @@ IGamelistContainer& TextGamelist::RebuildFolderStack(FileData* from) { FolderData* folder = from->Parent(); mFolderStack.Clear(); - while((folder != nullptr) && !folder->IsTopMostRoot()) + while((folder != nullptr) && !folder->IsRoot()) { mFolderStack.Push(folder); folder = folder->Parent(); diff --git a/projects/frontend/es-app/src/views/gamelist/ArcadeGameListView.cpp b/projects/frontend/es-app/src/views/gamelist/ArcadeGameListView.cpp index ed38eba3da3d76814f07f271d6cd57c8e11e5699..5e6f8a32b2b373e219deff29df626ae8351f88a4 100644 --- a/projects/frontend/es-app/src/views/gamelist/ArcadeGameListView.cpp +++ b/projects/frontend/es-app/src/views/gamelist/ArcadeGameListView.cpp @@ -12,7 +12,7 @@ ArcadeGameListView::ArcadeGameListView(WindowManager& window, SystemManager& sys { } -void ArcadeGameListView::populateList(const FolderData& folder) +void ArcadeGameListView::populateList(const FolderData& folder, FileData* target = nullptr) { mPopulatedFolder = &folder; @@ -33,7 +33,7 @@ void ArcadeGameListView::populateList(const FolderData& folder) if (!Gamelist().IsInRootFolder()) { FolderData* current = Gamelist().GetCurrentFolder(); - populateList(*Gamelist().ExitFolder()); + populateList(*Gamelist().ExitFolder(), target); Gamelist().SetSelectedGame(current); return; } @@ -57,7 +57,7 @@ void ArcadeGameListView::BuildList() // Empty gamelist might be caused by the lack of database, so fallback to normal view if (mGameList.empty()) { - DetailedGameListView::populateList(*mPopulatedFolder); + DetailedGameListView::populateList(*mPopulatedFolder, nullptr); return; } diff --git a/projects/frontend/es-app/src/views/gamelist/ArcadeGameListView.h b/projects/frontend/es-app/src/views/gamelist/ArcadeGameListView.h index 476b6baa168ef3e293ada94e40731ca85d9c05c4..30bec6d94069fe53d0829d3b2ec8d39b33844cae 100644 --- a/projects/frontend/es-app/src/views/gamelist/ArcadeGameListView.h +++ b/projects/frontend/es-app/src/views/gamelist/ArcadeGameListView.h @@ -108,8 +108,9 @@ class ArcadeGameListView : public DetailedGameListView /*! * @brief Rebuild the gamelist - regenerate internal structure * @param folder + * @param target */ - void populateList(const FolderData& folder) final; + void populateList(const FolderData& folder, FileData* target) final; /*! * @brief Rebuild the gamelist using internal structures diff --git a/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp b/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp index 05a65a015a3f8f89286d07e61918d59ae86bef32..39e520a77d763f2a5bd1bffbb352763fe4028187 100755 --- a/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp +++ b/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp @@ -736,7 +736,7 @@ String DetailedGameListView::GetRawDisplayName(const FileData& game) return mConf.GetDisplayByFileName() ? game.Metadata().RomFileOnly().FilenameWithoutExtension() : game.Name(); } -void DetailedGameListView::populateList(const FolderData& folder) +void DetailedGameListView::populateList(const FolderData& folder, FileData* target) { mPopulatedFolder = &folder; Gamelist().ClearGames(); @@ -759,7 +759,7 @@ void DetailedGameListView::populateList(const FolderData& folder) if (!Gamelist().IsInRootFolder()) { FolderData* current = Gamelist().GetCurrentFolder(); - populateList(*Gamelist().ExitFolder()); + populateList(*Gamelist().ExitFolder(), target); Gamelist().SetSelectedGame(current); return; } @@ -787,11 +787,17 @@ void DetailedGameListView::populateList(const FolderData& folder) if (isOneGameOneRomMode) GeneratePreferredOneGameOneRoms(mGamelist); - BuildList(nullptr); + BuildList(target); } void DetailedGameListView::BuildList(FileData* target) { + bool isOneGameOneRomMode = !IsFavoriteSystem() && RecalboxConf::Instance().GetOneGameOneRom(); + if (isOneGameOneRomMode && target != nullptr) + { + mLastCursorItem = target; + } + // Reorder favorites bool hasTopFavorites = false; if (!IsFavoriteSystem() && RecalboxConf::Instance().GetFavoritesFirst()) @@ -838,7 +844,6 @@ void DetailedGameListView::BuildList(FileData* target) Gamelist().ClearGames(mGamelist.Count()); FileData* previous = nullptr; HeaderData* lastHeader = nullptr; - bool isOneGameOneRomMode = !IsFavoriteSystem() && RecalboxConf::Instance().GetOneGameOneRom(); for (FileData* item : mGamelist) { String name = item->Name(); @@ -865,6 +870,11 @@ void DetailedGameListView::BuildList(FileData* target) if (isOneGameOneRomMode && (oGoR = m1G1R.try_get(item)) != nullptr) { OneGameOneRom& hierarchy = **oGoR; + + // usefull for go to game from search or gameclip + if (mLastCursorItem != nullptr && hierarchy.mChildren.Contains(mLastCursorItem)) + hierarchy.mFolded = false; + Gamelist().AddGames(item, GetRawDisplayName(*item), hierarchy.mFolded ? GameType::ParentGameFolded : GameType::ParentGameUnfolded, colorIndexOffset + (item->IsFolder() ? FolderColor : GameColor)); @@ -1235,7 +1245,7 @@ void DetailedGameListView::ChangeSort(bool next) // Refresh FileData* item = Gamelist().GetSelectedGame(); - populateList(*mPopulatedFolder); + populateList(*mPopulatedFolder, nullptr); Gamelist().SetSelectedGame(item); // Notify @@ -1267,7 +1277,7 @@ void DetailedGameListView::ReturnedFromGame(FileData* game) { // Refresh to reflect time played/last played FileData* item = Gamelist().GetSelectedGame(); - populateList(*mPopulatedFolder); + populateList(*mPopulatedFolder, nullptr); Gamelist().SetSelectedGame(item); break; } diff --git a/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.h b/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.h index 6681814deb7226c2b4ae88e607706f49f70b0fcb..558401bc08b286232a60d011327c10826ffc55e1 100644 --- a/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.h +++ b/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.h @@ -90,8 +90,9 @@ class DetailedGameListView : public ISimpleGameListView /*! * @brief Rebuild the current gamelist according to the give folder * @param folder Game folder + * @param target */ - void populateList(const FolderData& folder) override; + void populateList(const FolderData& folder, FileData* target) override; /*! * @brief Refresh the UI list w/ what have been built in populateList @@ -105,7 +106,7 @@ class DetailedGameListView : public ISimpleGameListView FileData* currentItem = Gamelist().GetSelectedGame(); int index = Gamelist().GetSelectedGameIndex(); // Refresh list - populateList(*mPopulatedFolder); + populateList(*mPopulatedFolder, nullptr); // Try to set the old data. If it does not exist anymore, ajust index if (!Gamelist().SetSelectedGame(currentItem)) diff --git a/projects/frontend/es-app/src/views/gamelist/ISimpleGameListView.cpp b/projects/frontend/es-app/src/views/gamelist/ISimpleGameListView.cpp index 50a7f48da8bfb499db7585e7e4a229f74c96576a..2d15336553ff10cdfda17ac3ca501440b70c756b 100755 --- a/projects/frontend/es-app/src/views/gamelist/ISimpleGameListView.cpp +++ b/projects/frontend/es-app/src/views/gamelist/ISimpleGameListView.cpp @@ -94,7 +94,7 @@ bool ISimpleGameListView::ProcessInput(const InputCompactEvent& event) // Back to parent folder FolderData* current = Gamelist().GetCurrentFolder(); mLastPositionInFolder[current] = cursor; - populateList(*Gamelist().ExitFolder()); + populateList(*Gamelist().ExitFolder(), nullptr); Gamelist().SetSelectedGame(current); } else if (!hideSystemView) @@ -273,7 +273,7 @@ void ISimpleGameListView::OnFolderValidated(IGamelistContainer& caller, FolderDa if (folder->HasChildren()) { Gamelist().EnterFolder(folder); - populateList(*folder); + populateList(*folder, nullptr); FileData** lastPosition = mLastPositionInFolder.try_get(folder); if (lastPosition != nullptr) Gamelist().SetSelectedGame(*lastPosition); else Gamelist().SetSelectedGameIndex(0); diff --git a/projects/frontend/es-app/src/views/gamelist/ISimpleGameListView.h b/projects/frontend/es-app/src/views/gamelist/ISimpleGameListView.h index 6a5c65f6d240793459ef25bda485773c9c662557..ddd0a42f124a6c37cd22f6435826006ec3f44660 100644 --- a/projects/frontend/es-app/src/views/gamelist/ISimpleGameListView.h +++ b/projects/frontend/es-app/src/views/gamelist/ISimpleGameListView.h @@ -84,7 +84,7 @@ class ISimpleGameListView : public Gui virtual void DoUpdateGameInformation(bool update) = 0; - virtual void populateList(const FolderData& folder) = 0; + virtual void populateList(const FolderData& folder, FileData* target) = 0; virtual void refreshList() = 0; @@ -108,7 +108,7 @@ class ISimpleGameListView : public Gui { Initialize(); SwitchToTheme(mSystem.Theme(), false, nullptr); - populateList(mSystem.MasterRoot()); + populateList(mSystem.MasterRoot(), nullptr); } /*!