Qt: Fix possible crash when rescanning game list

This commit is contained in:
Stenzek 2025-02-09 13:43:07 +10:00
parent 3e8ef44a1d
commit 0428a93315
No known key found for this signature in database
3 changed files with 24 additions and 5 deletions

View File

@ -637,6 +637,11 @@ QVariant GameListModel::headerData(int section, Qt::Orientation orientation, int
return m_column_display_names[section]; return m_column_display_names[section];
} }
const GameList::Entry* GameListModel::getTakenGameListEntry(u32 index) const
{
return (m_taken_entries.has_value() && index < m_taken_entries->size()) ? &m_taken_entries.value()[index] : nullptr;
}
bool GameListModel::hasTakenGameList() const bool GameListModel::hasTakenGameList() const
{ {
return m_taken_entries.has_value(); return m_taken_entries.has_value();

View File

@ -62,6 +62,7 @@ public:
ALWAYS_INLINE const QPixmap& getHasAchievementsPixmap() const { return m_has_achievements_pixmap; } ALWAYS_INLINE const QPixmap& getHasAchievementsPixmap() const { return m_has_achievements_pixmap; }
ALWAYS_INLINE const QPixmap& getMasteredAchievementsPixmap() const { return m_mastered_achievements_pixmap; } ALWAYS_INLINE const QPixmap& getMasteredAchievementsPixmap() const { return m_mastered_achievements_pixmap; }
const GameList::Entry* getTakenGameListEntry(u32 index) const;
bool hasTakenGameList() const; bool hasTakenGameList() const;
void takeGameList(); void takeGameList();

View File

@ -69,7 +69,11 @@ public:
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override
{ {
const auto lock = GameList::GetLock(); const auto lock = GameList::GetLock();
const GameList::Entry* entry = GameList::GetEntryByIndex(source_row); const GameList::Entry* entry = m_model->hasTakenGameList() ?
m_model->getTakenGameListEntry(static_cast<u32>(source_row)) :
GameList::GetEntryByIndex(static_cast<u32>(source_row));
if (!entry)
return false;
if (m_merge_disc_sets) if (m_merge_disc_sets)
{ {
@ -147,10 +151,8 @@ public:
u32 num_unlocked_hardcore = 0; u32 num_unlocked_hardcore = 0;
bool mastered = false; bool mastered = false;
{ const auto get_data_from_entry = [&num_achievements, &num_unlocked, &num_unlocked_hardcore,
const QModelIndex source_index = m_sort_model->mapToSource(index); &mastered](const GameList::Entry* entry) {
const auto lock = GameList::GetLock();
const GameList::Entry* entry = GameList::GetEntryByIndex(static_cast<u32>(source_index.row()));
if (!entry) if (!entry)
return; return;
@ -158,6 +160,17 @@ public:
num_unlocked = entry->unlocked_achievements; num_unlocked = entry->unlocked_achievements;
num_unlocked_hardcore = entry->unlocked_achievements_hc; num_unlocked_hardcore = entry->unlocked_achievements_hc;
mastered = entry->AreAchievementsMastered(); mastered = entry->AreAchievementsMastered();
};
const QModelIndex source_index = m_sort_model->mapToSource(index);
if (m_model->hasTakenGameList()) [[unlikely]]
{
get_data_from_entry(m_model->getTakenGameListEntry(static_cast<u32>(source_index.row())));
}
else
{
const auto lock = GameList::GetLock();
get_data_from_entry(GameList::GetEntryByIndex(static_cast<u32>(source_index.row())));
} }
QRect r = option.rect; QRect r = option.rect;