Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Welcome Dialog interfering with Update Manager #7827

Merged
merged 6 commits into from Mar 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions rpcs3/rpcs3.vcxproj
Expand Up @@ -1266,6 +1266,7 @@
<ClCompile Include="rpcs3qt\breakpoint_handler.cpp" />
<ClCompile Include="rpcs3qt\breakpoint_list.cpp" />
<ClCompile Include="rpcs3qt\cheat_manager.cpp" />
<ClCompile Include="rpcs3qt\curl_handle.cpp" />
<ClCompile Include="rpcs3qt\custom_dialog.cpp" />
<ClCompile Include="rpcs3qt\debugger_list.cpp" />
<ClCompile Include="rpcs3qt\gui_application.cpp" />
Expand Down Expand Up @@ -1785,6 +1786,7 @@
<Command Condition="'$(Configuration)|$(Platform)'=='Debug - LLVM|x64'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl" "-I.\..\3rdparty\curl\include" "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent"</Command>
</CustomBuild>
<ClInclude Include="rpcs3qt\category.h" />
<ClInclude Include="rpcs3qt\curl_handle.h" />
<ClInclude Include="rpcs3qt\custom_dock_widget.h" />
<CustomBuild Include="rpcs3qt\debugger_list.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release - LLVM|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
Expand Down
6 changes: 6 additions & 0 deletions rpcs3/rpcs3.vcxproj.filters
Expand Up @@ -883,6 +883,9 @@
<ClCompile Include="QTGeneratedFiles\Debug - LLVM\moc_update_manager.cpp">
<Filter>Generated Files\Debug - LLVM</Filter>
</ClCompile>
<ClCompile Include="rpcs3qt\curl_handle.cpp">
<Filter>rpcs3</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="\rpcs3qt\*.h">
Expand Down Expand Up @@ -984,6 +987,9 @@
<ClInclude Include="rpcs3qt\category.h">
<Filter>Gui\game list</Filter>
</ClInclude>
<ClInclude Include="rpcs3qt\curl_handle.h">
<Filter>rpcs3</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="debug\moc_predefs.h.cbt">
Expand Down
1 change: 1 addition & 0 deletions rpcs3/rpcs3qt/CMakeLists.txt
Expand Up @@ -5,6 +5,7 @@
breakpoint_list.cpp
cg_disasm_window.cpp
cheat_manager.cpp
curl_handle.cpp
custom_dialog.cpp
debugger_frame.cpp
debugger_list.cpp
Expand Down
24 changes: 24 additions & 0 deletions rpcs3/rpcs3qt/curl_handle.cpp
@@ -0,0 +1,24 @@
#include "stdafx.h"
#include "curl_handle.h"
#include "Emu/System.h"

curl_handle::curl_handle(QObject* parent) : QObject(parent)
{
m_curl = curl_easy_init();

#ifdef _WIN32
// This shouldn't be needed on linux
const std::string path_to_cert = Emulator::GetEmuDir() + "cacert.pem";
curl_easy_setopt(m_curl, CURLOPT_CAINFO, path_to_cert.c_str());
#endif
}

curl_handle::~curl_handle()
{
curl_easy_cleanup(m_curl);
}

CURL* curl_handle::get_curl()
{
return m_curl;
}
20 changes: 20 additions & 0 deletions rpcs3/rpcs3qt/curl_handle.h
@@ -0,0 +1,20 @@
#pragma once

#include <QObject>

#ifndef CURL_STATICLIB
#define CURL_STATICLIB
#endif
#include <curl/curl.h>

class curl_handle : public QObject
{
private:
CURL* m_curl = nullptr;

public:
curl_handle(QObject* parent = nullptr);
~curl_handle();

CURL* get_curl();
};
26 changes: 8 additions & 18 deletions rpcs3/rpcs3qt/game_compatibility.cpp
@@ -1,18 +1,13 @@
#include "game_compatibility.h"
#include "gui_settings.h"
#include "progress_dialog.h"
#include "curl_handle.h"

#include <QApplication>
#include <QMessageBox>
#include <QJsonDocument>
#include <QThread>

#define NOMINMAX
#ifndef CURL_STATICLIB
#define CURL_STATICLIB
#endif
#include <curl/curl.h>

LOG_CHANNEL(compat_log, "Compat");

constexpr auto qstr = QString::fromStdString;
Expand All @@ -29,12 +24,7 @@ game_compatibility::game_compatibility(std::shared_ptr<gui_settings> settings) :
m_filepath = m_xgui_settings->GetSettingsDir() + "/compat_database.dat";
m_url = "https://rpcs3.net/compatibility?api=v1&export";

m_curl = curl_easy_init();

#ifdef _WIN32
// This shouldn't be needed on linux
curl_easy_setopt(m_curl, CURLOPT_CAINFO, "cacert.pem");
#endif
m_curl = new curl_handle(this);

RequestCompatibility();

Expand Down Expand Up @@ -68,7 +58,7 @@ size_t game_compatibility::update_buffer(char* data, size_t size)

if (m_actual_dwnld_size < 0)
{
if (curl_easy_getinfo(m_curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &m_actual_dwnld_size) == CURLE_OK && m_actual_dwnld_size > 0)
if (curl_easy_getinfo(m_curl->get_curl(), CURLINFO_CONTENT_LENGTH_DOWNLOAD, &m_actual_dwnld_size) == CURLE_OK && m_actual_dwnld_size > 0)
{
max = static_cast<int>(m_actual_dwnld_size);
}
Expand Down Expand Up @@ -183,10 +173,10 @@ void game_compatibility::RequestCompatibility(bool online)
m_progress_dialog = new progress_dialog(tr("Downloading Database"), tr("Please wait ..."), tr("Abort"), 0, 100, true);
m_progress_dialog->show();

curl_easy_setopt(m_curl, CURLOPT_URL, m_url.c_str());
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curl_write_cb_compat);
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, this);
curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_curl->get_curl(), CURLOPT_URL, m_url.c_str());
curl_easy_setopt(m_curl->get_curl(), CURLOPT_WRITEFUNCTION, curl_write_cb_compat);
curl_easy_setopt(m_curl->get_curl(), CURLOPT_WRITEDATA, this);
curl_easy_setopt(m_curl->get_curl(), CURLOPT_FOLLOWLOCATION, 1);

m_curl_buf.clear();
m_curl_abort = false;
Expand All @@ -197,7 +187,7 @@ void game_compatibility::RequestCompatibility(bool online)

auto thread = QThread::create([&]
{
const auto result = curl_easy_perform(m_curl);
const auto result = curl_easy_perform(m_curl->get_curl());
m_curl_result = result == CURLE_OK;

if (!m_curl_result)
Expand Down
3 changes: 2 additions & 1 deletion rpcs3/rpcs3qt/game_compatibility.h
Expand Up @@ -5,6 +5,7 @@
#include <QPainter>
#include <QJsonObject>

class curl_handle;
class gui_settings;
class progress_dialog;

Expand Down Expand Up @@ -40,7 +41,7 @@ class game_compatibility : public QObject
std::atomic<bool> m_curl_result = false;
std::atomic<bool> m_curl_abort = false;
double m_actual_dwnld_size = -1.0;
void* m_curl = nullptr;
curl_handle* m_curl = nullptr;
QByteArray m_curl_buf;
progress_dialog* m_progress_dialog = nullptr;
std::shared_ptr<gui_settings> m_xgui_settings;
Expand Down
76 changes: 1 addition & 75 deletions rpcs3/rpcs3qt/game_list_frame.cpp
Expand Up @@ -386,80 +386,6 @@ QString game_list_frame::GetLastPlayedBySerial(const QString& serial)
return m_persistent_settings->GetLastPlayed(serial);
}

QString game_list_frame::GetPlayTimeByMs(int elapsed_ms)
{
if (elapsed_ms <= 0)
{
return "";
}

const qint64 elapsed_seconds = (elapsed_ms / 1000) + ((elapsed_ms % 1000) > 0 ? 1 : 0);
const qint64 hours_played = elapsed_seconds / 3600;
const qint64 minutes_played = (elapsed_seconds % 3600) / 60;
const qint64 seconds_played = (elapsed_seconds % 3600) % 60;

// For anyone who was wondering why there need to be so many cases:
// 1. Using variables won't work for future localization due to varying sentence structure in different languages.
// 2. The provided Qt functionality only works if localization is already enabled
// 3. The provided Qt functionality only works for single variables

if (hours_played <= 0)
{
if (minutes_played <= 0)
{
if (seconds_played == 1)
{
return tr("%0 second").arg(seconds_played);
}
return tr("%0 seconds").arg(seconds_played);
}

if (seconds_played <= 0)
{
if (minutes_played == 1)
{
return tr("%0 minute").arg(minutes_played);
}
return tr("%0 minutes").arg(minutes_played);
}
if (minutes_played == 1 && seconds_played == 1)
{
return tr("%0 minute and %1 second").arg(minutes_played).arg(seconds_played);
}
if (minutes_played == 1)
{
return tr("%0 minute and %1 seconds").arg(minutes_played).arg(seconds_played);
}
if (seconds_played == 1)
{
return tr("%0 minutes and %1 second").arg(minutes_played).arg(seconds_played);
}
return tr("%0 minutes and %1 seconds").arg(minutes_played).arg(seconds_played);
}

if (minutes_played <= 0)
{
if (hours_played == 1)
{
return tr("%0 hour").arg(hours_played);
}
return tr("%0 hours").arg(hours_played);
}
if (hours_played == 1 && minutes_played == 1)
{
return tr("%0 hour and %1 minute").arg(hours_played).arg(minutes_played);
}
if (hours_played == 1)
{
return tr("%0 hour and %1 minutes").arg(hours_played).arg(minutes_played);
}
if (minutes_played == 1)
{
return tr("%0 hours and %1 minute").arg(hours_played).arg(minutes_played);
}
return tr("%0 hours and %1 minutes").arg(hours_played).arg(minutes_played);
}

std::string game_list_frame::GetCacheDirBySerial(const std::string& serial)
{
return fs::get_cache_dir() + "cache/" + serial;
Expand Down Expand Up @@ -2098,7 +2024,7 @@ void game_list_frame::PopulateGameList()
m_game_list->setItem(row, gui::column_sound, new custom_table_widget_item(GetStringFromU32(game->info.sound_format, localized.sound.format, true)));
m_game_list->setItem(row, gui::column_parental, new custom_table_widget_item(GetStringFromU32(game->info.parental_lvl, localized.parental.level), Qt::UserRole, game->info.parental_lvl));
m_game_list->setItem(row, gui::column_last_play, new custom_table_widget_item(locale.toString(last_played, gui::persistent::last_played_date_format_new), Qt::UserRole, last_played));
m_game_list->setItem(row, gui::column_playtime, new custom_table_widget_item(GetPlayTimeByMs(elapsed_ms), Qt::UserRole, elapsed_ms));
m_game_list->setItem(row, gui::column_playtime, new custom_table_widget_item(localized.GetVerboseTimeByMs(elapsed_ms), Qt::UserRole, elapsed_ms));
m_game_list->setItem(row, gui::column_compat, compat_item);

if (selected_item == game->info.icon_path)
Expand Down
1 change: 0 additions & 1 deletion rpcs3/rpcs3qt/game_list_frame.h
Expand Up @@ -113,7 +113,6 @@ private Q_SLOTS:
bool CreatePPUCache(const game_info& game);

QString GetLastPlayedBySerial(const QString& serial);
QString GetPlayTimeByMs(int elapsed_ms);
std::string GetCacheDirBySerial(const std::string& serial);
std::string GetDataDirBySerial(const std::string& serial);
std::string CurrentSelectionIconPath();
Expand Down
10 changes: 5 additions & 5 deletions rpcs3/rpcs3qt/gui_application.cpp
Expand Up @@ -69,17 +69,17 @@ void gui_application::Init()
// Create connects to propagate events throughout Gui.
InitializeConnects();

if (m_main_window)
{
m_main_window->Init();
}

if (m_gui_settings->GetValue(gui::ib_show_welcome).toBool())
{
welcome_dialog* welcome = new welcome_dialog();
welcome->exec();
}

if (m_main_window)
{
m_main_window->Init();
}

#ifdef WITH_DISCORD_RPC
// Discord Rich Presence Integration
if (m_gui_settings->GetValue(gui::m_richPresence).toBool())
Expand Down
75 changes: 75 additions & 0 deletions rpcs3/rpcs3qt/localized.cpp
Expand Up @@ -3,3 +3,78 @@
Localized::Localized()
{
}

QString Localized::GetVerboseTimeByMs(qint64 elapsed_ms) const
{
if (elapsed_ms <= 0)
{
return "";
}

const qint64 elapsed_seconds = (elapsed_ms / 1000) + ((elapsed_ms % 1000) > 0 ? 1 : 0);

const qint64 hours = elapsed_seconds / 3600;
const qint64 minutes = (elapsed_seconds % 3600) / 60;
const qint64 seconds = (elapsed_seconds % 3600) % 60;

// For anyone who was wondering why there need to be so many cases:
// 1. Using variables won't work for future localization due to varying sentence structure in different languages.
// 2. The provided Qt functionality only works if localization is already enabled
// 3. The provided Qt functionality only works for single variables

if (hours <= 0)
{
if (hours <= 0)
{
if (seconds == 1)
{
return tr("%0 second").arg(seconds);
}
return tr("%0 seconds").arg(seconds);
}

if (seconds <= 0)
{
if (minutes == 1)
{
return tr("%0 minute").arg(minutes);
}
return tr("%0 minutes").arg(minutes);
}
if (minutes == 1 && seconds == 1)
{
return tr("%0 minute and %1 second").arg(minutes).arg(seconds);
}
if (minutes == 1)
{
return tr("%0 minute and %1 seconds").arg(minutes).arg(seconds);
}
if (seconds == 1)
{
return tr("%0 minutes and %1 second").arg(minutes).arg(seconds);
}
return tr("%0 minutes and %1 seconds").arg(minutes).arg(seconds);
}

if (minutes <= 0)
{
if (hours == 1)
{
return tr("%0 hour").arg(hours);
}
return tr("%0 hours").arg(hours);
}
if (hours == 1 && minutes == 1)
{
return tr("%0 hour and %1 minute").arg(hours).arg(minutes);
}
if (hours == 1)
{
return tr("%0 hour and %1 minutes").arg(hours).arg(minutes);
}
if (minutes == 1)
{
return tr("%0 hours and %1 minute").arg(hours).arg(minutes);
}
return tr("%0 hours and %1 minutes").arg(hours).arg(minutes);
}
2 changes: 2 additions & 0 deletions rpcs3/rpcs3qt/localized.h
Expand Up @@ -17,6 +17,8 @@ class Localized : public QObject

Localized();

QString GetVerboseTimeByMs(qint64 elapsed_ms) const;

const struct category // (see PARAM.SFO in psdevwiki.com) TODO: Disc Categories
{
// PS3 bootable
Expand Down