@@ -52,7 +52,6 @@ static constexpr Qt::SortOrder DEFAULT_SORT_ORDER = Qt::AscendingOrder;
5252static constexpr std::array<int , GameListModel::Column_Count> DEFAULT_COLUMN_WIDTHS = {{
5353 55 , // type
5454 85 , // code
55- 55 , // favorite
5655 -1 , // title
5756 -1 , // file title
5857 75 , // crc
@@ -119,6 +118,15 @@ class GameListSortModel final : public QSortFilterProxyModel
119118
120119 bool lessThan (const QModelIndex& source_left, const QModelIndex& source_right) const override
121120 {
121+ const auto lock = GameList::GetLock ();
122+ const GameList::Entry* left = GameList::GetEntryByIndex (source_left.row ());
123+ const GameList::Entry* right = GameList::GetEntryByIndex (source_right.row ());
124+
125+ // Favorites always sort to the top regardless of column or sort direction.
126+
127+ if (left && right && left->is_favorite != right->is_favorite )
128+ return sortOrder () == Qt::AscendingOrder ? left->is_favorite : right->is_favorite ;
129+
122130 return m_model->lessThan (source_left, source_right, source_left.column ());
123131 }
124132
@@ -135,12 +143,10 @@ namespace
135143 class GameListIconStyleDelegate final : public QStyledItemDelegate
136144 {
137145 public:
138- static constexpr int STAR_SIZE = 22 ;
139146 static constexpr int STAR_MARGIN = 4 ;
140147
141- GameListIconStyleDelegate (QWidget* parent, const GameListModel* model )
148+ GameListIconStyleDelegate (QWidget* parent)
142149 : QStyledItemDelegate(parent)
143- , m_model(model)
144150 {
145151 }
146152 ~GameListIconStyleDelegate () = default ;
@@ -207,7 +213,9 @@ namespace
207213 index.data (GameListModel::NeedsFavoriteBadgeRole).toBool ();
208214 if (is_favorite)
209215 {
210- const QPixmap& star = m_model->getFavoritePixmap ();
216+ const auto * sort_model = static_cast <const QSortFilterProxyModel*>(index.model ());
217+ const auto * game_model = static_cast <const GameListModel*>(sort_model->sourceModel ());
218+ const QPixmap& star = game_model->getFavoritePixmap ();
211219 const QPoint icon_bottom_right = icon_top_left + QPoint (icon_width, icon_height);
212220 const QSizeF size = star.deviceIndependentSize ();
213221 const QPoint star_pos = icon_bottom_right - QPoint (size.width () + STAR_MARGIN, size.height () + STAR_MARGIN);
@@ -219,7 +227,6 @@ namespace
219227 }
220228
221229 private:
222- const GameListModel* m_model;
223230 };
224231} // namespace
225232
@@ -293,10 +300,9 @@ void GameListWidget::initialize()
293300 m_table_view->setVerticalScrollMode (QAbstractItemView::ScrollMode::ScrollPerPixel);
294301
295302 // Custom painter to center-align DisplayRoles (icons)
296- m_table_view->setItemDelegateForColumn (static_cast <int >(GameListModel::Column_Type), new GameListIconStyleDelegate (this , m_model));
297- m_table_view->setItemDelegateForColumn (static_cast <int >(GameListModel::Column_Region), new GameListIconStyleDelegate (this , m_model));
298- m_table_view->setItemDelegateForColumn (static_cast <int >(GameListModel::Column_Compatibility), new GameListIconStyleDelegate (this , m_model));
299- m_table_view->setItemDelegateForColumn (static_cast <int >(GameListModel::Column_Favorite), new GameListIconStyleDelegate (this , m_model));
303+ m_table_view->setItemDelegateForColumn (static_cast <int >(GameListModel::Column_Type), new GameListIconStyleDelegate (this ));
304+ m_table_view->setItemDelegateForColumn (static_cast <int >(GameListModel::Column_Region), new GameListIconStyleDelegate (this ));
305+ m_table_view->setItemDelegateForColumn (static_cast <int >(GameListModel::Column_Compatibility), new GameListIconStyleDelegate (this ));
300306
301307 connect (m_table_view->selectionModel (), &QItemSelectionModel::currentChanged, this ,
302308 &GameListWidget::onSelectionModelCurrentChanged);
@@ -340,7 +346,7 @@ void GameListWidget::initialize()
340346 m_list_view = new GameListGridListView (m_ui.stack );
341347 m_list_view->setModel (m_sort_model);
342348 m_list_view->setModelColumn (GameListModel::Column_Cover);
343- m_list_view->setItemDelegate (new GameListIconStyleDelegate (this , m_model ));
349+ m_list_view->setItemDelegate (new GameListIconStyleDelegate (this ));
344350 m_list_view->setSelectionMode (QAbstractItemView::SingleSelection);
345351 m_list_view->setViewMode (QListView::IconMode);
346352 m_list_view->setResizeMode (QListView::Adjust);
@@ -810,7 +816,6 @@ void GameListWidget::resizeTableViewColumnsToFit()
810816 QtUtils::ResizeColumnsForTableView (m_table_view, {
811817 DEFAULT_COLUMN_WIDTHS[GameListModel::Column_Type],
812818 DEFAULT_COLUMN_WIDTHS[GameListModel::Column_Serial],
813- DEFAULT_COLUMN_WIDTHS[GameListModel::Column_Favorite],
814819 DEFAULT_COLUMN_WIDTHS[GameListModel::Column_Title],
815820 DEFAULT_COLUMN_WIDTHS[GameListModel::Column_FileTitle],
816821 DEFAULT_COLUMN_WIDTHS[GameListModel::Column_CRC],
0 commit comments