Files

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

140 lines
4.7 KiB
C++
Raw Permalink Normal View History

2024-03-09 14:14:08 -05:00
// Copyright 2024 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#ifdef USE_RETRO_ACHIEVEMENTS
#include "DolphinQt/Achievements/AchievementBox.h"
#include <QByteArray>
2024-03-09 14:14:08 -05:00
#include <QDateTime>
#include <QHBoxLayout>
#include <QLabel>
#include <QProgressBar>
2024-06-22 00:26:52 -04:00
#include <QSizePolicy>
2024-03-09 14:14:08 -05:00
#include <QVBoxLayout>
#include <QWidget>
#include "Core/AchievementManager.h"
#include "DolphinQt/QtUtils/FromStdString.h"
2024-06-12 06:25:26 -04:00
static constexpr size_t PROGRESS_LENGTH = 24;
2025-04-01 21:17:35 -04:00
AchievementBox::AchievementBox(QWidget* parent, const rc_client_achievement_t* achievement)
2024-03-09 14:14:08 -05:00
: QGroupBox(parent), m_achievement(achievement)
{
const auto& instance = AchievementManager::GetInstance();
if (!instance.IsGameLoaded())
return;
m_badge = new QLabel();
QLabel* title = new QLabel(QString::fromUtf8(achievement->title, strlen(achievement->title)));
2024-06-15 10:22:32 -04:00
title->setWordWrap(true);
2024-06-22 00:26:52 -04:00
title->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
2024-03-09 14:14:08 -05:00
QLabel* description =
new QLabel(QString::fromUtf8(achievement->description, strlen(achievement->description)));
2024-06-15 10:22:32 -04:00
description->setWordWrap(true);
2024-06-22 00:26:52 -04:00
description->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
2024-03-09 14:14:08 -05:00
QLabel* points = new QLabel(tr("%1 points").arg(achievement->points));
m_status = new QLabel();
m_progress_bar = new QProgressBar();
QSizePolicy sp_retain = m_progress_bar->sizePolicy();
sp_retain.setRetainSizeWhenHidden(true);
m_progress_bar->setSizePolicy(sp_retain);
2024-06-12 06:25:26 -04:00
m_progress_label = new QLabel();
m_progress_label->setStyleSheet(QStringLiteral("background-color:transparent;"));
2024-06-12 06:25:26 -04:00
m_progress_label->setAlignment(Qt::AlignCenter);
2024-03-09 14:14:08 -05:00
QVBoxLayout* a_col_left = new QVBoxLayout();
a_col_left->addSpacerItem(new QSpacerItem(0, 0));
a_col_left->addWidget(m_badge);
a_col_left->addSpacerItem(new QSpacerItem(0, 0));
a_col_left->setSizeConstraint(QLayout::SetFixedSize);
a_col_left->setAlignment(Qt::AlignCenter);
2024-03-09 14:14:08 -05:00
QVBoxLayout* a_col_right = new QVBoxLayout();
a_col_right->addWidget(title);
a_col_right->addWidget(description);
a_col_right->addWidget(points);
a_col_right->addWidget(m_status);
a_col_right->addWidget(m_progress_bar);
2024-06-12 06:25:26 -04:00
QVBoxLayout* a_prog_layout = new QVBoxLayout(m_progress_bar);
a_prog_layout->setContentsMargins(0, 0, 0, 0);
a_prog_layout->addWidget(m_progress_label);
2024-03-09 14:14:08 -05:00
QHBoxLayout* a_total = new QHBoxLayout();
a_total->addLayout(a_col_left);
2024-03-09 14:14:08 -05:00
a_total->addLayout(a_col_right);
setLayout(a_total);
UpdateData();
}
void AchievementBox::UpdateData()
{
{
2024-06-20 00:35:46 -04:00
std::lock_guard lg{AchievementManager::GetInstance().GetLock()};
// rc_client guarantees m_achievement will be valid as long as the game is loaded
if (!AchievementManager::GetInstance().IsGameLoaded())
return;
const auto& badge = AchievementManager::GetInstance().GetAchievementBadge(
m_achievement->id, !m_achievement->unlocked);
2024-06-20 00:35:46 -04:00
std::string_view color = AchievementManager::GRAY;
if (m_achievement->unlocked & RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE)
color = AchievementManager::GOLD;
else if (m_achievement->unlocked & RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE)
color = AchievementManager::BLUE;
QImage i_badge(badge.data.data(), badge.width, badge.height, QImage::Format_RGBA8888);
2024-06-20 00:35:46 -04:00
m_badge->setPixmap(
QPixmap::fromImage(i_badge).scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation));
m_badge->adjustSize();
m_badge->setStyleSheet(
QStringLiteral("border: 4px solid %1").arg(QtUtils::FromStdString(color)));
if (m_achievement->unlocked)
2024-06-20 00:35:46 -04:00
{
if (m_achievement->unlock_time != 0)
{
m_status->setText(
// i18n: %1 is a date/time.
tr("Unlocked at %1")
.arg(QDateTime::fromSecsSinceEpoch(m_achievement->unlock_time).toString()));
}
else
{
m_status->setText(tr("Unlocked"));
}
2024-06-20 00:35:46 -04:00
}
else
{
m_status->setText(tr("Locked"));
}
2024-03-09 14:14:08 -05:00
}
2024-06-19 22:12:30 -04:00
UpdateProgress();
}
void AchievementBox::UpdateProgress()
2024-03-09 14:14:08 -05:00
{
std::lock_guard lg{AchievementManager::GetInstance().GetLock()};
// rc_client guarantees m_achievement will be valid as long as the game is loaded
if (!AchievementManager::GetInstance().IsGameLoaded())
return;
2024-03-09 14:14:08 -05:00
if (m_achievement->measured_percent > 0.000)
{
m_progress_bar->setRange(0, 100);
m_progress_bar->setValue(m_achievement->unlocked ? 100 : m_achievement->measured_percent);
2024-06-12 06:25:26 -04:00
m_progress_bar->setTextVisible(false);
m_progress_label->setText(
QString::fromUtf8(m_achievement->measured_progress,
qstrnlen(m_achievement->measured_progress, PROGRESS_LENGTH)));
m_progress_label->setVisible(!m_achievement->unlocked);
2024-03-09 14:14:08 -05:00
m_progress_bar->setVisible(true);
}
else
{
m_progress_bar->setVisible(false);
}
}
#endif // USE_RETRO_ACHIEVEMENTS