yuzu: Fixes to game list sorting

Should fix citra-emu/citra#4593.
As the issue might not be entirely clear, I'll offer a short explanation from what I understood from it and found from experimentation.

Currently yuzu offers the user the option to change the text that's displayed in the "Name" column in the game list. Generally, it is expected that the items are sorted based on the displayed text, but yuzu would sort them by title instead.

Made it so that an access to SortRole returns the same as DisplayRole.
There shouldn't be any UI changes, only change in behaviour.

Also fixes a bug with directory sorting, where having the directories out of order would enable you to try to "move up" to the addDirectory button, which would crash the emulator.

Co-Authored-By: Vitor K <vitor-k@users.noreply.github.com>
This commit is contained in:
FearlessTobi 2020-04-06 03:12:17 +02:00
parent 69277de29d
commit 8d0fb33ac4
2 changed files with 22 additions and 8 deletions

View file

@ -315,7 +315,7 @@ GameList::GameList(FileSys::VirtualFilesystem vfs, FileSys::ManualContentProvide
item_model->setHeaderData(COLUMN_FILE_TYPE - 1, Qt::Horizontal, tr("File type")); item_model->setHeaderData(COLUMN_FILE_TYPE - 1, Qt::Horizontal, tr("File type"));
item_model->setHeaderData(COLUMN_SIZE - 1, Qt::Horizontal, tr("Size")); item_model->setHeaderData(COLUMN_SIZE - 1, Qt::Horizontal, tr("Size"));
} }
item_model->setSortRole(GameListItemPath::TitleRole); item_model->setSortRole(GameListItemPath::SortRole);
connect(main_window, &GMainWindow::UpdateThemedIcons, this, &GameList::onUpdateThemedIcons); connect(main_window, &GMainWindow::UpdateThemedIcons, this, &GameList::onUpdateThemedIcons);
connect(tree_view, &QTreeView::activated, this, &GameList::ValidateEntry); connect(tree_view, &QTreeView::activated, this, &GameList::ValidateEntry);
@ -441,6 +441,8 @@ void GameList::DonePopulating(QStringList watch_list) {
if (children_total > 0) { if (children_total > 0) {
search_field->setFocus(); search_field->setFocus();
} }
item_model->sort(tree_view->header()->sortIndicatorSection(),
tree_view->header()->sortIndicatorOrder());
} }
void GameList::PopupContextMenu(const QPoint& menu_location) { void GameList::PopupContextMenu(const QPoint& menu_location) {
@ -666,8 +668,6 @@ void GameList::LoadInterfaceLayout() {
// so make it as large as possible as default. // so make it as large as possible as default.
header->resizeSection(COLUMN_NAME, header->width()); header->resizeSection(COLUMN_NAME, header->width());
} }
item_model->sort(header->sortIndicatorSection(), header->sortIndicatorOrder());
} }
const QStringList GameList::supported_file_extensions = { const QStringList GameList::supported_file_extensions = {

View file

@ -65,10 +65,10 @@ public:
*/ */
class GameListItemPath : public GameListItem { class GameListItemPath : public GameListItem {
public: public:
static const int TitleRole = SortRole; static const int TitleRole = SortRole + 1;
static const int FullPathRole = SortRole + 1; static const int FullPathRole = SortRole + 2;
static const int ProgramIdRole = SortRole + 2; static const int ProgramIdRole = SortRole + 3;
static const int FileTypeRole = SortRole + 3; static const int FileTypeRole = SortRole + 4;
GameListItemPath() = default; GameListItemPath() = default;
GameListItemPath(const QString& game_path, const std::vector<u8>& picture_data, GameListItemPath(const QString& game_path, const std::vector<u8>& picture_data,
@ -95,7 +95,7 @@ public:
} }
QVariant data(int role) const override { QVariant data(int role) const override {
if (role == Qt::DisplayRole) { if (role == Qt::DisplayRole || role == SortRole) {
std::string filename; std::string filename;
Common::SplitPath(data(FullPathRole).toString().toStdString(), nullptr, &filename, Common::SplitPath(data(FullPathRole).toString().toStdString(), nullptr, &filename,
nullptr); nullptr);
@ -110,6 +110,9 @@ public:
const auto& row1 = row_data.at(UISettings::values.row_1_text_id); const auto& row1 = row_data.at(UISettings::values.row_1_text_id);
const int row2_id = UISettings::values.row_2_text_id; const int row2_id = UISettings::values.row_2_text_id;
if (role == SortRole)
return row1.toLower();
if (row2_id == 4) // None if (row2_id == 4) // None
return row1; return row1;
@ -123,6 +126,13 @@ public:
return GameListItem::data(role); return GameListItem::data(role);
} }
/**
* Override to prevent automatic sorting.
*/
bool operator<(const QStandardItem& other) const override {
return false;
}
}; };
class GameListItemCompat : public GameListItem { class GameListItemCompat : public GameListItem {
@ -289,6 +299,10 @@ public:
int type() const override { int type() const override {
return static_cast<int>(GameListItemType::AddDir); return static_cast<int>(GameListItemType::AddDir);
} }
bool operator<(const QStandardItem& other) const override {
return false;
}
}; };
class GameList; class GameList;