Skip to content

Commit f3fe6f3

Browse files
GameList: Allow sorting by more columns (#1571)
1 parent 2eec6b4 commit f3fe6f3

File tree

4 files changed

+84
-18
lines changed

4 files changed

+84
-18
lines changed

src/Cafe/IOSU/PDM/iosu_pdm.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,5 +464,34 @@ namespace iosu
464464
return static_cast<IOSUModule*>(&sIOSUModuleNNPDM);
465465
}
466466

467+
468+
bool GameListStat::LastPlayDate::operator<(const LastPlayDate& b) const
469+
{
470+
const auto& a = *this;
471+
472+
if(a.year < b.year)
473+
return true;
474+
if(a.year > b.year)
475+
return false;
476+
477+
// same year
478+
if(a.month < b.month)
479+
return true;
480+
if(a.month > b.month)
481+
return false;
482+
483+
// same year and month
484+
return a.day < b.day;
485+
}
486+
487+
bool GameListStat::LastPlayDate::operator==(const LastPlayDate& b) const
488+
{
489+
const auto& a = *this;
490+
return a.year == b.year &&
491+
a.month == b.month &&
492+
a.day == b.day;
493+
}
494+
std::weak_ordering GameListStat::LastPlayDate::operator<=>(const LastPlayDate& b) const = default;
495+
467496
};
468497
};

src/Cafe/IOSU/PDM/iosu_pdm.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@ namespace iosu
2121
/* Helper for UI game list */
2222
struct GameListStat
2323
{
24-
struct
24+
struct LastPlayDate
2525
{
2626
uint32 year; // if 0 -> never played
2727
uint32 month;
2828
uint32 day;
29+
30+
bool operator<(const LastPlayDate& b) const;
31+
bool operator==(const LastPlayDate& b) const;
32+
std::weak_ordering operator<=>(const LastPlayDate& b) const;
2933
}last_played;
3034
uint32 numMinutesPlayed;
3135
};

src/gui/components/wxGameList.cpp

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -485,25 +485,57 @@ static inline int order_to_int(const std::weak_ordering &wo)
485485
return 0;
486486
}
487487

488-
int wxGameList::SortComparator(uint64 titleId1, uint64 titleId2, SortData* sortData)
488+
std::weak_ordering wxGameList::SortComparator(uint64 titleId1, uint64 titleId2, SortData* sortData)
489489
{
490-
const auto isFavoriteA = GetConfig().IsGameListFavorite(titleId1);
491-
const auto isFavoriteB = GetConfig().IsGameListFavorite(titleId2);
492-
const auto& name1 = GetNameByTitleId(titleId1);
493-
const auto& name2 = GetNameByTitleId(titleId2);
490+
auto titleLastPlayed = [](uint64_t id)
491+
{
492+
iosu::pdm::GameListStat playTimeStat{};
493+
iosu::pdm::GetStatForGamelist(id, playTimeStat);
494+
return playTimeStat;
495+
};
494496

495-
if(sortData->dir > 0)
496-
return order_to_int(std::tie(isFavoriteB, name1) <=> std::tie(isFavoriteA, name2));
497-
else
498-
return order_to_int(std::tie(isFavoriteB, name2) <=> std::tie(isFavoriteA, name1));
497+
auto titlePlayMinutes = [](uint64_t id)
498+
{
499+
iosu::pdm::GameListStat playTimeStat;
500+
if (!iosu::pdm::GetStatForGamelist(id, playTimeStat))
501+
return 0u;
502+
return playTimeStat.numMinutesPlayed;
503+
};
504+
505+
auto titleRegion = [](uint64_t id)
506+
{
507+
return CafeTitleList::GetGameInfo(id).GetRegion();
508+
};
509+
510+
switch(sortData->column)
511+
{
512+
default:
513+
case ColumnName:
514+
{
515+
const auto isFavoriteA = GetConfig().IsGameListFavorite(titleId1);
516+
const auto isFavoriteB = GetConfig().IsGameListFavorite(titleId2);
517+
const auto nameA = GetNameByTitleId(titleId1);
518+
const auto nameB = GetNameByTitleId(titleId2);
519+
return std::tie(isFavoriteB, nameA) <=> std::tie(isFavoriteA, nameB);
520+
}
521+
case ColumnGameStarted:
522+
return titleLastPlayed(titleId1).last_played <=> titleLastPlayed(titleId2).last_played;
523+
case ColumnGameTime:
524+
return titlePlayMinutes(titleId1) <=> titlePlayMinutes(titleId2);
525+
case ColumnRegion:
526+
return titleRegion(titleId1) <=> titleRegion(titleId2);
527+
case ColumnTitleID:
528+
return titleId1 <=> titleId2;
529+
}
530+
// unreachable
531+
cemu_assert_debug(false);
532+
return std::weak_ordering::less;
499533
}
500534

501535
int wxGameList::SortFunction(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData)
502536
{
503537
const auto sort_data = (SortData*)sortData;
504-
const int dir = sort_data->dir;
505-
506-
return sort_data->thisptr->SortComparator((uint64)item1, (uint64)item2, sort_data);
538+
return sort_data->dir * order_to_int(sort_data->thisptr->SortComparator((uint64)item1, (uint64)item2, sort_data));
507539
}
508540

509541
void wxGameList::SortEntries(int column)
@@ -530,8 +562,9 @@ void wxGameList::SortEntries(int column)
530562
case ColumnGameTime:
531563
case ColumnGameStarted:
532564
case ColumnRegion:
565+
case ColumnTitleID:
533566
{
534-
SortData data{ this, column, s_direction };
567+
SortData data{ this, ItemColumns{column}, s_direction };
535568
SortItems(SortFunction, (wxIntPtr)&data);
536569
break;
537570
}
@@ -1049,7 +1082,7 @@ void wxGameList::OnClose(wxCloseEvent& event)
10491082

10501083
int wxGameList::FindInsertPosition(TitleId titleId)
10511084
{
1052-
SortData data{ this, s_last_column, s_direction };
1085+
SortData data{ this, ItemColumns{s_last_column}, s_direction };
10531086
const auto itemCount = GetItemCount();
10541087
if (itemCount == 0)
10551088
return 0;

src/gui/components/wxGameList.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class wxGameList : public wxListView
6868
inline static const wxColour kSecondColor{ 0xFDF9F2 };
6969
void UpdateItemColors(sint32 startIndex = 0);
7070

71-
enum ItemColumns
71+
enum ItemColumns : int
7272
{
7373
ColumnHiddenName = 0,
7474
ColumnIcon,
@@ -89,12 +89,12 @@ class wxGameList : public wxListView
8989
struct SortData
9090
{
9191
wxGameList* thisptr;
92-
int column;
92+
ItemColumns column;
9393
int dir;
9494
};
9595

9696
int FindInsertPosition(TitleId titleId);
97-
int SortComparator(uint64 titleId1, uint64 titleId2, SortData* sortData);
97+
std::weak_ordering SortComparator(uint64 titleId1, uint64 titleId2, SortData* sortData);
9898
static int SortFunction(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData);
9999

100100
wxTimer* m_tooltip_timer;

0 commit comments

Comments
 (0)