wip: add some testing date / version

This commit is contained in:
faith 2024-12-06 11:34:49 +08:00
parent 83409389a9
commit 5ee5b98aba
5 changed files with 60 additions and 34 deletions

View File

@ -1,12 +1,12 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <iostream> #include <QFileInfo>
#include <QMessageBox>
#include <QProgressDialog>
#include "common/path_util.h" #include "common/path_util.h"
#include "compatibility_info.h" #include "compatibility_info.h"
#include <QProgressDialog>
#include <QMessageBox>
#include <QFileInfo>
CompatibilityInfoClass::CompatibilityInfoClass() CompatibilityInfoClass::CompatibilityInfoClass()
: m_network_manager(new QNetworkAccessManager(this)) { : m_network_manager(new QNetworkAccessManager(this)) {
@ -20,7 +20,8 @@ CompatibilityInfoClass::~CompatibilityInfoClass() = default;
void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent) { void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent) {
QFileInfo check_file(m_compatibility_filename); QFileInfo check_file(m_compatibility_filename);
const auto modified_delta = check_file.lastModified() - QDateTime::currentDateTime(); const auto modified_delta = check_file.lastModified() - QDateTime::currentDateTime();
if (check_file.exists() && check_file.isFile() && std::chrono::duration_cast<std::chrono::minutes>(modified_delta).count() < 60) { if (check_file.exists() && check_file.isFile() &&
std::chrono::duration_cast<std::chrono::minutes>(modified_delta).count() < 60) {
if (LoadCompatibilityFile()) if (LoadCompatibilityFile())
return; return;
QMessageBox::critical(parent, tr("Error"), QMessageBox::critical(parent, tr("Error"),
@ -46,9 +47,10 @@ void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent) {
if (reply->error() != QNetworkReply::NoError) { if (reply->error() != QNetworkReply::NoError) {
reply->deleteLater(); reply->deleteLater();
QMessageBox::critical(parent, tr("Error"), QMessageBox::critical(
tr("Unable to update compatibility data! Using old compatibility data...")); parent, tr("Error"),
//TODO: Try loading compatibility_file.json again tr("Unable to update compatibility data! Using old compatibility data..."));
// Try loading compatibility_file.json again
LoadCompatibilityFile(); LoadCompatibilityFile();
return; return;
} }
@ -87,8 +89,7 @@ void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent) {
dialog.reset(); dialog.reset();
}); });
connect(&dialog, &QProgressDialog::canceled, &future_watcher, connect(&dialog, &QProgressDialog::canceled, &future_watcher, &QFutureWatcher<void>::cancel);
&QFutureWatcher<void>::cancel);
dialog.setRange(0, remaining_pages); dialog.setRange(0, remaining_pages);
connect(&future_watcher, &QFutureWatcher<void>::progressValueChanged, &dialog, connect(&future_watcher, &QFutureWatcher<void>::progressValueChanged, &dialog,
&QProgressDialog::setValue); &QProgressDialog::setValue);
@ -117,7 +118,7 @@ void CompatibilityInfoClass::WaitForReply(QNetworkReply* reply) {
return; return;
}; };
CompatibilityStatus CompatibilityInfoClass::GetCompatibilityStatus(const std::string& serial) { CompatibilityEntry CompatibilityInfoClass::GetCompatibilityInfo(const std::string& serial) {
QString title_id = QString::fromStdString(serial); QString title_id = QString::fromStdString(serial);
if (m_compatibility_database.contains(title_id)) { if (m_compatibility_database.contains(title_id)) {
{ {
@ -125,13 +126,18 @@ CompatibilityStatus CompatibilityInfoClass::GetCompatibilityStatus(const std::st
QString os_string = OSTypeToString.at(static_cast<OSType>(os_int)); QString os_string = OSTypeToString.at(static_cast<OSType>(os_int));
QJsonObject compatibility_obj = m_compatibility_database[title_id].toObject(); QJsonObject compatibility_obj = m_compatibility_database[title_id].toObject();
if (compatibility_obj.contains(os_string)) { if (compatibility_obj.contains(os_string)) {
return LabelToCompatStatus.at( QJsonObject compatibility_entry_obj = compatibility_obj[os_string].toObject();
compatibility_obj[os_string].toString()); CompatibilityEntry compatibility_entry{
LabelToCompatStatus.at(compatibility_entry_obj["status"].toString()),
compatibility_entry_obj["version"].toString(),
QDateTime::fromString(compatibility_entry_obj["last_tested"].toString(),
Qt::ISODate)};
return compatibility_entry;
} }
} }
} }
} }
return CompatibilityStatus::Unknown; return CompatibilityEntry{CompatibilityStatus::Unknown};
} }
bool CompatibilityInfoClass::LoadCompatibilityFile() { bool CompatibilityInfoClass::LoadCompatibilityFile() {
@ -152,7 +158,6 @@ bool CompatibilityInfoClass::LoadCompatibilityFile() {
return true; return true;
} }
void CompatibilityInfoClass::ExtractCompatibilityInfo(QByteArray response) { void CompatibilityInfoClass::ExtractCompatibilityInfo(QByteArray response) {
QJsonDocument json_doc(QJsonDocument::fromJson(response)); QJsonDocument json_doc(QJsonDocument::fromJson(response));
@ -190,10 +195,17 @@ void CompatibilityInfoClass::ExtractCompatibilityInfo(QByteArray response) {
QJsonValueRef compatibility_object_ref = m_compatibility_database[title_id]; QJsonValueRef compatibility_object_ref = m_compatibility_database[title_id];
if (compatibility_object_ref.isNull()) { if (compatibility_object_ref.isNull()) {
compatibility_object_ref = QJsonObject({{current_os, compatibility_status}}); compatibility_object_ref = QJsonObject({});
} else {
compatibility_object_ref.toObject()[current_os] = compatibility_status;
} }
QJsonObject compatibility_data{
{{"status", compatibility_status},
{"last_tested", issue_obj["updated_at"]},
{"version", issue_obj["milestone"].isNull()
? "unknown"
: issue_obj["milestone"].toObject()["title"].toString()}}};
compatibility_object_ref.toObject().insert(current_os, compatibility_data);
} }
} }

View File

@ -42,6 +42,12 @@ enum OSType {
Last Last
}; };
struct CompatibilityEntry {
CompatibilityStatus status;
QString version;
QDateTime last_tested;
};
class CompatibilityInfoClass : public QObject { class CompatibilityInfoClass : public QObject {
Q_OBJECT Q_OBJECT
public: public:
@ -75,7 +81,7 @@ public:
~CompatibilityInfoClass(); ~CompatibilityInfoClass();
void UpdateCompatibilityDatabase(QWidget* parent = nullptr); void UpdateCompatibilityDatabase(QWidget* parent = nullptr);
bool LoadCompatibilityFile(); bool LoadCompatibilityFile();
CompatibilityStatus GetCompatibilityStatus(const std::string& serial); CompatibilityEntry GetCompatibilityInfo(const std::string& serial);
void ExtractCompatibilityInfo(QByteArray response); void ExtractCompatibilityInfo(QByteArray response);
static void WaitForReply(QNetworkReply* reply); static void WaitForReply(QNetworkReply* reply);
QNetworkReply* FetchPage(int page_num); QNetworkReply* FetchPage(int page_num);

View File

@ -4,6 +4,7 @@
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/path_util.h" #include "common/path_util.h"
#include "common/string_util.h" #include "common/string_util.h"
#include "compatibility_info.h" #include "compatibility_info.h"
#include "game_list_frame.h" #include "game_list_frame.h"
#include "game_list_utils.h" #include "game_list_utils.h"
@ -108,9 +109,9 @@ void GameListFrame::PopulateGameList() {
SetTableItem(i, 6, QString::fromStdString(m_game_info->m_games[i].size)); SetTableItem(i, 6, QString::fromStdString(m_game_info->m_games[i].size));
SetTableItem(i, 7, QString::fromStdString(m_game_info->m_games[i].version)); SetTableItem(i, 7, QString::fromStdString(m_game_info->m_games[i].version));
m_game_info->m_games[i].compatibility_status = m_game_info->m_games[i].compatibility =
m_compat_info->GetCompatibilityStatus(m_game_info->m_games[i].serial); m_compat_info->GetCompatibilityInfo(m_game_info->m_games[i].serial);
SetCompatibilityItem(i, 2, m_game_info->m_games[i].compatibility_status); SetCompatibilityItem(i, 2, m_game_info->m_games[i].compatibility);
QString playTime = GetPlayTime(m_game_info->m_games[i].serial); QString playTime = GetPlayTime(m_game_info->m_games[i].serial);
if (playTime.isEmpty()) { if (playTime.isEmpty()) {
@ -213,14 +214,14 @@ void GameListFrame::ResizeIcons(int iconSize) {
this->horizontalHeader()->setSectionResizeMode(8, QHeaderView::ResizeToContents); this->horizontalHeader()->setSectionResizeMode(8, QHeaderView::ResizeToContents);
} }
void GameListFrame::SetCompatibilityItem(int row, int column, CompatibilityStatus status) { void GameListFrame::SetCompatibilityItem(int row, int column, CompatibilityEntry entry) {
QTableWidgetItem* item = new QTableWidgetItem(); QTableWidgetItem* item = new QTableWidgetItem();
QWidget* widget = new QWidget(this); QWidget* widget = new QWidget(this);
QGridLayout* layout = new QGridLayout(widget); QGridLayout* layout = new QGridLayout(widget);
QColor color; QColor color;
switch (status) { switch (entry.status) {
case Unknown: case Unknown:
color = QStringLiteral("#000000"); color = QStringLiteral("#000000");
break; break;
@ -252,7 +253,7 @@ void GameListFrame::SetCompatibilityItem(int row, int column, CompatibilityStatu
QLabel* dotLabel = new QLabel("", widget); QLabel* dotLabel = new QLabel("", widget);
dotLabel->setPixmap(circle_pixmap); dotLabel->setPixmap(circle_pixmap);
QLabel* label = new QLabel(m_compat_info->CompatStatusToString.at(status), widget); QLabel* label = new QLabel(m_compat_info->CompatStatusToString.at(entry.status), widget);
label->setStyleSheet("color: white; font-size: 16px; font-weight: bold;"); label->setStyleSheet("color: white; font-size: 16px; font-weight: bold;");
@ -264,8 +265,13 @@ void GameListFrame::SetCompatibilityItem(int row, int column, CompatibilityStatu
label->setGraphicsEffect(shadowEffect); // Apply shadow effect to the QLabel label->setGraphicsEffect(shadowEffect); // Apply shadow effect to the QLabel
layout->addWidget(dotLabel, 0, 0, -1, 4); QLabel* version_label =
layout->addWidget(label, 0, 4, -1, 4); new QLabel(QString("%1, (%2)").arg(entry.last_tested.toString(), entry.version), widget);
version_label->setStyleSheet("color: white; font-size: 12px;");
layout->addWidget(dotLabel, 0, 0, -1, 1);
layout->addWidget(label, 0, 1, 1, 1);
layout->addWidget(version_label, 1, 1, 1, 1);
layout->setAlignment(Qt::AlignLeft); layout->setAlignment(Qt::AlignLeft);
widget->setLayout(layout); widget->setLayout(layout);
this->setItem(row, column, item); this->setItem(row, column, item);

View File

@ -17,7 +17,9 @@
class GameListFrame : public QTableWidget { class GameListFrame : public QTableWidget {
Q_OBJECT Q_OBJECT
public: public:
explicit GameListFrame(std::shared_ptr<GameInfoClass> game_info_get, std::shared_ptr<CompatibilityInfoClass> compat_info_get, QWidget* parent = nullptr); explicit GameListFrame(std::shared_ptr<GameInfoClass> game_info_get,
std::shared_ptr<CompatibilityInfoClass> compat_info_get,
QWidget* parent = nullptr);
Q_SIGNALS: Q_SIGNALS:
void GameListFrameClosed(); void GameListFrameClosed();
@ -33,7 +35,7 @@ public Q_SLOTS:
private: private:
void SetTableItem(int row, int column, QString itemStr); void SetTableItem(int row, int column, QString itemStr);
void SetRegionFlag(int row, int column, QString itemStr); void SetRegionFlag(int row, int column, QString itemStr);
void SetCompatibilityItem(int row, int column, CompatibilityStatus status); void SetCompatibilityItem(int row, int column, CompatibilityEntry entry);
QString GetPlayTime(const std::string& serial); QString GetPlayTime(const std::string& serial);
QList<QAction*> m_columnActs; QList<QAction*> m_columnActs;
GameInfoClass* game_inf_get = nullptr; GameInfoClass* game_inf_get = nullptr;
@ -65,7 +67,7 @@ public:
case 1: case 1:
return a.name < b.name; return a.name < b.name;
case 2: case 2:
return a.compatibility_status < b.compatibility_status; return a.compatibility.status < b.compatibility.status;
case 3: case 3:
return a.serial.substr(4) < b.serial.substr(4); return a.serial.substr(4) < b.serial.substr(4);
case 4: case 4:
@ -90,7 +92,7 @@ public:
case 1: case 1:
return a.name > b.name; return a.name > b.name;
case 2: case 2:
return a.compatibility_status > b.compatibility_status; return a.compatibility.status > b.compatibility.status;
case 3: case 3:
return a.serial.substr(4) > b.serial.substr(4); return a.serial.substr(4) > b.serial.substr(4);
case 4: case 4:

View File

@ -27,7 +27,7 @@ struct GameInfo {
std::string fw = "Unknown"; std::string fw = "Unknown";
std::string play_time = "Unknown"; std::string play_time = "Unknown";
CompatibilityStatus compatibility_status = CompatibilityStatus::Unknown; CompatibilityEntry compatibility = CompatibilityEntry{CompatibilityStatus::Unknown};
}; };
class GameListUtils { class GameListUtils {