Fixed multiple issues where gamelist filtering didn't work correctly when applied to folders.

This commit is contained in:
Leon Styhre 2023-01-24 18:23:35 +01:00
parent 65dd65029b
commit bc4c9120d6
2 changed files with 23 additions and 11 deletions

View file

@ -67,6 +67,7 @@ public:
return mChildrenByFilename; return mChildrenByFilename;
} }
const std::vector<FileData*>& getChildren() const { return mChildren; } const std::vector<FileData*>& getChildren() const { return mChildren; }
const std::vector<FileData*>& getFilteredChildren() const { return mFilteredChildren; }
SystemData* getSystem() const { return mSystem; } SystemData* getSystem() const { return mSystem; }
SystemEnvironmentData* getSystemEnvData() const { return mEnvData; } SystemEnvironmentData* getSystemEnvData() const { return mEnvData; }

View file

@ -76,7 +76,7 @@ GuiGamelistOptions::GuiGamelistOptions(SystemData* system)
// Jump to letter quick selector. // Jump to letter quick selector.
row.elements.clear(); row.elements.clear();
// The letter index is generated in FileData during gamelist sorting. // The letter index is generated in GamelistBase when populating the system.
mFirstLetterIndex = getGamelist()->getFirstLetterIndex(); mFirstLetterIndex = getGamelist()->getFirstLetterIndex();
// Don't include the folder name starting characters if folders are sorted on top // Don't include the folder name starting characters if folders are sorted on top
@ -109,9 +109,9 @@ GuiGamelistOptions::GuiGamelistOptions(SystemData* system)
mJumpToLetterList->setKeyRepeat(true, 650, 200); mJumpToLetterList->setKeyRepeat(true, 650, 200);
// Populate the quick selector. // Populate the quick selector.
for (unsigned int i = 0; i < mFirstLetterIndex.size(); ++i) { for (unsigned int i {0}; i < mFirstLetterIndex.size(); ++i) {
mJumpToLetterList->add(mFirstLetterIndex[i], mFirstLetterIndex[i], 0); mJumpToLetterList->add(mFirstLetterIndex[i], mFirstLetterIndex[i], 0);
if (mFirstLetterIndex[i] == mCurrentFirstCharacter) if (mFirstLetterIndex[i] == mCurrentFirstCharacter || mFirstLetterIndex.size() == 1)
mJumpToLetterList->selectEntry(i); mJumpToLetterList->selectEntry(i);
} }
@ -122,19 +122,19 @@ GuiGamelistOptions::GuiGamelistOptions(SystemData* system)
if (!mIsCustomCollectionGroup) { if (!mIsCustomCollectionGroup) {
// Sort list by selected sort type (persistent throughout the program session). // Sort list by selected sort type (persistent throughout the program session).
mListSort = std::make_shared<SortList>(getHelpStyle(), "SORT GAMES BY", false); mListSort = std::make_shared<SortList>(getHelpStyle(), "SORT GAMES BY", false);
FileData* root; FileData* root {nullptr};
if (mIsCustomCollection) if (mIsCustomCollection)
root = getGamelist()->getCursor()->getSystem()->getRootFolder(); root = getGamelist()->getCursor()->getSystem()->getRootFolder();
else else
root = mSystem->getRootFolder(); root = mSystem->getRootFolder();
std::string sortType {root->getSortTypeString()}; std::string sortType {root->getSortTypeString()};
unsigned int numSortTypes = static_cast<unsigned int>(FileSorts::SortTypes.size()); unsigned int numSortTypes {static_cast<unsigned int>(FileSorts::SortTypes.size())};
// If it's not a collection, then hide the System sort options. // If it's not a collection, then hide the System sort options.
if (!root->getSystem()->isCollection()) if (!root->getSystem()->isCollection())
numSortTypes -= 2; numSortTypes -= 2;
for (unsigned int i = 0; i < numSortTypes; ++i) { for (unsigned int i {0}; i < numSortTypes; ++i) {
const FileData::SortType& sort {FileSorts::SortTypes.at(i)}; const FileData::SortType& sort {FileSorts::SortTypes.at(i)};
if (sort.description == sortType) if (sort.description == sortType)
mListSort->add(sort.description, &sort, true); mListSort->add(sort.description, &sort, true);
@ -293,7 +293,7 @@ GuiGamelistOptions::~GuiGamelistOptions()
return; return;
if (!mFromPlaceholder) { if (!mFromPlaceholder) {
FileData* root; FileData* root {nullptr};
if (mIsCustomCollection) if (mIsCustomCollection)
root = getGamelist()->getCursor()->getSystem()->getRootFolder(); root = getGamelist()->getCursor()->getSystem()->getRootFolder();
@ -316,11 +316,22 @@ GuiGamelistOptions::~GuiGamelistOptions()
if (mJumpToLetterList->getSelected() == ViewController::FAVORITE_CHAR || if (mJumpToLetterList->getSelected() == ViewController::FAVORITE_CHAR ||
mJumpToLetterList->getSelected() == ViewController::FOLDER_CHAR) mJumpToLetterList->getSelected() == ViewController::FOLDER_CHAR)
jumpToFirstRow(); jumpToFirstRow();
else else if (getGamelist()->getCursor()->getType() != PLACEHOLDER)
jumpToLetter(); jumpToLetter();
} }
} }
// If inside a folder and all its content has been filtered out, then jump to the first entry.
if (getGamelist()->getCursor()->getType() == PLACEHOLDER &&
mSystem->getThemeFolder() != "custom-collections") {
auto children = mSystem->getRootFolder()->getChildren();
auto filteredChildren = mSystem->getRootFolder()->getFilteredChildren();
if (filteredChildren.size() > 0)
getGamelist()->setCursor(filteredChildren.front());
else if (children.size() > 0)
getGamelist()->setCursor(children.front());
}
if (mSystem->getRootFolder()->getChildren().size() != 0 && mSystem->getName() != "recent" && if (mSystem->getRootFolder()->getChildren().size() != 0 && mSystem->getName() != "recent" &&
!mFolderLinkOverride) !mFolderLinkOverride)
NavigationSounds::getInstance().playThemeNavigationSound(SCROLLSOUND); NavigationSounds::getInstance().playThemeNavigationSound(SCROLLSOUND);
@ -328,7 +339,7 @@ GuiGamelistOptions::~GuiGamelistOptions()
void GuiGamelistOptions::openGamelistFilter() void GuiGamelistOptions::openGamelistFilter()
{ {
GuiGamelistFilter* ggf; GuiGamelistFilter* ggf {nullptr};
auto filtersChangedFunc = [this](bool filtersChanged) { auto filtersChangedFunc = [this](bool filtersChanged) {
if (!mFiltersChanged) if (!mFiltersChanged)
@ -426,7 +437,7 @@ void GuiGamelistOptions::openMetaDataEd()
ViewController::getInstance()->getGamelistView(file->getSystem()).get()->removeMedia(file); ViewController::getInstance()->getGamelistView(file->getSystem()).get()->removeMedia(file);
// Manually reset all the metadata values, set the name to the actual file/folder name. // Manually reset all the metadata values, set the name to the actual file/folder name.
const std::vector<MetaDataDecl>& mdd = file->metadata.getMDD(); const std::vector<MetaDataDecl>& mdd {file->metadata.getMDD()};
for (auto it = mdd.cbegin(); it != mdd.cend(); ++it) { for (auto it = mdd.cbegin(); it != mdd.cend(); ++it) {
if (it->key == "name") { if (it->key == "name") {
if (file->isArcadeGame()) { if (file->isArcadeGame()) {
@ -504,7 +515,7 @@ void GuiGamelistOptions::jumpToLetter()
const std::vector<FileData*>& files { const std::vector<FileData*>& files {
getGamelist()->getCursor()->getParent()->getChildrenListToDisplay()}; getGamelist()->getCursor()->getParent()->getChildrenListToDisplay()};
for (unsigned int i = 0; i < files.size(); ++i) { for (unsigned int i {0}; i < files.size(); ++i) {
if (mFavoritesSorting && (mFirstLetterIndex.front() == ViewController::FAVORITE_CHAR || if (mFavoritesSorting && (mFirstLetterIndex.front() == ViewController::FAVORITE_CHAR ||
mFirstLetterIndex.front() == ViewController::FOLDER_CHAR)) { mFirstLetterIndex.front() == ViewController::FOLDER_CHAR)) {
if (Utils::String::getFirstCharacter(files.at(i)->getSortName()) == letter && if (Utils::String::getFirstCharacter(files.at(i)->getSortName()) == letter &&