From d4e614c0c1268b7090adf993f80f06e2fd096dc9 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Sun, 20 Sep 2020 12:17:38 +0200 Subject: [PATCH] Added jump to folder to the quick selector and improved the folder sorting. --- es-app/src/FileData.cpp | 31 +++++++++++++++---- es-app/src/FileData.h | 5 ++- es-app/src/guis/GuiGamelistOptions.cpp | 20 ++++++------ es-app/src/guis/GuiGamelistOptions.h | 3 +- .../src/views/gamelist/BasicGameListView.cpp | 7 +++-- es-app/src/views/gamelist/BasicGameListView.h | 4 +-- 6 files changed, 47 insertions(+), 23 deletions(-) diff --git a/es-app/src/FileData.cpp b/es-app/src/FileData.cpp index fe90306c8..e7ed790ea 100644 --- a/es-app/src/FileData.cpp +++ b/es-app/src/FileData.cpp @@ -430,6 +430,7 @@ void FileData::sort(ComparisonFunction& comparator, bool ascending) mFirstLetterIndex.clear(); mOnlyFolders = true; bool foldersOnTop = Settings::getInstance()->getBool("FoldersOnTop"); + bool hasFolders = false; std::vector mChildrenFolders; std::vector mChildrenOthers; @@ -452,17 +453,23 @@ void FileData::sort(ComparisonFunction& comparator, bool ascending) if (foldersOnTop) { for (unsigned int i = 0; i < mChildren.size(); i++) { - if (mChildren[i]->getType() == FOLDER) + if (mChildren[i]->getType() == FOLDER) { mChildrenFolders.push_back(mChildren[i]); - else + hasFolders = true; + } + else { mChildrenOthers.push_back(mChildren[i]); + mOnlyFolders = false; + } } - std::stable_sort(mChildrenFolders.begin(), mChildrenFolders.end(), comparator); + if (foldersOnTop && mOnlyFolders) + std::stable_sort(mChildrenFolders.begin(), mChildrenFolders.end(), comparator); std::stable_sort(mChildrenOthers.begin(), mChildrenOthers.end(), comparator); if (!ascending) { - std::reverse(mChildrenFolders.begin(), mChildrenFolders.end()); + if (foldersOnTop && mOnlyFolders) + std::reverse(mChildrenFolders.begin(), mChildrenFolders.end()); std::reverse(mChildrenOthers.begin(), mChildrenOthers.end()); } @@ -505,6 +512,10 @@ void FileData::sort(ComparisonFunction& comparator, bool ascending) std::sort(mFirstLetterIndex.begin(), mFirstLetterIndex.end()); auto last = std::unique(mFirstLetterIndex.begin(), mFirstLetterIndex.end()); mFirstLetterIndex.erase(last, mFirstLetterIndex.end()); + + // If it's a mixed list and folders are sorted on top, add a folder icon to the index. + if (foldersOnTop && hasFolders && !mOnlyFolders) + mFirstLetterIndex.insert(mFirstLetterIndex.begin(), FOLDER_CHAR); } void FileData::sortFavoritesOnTop(ComparisonFunction& comparator, bool ascending) @@ -516,6 +527,7 @@ void FileData::sortFavoritesOnTop(ComparisonFunction& comparator, bool ascending std::vector mChildrenOthers; bool showHiddenGames = Settings::getInstance()->getBool("ShowHiddenGames"); bool foldersOnTop = Settings::getInstance()->getBool("FoldersOnTop"); + bool hasFolders = false; for (unsigned int i = 0; i < mChildren.size(); i++) { // Exclude game if it's marked as hidden and the hide setting has been set. @@ -527,6 +539,7 @@ void FileData::sortFavoritesOnTop(ComparisonFunction& comparator, bool ascending if (foldersOnTop && mChildren[i]->getType() == FOLDER) { mChildrenFolders.push_back(mChildren[i]); + hasFolders = true; } else if (mChildren[i]->getFavorite()) { mChildrenFavorites.push_back(mChildren[i]); @@ -576,8 +589,13 @@ void FileData::sortFavoritesOnTop(ComparisonFunction& comparator, bool ascending if (mChildrenOthers.size() > 0 && mChildrenFavorites.size() > 0) mFirstLetterIndex.insert(mFirstLetterIndex.begin(), FAVORITE_CHAR); + // If it's a mixed list and folders are sorted on top, add a folder icon to the index. + if (foldersOnTop && hasFolders && !mOnlyFolders) + mFirstLetterIndex.insert(mFirstLetterIndex.begin(), FOLDER_CHAR); + // Sort favorite games and the other games separately. - std::stable_sort(mChildrenFolders.begin(), mChildrenFolders.end(), comparator); + if (foldersOnTop && mOnlyFolders) + std::stable_sort(mChildrenFolders.begin(), mChildrenFolders.end(), comparator); std::stable_sort(mChildrenFavorites.begin(), mChildrenFavorites.end(), comparator); std::stable_sort(mChildrenOthers.begin(), mChildrenOthers.end(), comparator); @@ -600,7 +618,8 @@ void FileData::sortFavoritesOnTop(ComparisonFunction& comparator, bool ascending } if (!ascending) { - std::reverse(mChildrenFolders.begin(), mChildrenFolders.end()); + if (foldersOnTop && mOnlyFolders) + std::reverse(mChildrenFolders.begin(), mChildrenFolders.end()); std::reverse(mChildrenFavorites.begin(), mChildrenFavorites.end()); std::reverse(mChildrenOthers.begin(), mChildrenOthers.end()); } diff --git a/es-app/src/FileData.h b/es-app/src/FileData.h index 84ded8fe1..f2aecfe32 100644 --- a/es-app/src/FileData.h +++ b/es-app/src/FileData.h @@ -132,6 +132,9 @@ public: // Return sort type based on a string description. FileData::SortType getSortTypeFromString(std::string desc); + const std::string FAVORITE_CHAR = "\uF005"; + const std::string FOLDER_CHAR = "\uF07C"; + protected: FileData* mSourceFileData; FileData* mParent; @@ -150,7 +153,7 @@ private: bool mOnlyFolders; // Used for flagging a game for deletion from its gamelist.xml file. bool mDeletionFlag; - const std::string FAVORITE_CHAR = "\uF005"; + }; class CollectionFileData : public FileData diff --git a/es-app/src/guis/GuiGamelistOptions.cpp b/es-app/src/guis/GuiGamelistOptions.cpp index 7a6b887a1..58b992e01 100644 --- a/es-app/src/guis/GuiGamelistOptions.cpp +++ b/es-app/src/guis/GuiGamelistOptions.cpp @@ -38,6 +38,8 @@ GuiGamelistOptions::GuiGamelistOptions( // Check that it's not a placeholder folder - if it is, only show "Filter Options". FileData* file = getGamelist()->getCursor(); + FAVORITE_CHAR = file->FAVORITE_CHAR; + FOLDER_CHAR = file->FOLDER_CHAR; fromPlaceholder = file->isPlaceHolder(); ComponentListRow row; @@ -64,17 +66,14 @@ GuiGamelistOptions::GuiGamelistOptions( // Don't include the folder name starting characters if folders are sorted on top // unless the list only contains folders. if (!mOnlyHasFolders && mFoldersOnTop && file->getType() == FOLDER) { - mCurrentFirstCharacter = mFirstLetterIndex.front(); + mCurrentFirstCharacter = FOLDER_CHAR; } else { - // Set the quick selector to the first character of the selected game. if (mFavoritesSorting && file->getFavorite() && - mFirstLetterIndex.front() == FAVORITE_CHAR) { + mFirstLetterIndex.front() == FAVORITE_CHAR) mCurrentFirstCharacter = FAVORITE_CHAR; - } - else { + else mCurrentFirstCharacter = toupper(file->getSortName().front()); - } } mJumpToLetterList = std::make_shared(mWindow, getHelpStyle(), @@ -201,10 +200,9 @@ GuiGamelistOptions::~GuiGamelistOptions() } // Has the user changed the letter using the quick selector? - if ((mFoldersOnTop && !mOnlyHasFolders && - getGamelist()->getCursor()->getType() == FOLDER) || - mCurrentFirstCharacter != mJumpToLetterList->getSelected()) { - if (mJumpToLetterList->getSelected() == FAVORITE_CHAR) + if (mCurrentFirstCharacter != mJumpToLetterList->getSelected()) { + if (mJumpToLetterList->getSelected() == FAVORITE_CHAR || + mJumpToLetterList->getSelected() == FOLDER_CHAR) jumpToFirstRow(); else jumpToLetter(); @@ -359,7 +357,7 @@ void GuiGamelistOptions::jumpToLetter() void GuiGamelistOptions::jumpToFirstRow() { - if (mFoldersOnTop) { + if (mFoldersOnTop && mJumpToLetterList->getSelected() == FAVORITE_CHAR) { // Get the gamelist. const std::vector& files = getGamelist()->getCursor()-> getParent()->getChildrenListToDisplay(); diff --git a/es-app/src/guis/GuiGamelistOptions.h b/es-app/src/guis/GuiGamelistOptions.h index 5f38c0d78..f9ed7d5ed 100644 --- a/es-app/src/guis/GuiGamelistOptions.h +++ b/es-app/src/guis/GuiGamelistOptions.h @@ -59,7 +59,8 @@ private: bool mCancelled; std::vector mFirstLetterIndex; std::string mCurrentFirstCharacter; - const std::string FAVORITE_CHAR = "\uF005"; + std::string FAVORITE_CHAR; + std::string FOLDER_CHAR; }; diff --git a/es-app/src/views/gamelist/BasicGameListView.cpp b/es-app/src/views/gamelist/BasicGameListView.cpp index 413868626..ec2fa6e32 100644 --- a/es-app/src/views/gamelist/BasicGameListView.cpp +++ b/es-app/src/views/gamelist/BasicGameListView.cpp @@ -18,6 +18,9 @@ BasicGameListView::BasicGameListView(Window* window, FileData* root) : ISimpleGameListView(window, root), mList(window) { + FAVORITE_CHAR = root->FAVORITE_CHAR; + FOLDER_CHAR = root->FOLDER_CHAR; + mList.setSize(mSize.x(), mSize.y() * 0.8f); mList.setPosition(0, mSize.y() * 0.2f); mList.setDefaultZIndex(20); @@ -59,12 +62,12 @@ void BasicGameListView::populateList(const std::vector& files) if ((*it)->getFavorite() && mRoot->getSystem()->getName() != "favorites") { - mList.add(FAVORITE_GAME_CHAR + " " + (*it)->getName(), + mList.add(FAVORITE_CHAR + " " + (*it)->getName(), *it, ((*it)->getType() == FOLDER)); } else if ((*it)->getType() == FOLDER && mRoot->getSystem()->getName() != "collections") { - mList.add(FAVORITE_FOLDER_CHAR + " " + (*it)->getName(), *it, true); + mList.add(FOLDER_CHAR + " " + (*it)->getName(), *it, true); } else { mList.add((*it)->getName(), *it, ((*it)->getType() == FOLDER)); diff --git a/es-app/src/views/gamelist/BasicGameListView.h b/es-app/src/views/gamelist/BasicGameListView.h index 55477753f..8e6eefff7 100644 --- a/es-app/src/views/gamelist/BasicGameListView.h +++ b/es-app/src/views/gamelist/BasicGameListView.h @@ -50,8 +50,8 @@ protected: // Points to the first game in the list, i.e. the first entry which is of the type 'GAME'. FileData* firstGameEntry; - const std::string FAVORITE_GAME_CHAR = "\uF005"; - const std::string FAVORITE_FOLDER_CHAR = "\uF07C"; + std::string FAVORITE_CHAR; + std::string FOLDER_CHAR; }; #endif // ES_APP_VIEWS_GAME_LIST_BASIC_GAME_LIST_VIEW_H