@@ -485,25 +485,57 @@ static inline int order_to_int(const std::weak_ordering &wo)
485
485
return 0 ;
486
486
}
487
487
488
- int wxGameList::SortComparator (uint64 titleId1, uint64 titleId2, SortData* sortData)
488
+ std::weak_ordering wxGameList::SortComparator (uint64 titleId1, uint64 titleId2, SortData* sortData)
489
489
{
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
+ };
494
496
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;
499
533
}
500
534
501
535
int wxGameList::SortFunction (wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData)
502
536
{
503
537
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));
507
539
}
508
540
509
541
void wxGameList::SortEntries (int column)
@@ -530,8 +562,9 @@ void wxGameList::SortEntries(int column)
530
562
case ColumnGameTime:
531
563
case ColumnGameStarted:
532
564
case ColumnRegion:
565
+ case ColumnTitleID:
533
566
{
534
- SortData data{ this , column, s_direction };
567
+ SortData data{ this , ItemColumns{ column} , s_direction };
535
568
SortItems (SortFunction, (wxIntPtr)&data);
536
569
break ;
537
570
}
@@ -1049,7 +1082,7 @@ void wxGameList::OnClose(wxCloseEvent& event)
1049
1082
1050
1083
int wxGameList::FindInsertPosition (TitleId titleId)
1051
1084
{
1052
- SortData data{ this , s_last_column, s_direction };
1085
+ SortData data{ this , ItemColumns{ s_last_column} , s_direction };
1053
1086
const auto itemCount = GetItemCount ();
1054
1087
if (itemCount == 0 )
1055
1088
return 0 ;
0 commit comments