Refactored Challenge Icons to handle icon updates
If an icon is displayed on screen before it downloads, it was displaying a default icon but it would fail to load the actual icon even after it was downloaded. This fixes that.
This commit is contained in:
1 parent
6c5ceaa06d
commit
3d5a1f7d33
4 files changed
+55
-36
No files matched your search
@@ -338,7 +338,18 @@ AchievementManager::RichPresence AchievementManager::GetRichPresence() const
|
||||
return m_rich_presence;
|
||||
}
|
||||
|
||||
const AchievementManager::NamedBadgeMap& AchievementManager::GetChallengeIcons() const
|
||||
const bool AchievementManager::AreChallengesUpdated() const
|
||||
{
|
||||
return m_challenges_updated;
|
||||
}
|
||||
|
||||
void AchievementManager::ResetChallengesUpdated()
|
||||
{
|
||||
m_challenges_updated = false;
|
||||
}
|
||||
|
||||
const std::unordered_set<AchievementManager::AchievementId>&
|
||||
AchievementManager::GetActiveChallenges() const
|
||||
{
|
||||
return m_active_challenges;
|
||||
}
|
||||
@@ -796,15 +807,18 @@ void AchievementManager::HandleAchievementChallengeIndicatorShowEvent(
|
||||
const rc_client_event_t* client_event)
|
||||
{
|
||||
auto& instance = AchievementManager::GetInstance();
|
||||
instance.m_active_challenges[client_event->achievement->badge_name] =
|
||||
&AchievementManager::GetInstance().GetAchievementBadge(client_event->achievement->id, false);
|
||||
const auto [iter, inserted] = instance.m_active_challenges.insert(client_event->achievement->id);
|
||||
if (inserted)
|
||||
instance.m_challenges_updated = true;
|
||||
}
|
||||
|
||||
void AchievementManager::HandleAchievementChallengeIndicatorHideEvent(
|
||||
const rc_client_event_t* client_event)
|
||||
{
|
||||
AchievementManager::GetInstance().m_active_challenges.erase(
|
||||
client_event->achievement->badge_name);
|
||||
auto& instance = AchievementManager::GetInstance();
|
||||
const auto removed = instance.m_active_challenges.erase(client_event->achievement->id);
|
||||
if (removed > 0)
|
||||
instance.m_challenges_updated = true;
|
||||
}
|
||||
|
||||
void AchievementManager::HandleAchievementProgressIndicatorShowEvent(
|
||||
@@ -968,6 +982,11 @@ void AchievementManager::FetchBadge(AchievementManager::Badge* badge, u32 badge_
|
||||
}
|
||||
|
||||
m_update_callback(callback_data);
|
||||
if (badge_type == RC_IMAGE_TYPE_ACHIEVEMENT &&
|
||||
m_active_challenges.contains(*callback_data.achievements.begin()))
|
||||
{
|
||||
m_challenges_updated = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <string_view>
|
||||
#include <thread>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
#include <rcheevos/include/rc_api_runtime.h>
|
||||
@@ -50,7 +51,6 @@ public:
|
||||
static constexpr size_t RP_SIZE = 256;
|
||||
using RichPresence = std::array<char, RP_SIZE>;
|
||||
using Badge = VideoCommon::CustomTextureData::ArraySlice::Level;
|
||||
using NamedBadgeMap = std::unordered_map<std::string, const Badge*>;
|
||||
static constexpr size_t MAX_DISPLAYED_LBOARDS = 4;
|
||||
|
||||
static constexpr std::string_view DEFAULT_PLAYER_BADGE_FILENAME = "achievements_player.png";
|
||||
@@ -116,7 +116,9 @@ public:
|
||||
const Badge& GetAchievementBadge(AchievementId id, bool locked) const;
|
||||
const LeaderboardStatus* GetLeaderboardInfo(AchievementId leaderboard_id);
|
||||
RichPresence GetRichPresence() const;
|
||||
const NamedBadgeMap& GetChallengeIcons() const;
|
||||
const bool AreChallengesUpdated() const;
|
||||
void ResetChallengesUpdated();
|
||||
const std::unordered_set<AchievementId>& GetActiveChallenges() const;
|
||||
std::vector<std::string> GetActiveLeaderboards() const;
|
||||
|
||||
void DoState(PointerWrap& p);
|
||||
@@ -203,7 +205,8 @@ private:
|
||||
std::chrono::steady_clock::time_point m_last_rp_time = std::chrono::steady_clock::now();
|
||||
|
||||
std::unordered_map<AchievementId, LeaderboardStatus> m_leaderboard_map;
|
||||
NamedBadgeMap m_active_challenges;
|
||||
bool m_challenges_updated = false;
|
||||
std::unordered_set<AchievementId> m_active_challenges;
|
||||
std::vector<rc_client_leaderboard_tracker_t> m_active_leaderboards;
|
||||
|
||||
Common::WorkQueueThread<std::function<void()>> m_queue;
|
||||
|
||||
Reference in new issue
Block a user