1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-23 03:02:53 +01:00

Qt: smoother batch package installation

This commit is contained in:
Megamouse 2020-01-07 22:44:23 +01:00
parent be2d225d96
commit 542d2ef8da
7 changed files with 79 additions and 53 deletions

View File

@ -130,7 +130,7 @@ void game_compatibility::RequestCompatibility(bool online)
QNetworkReply* network_reply = m_network_access_manager->get(m_network_request);
// Show Progress
m_progress_dialog = new progress_dialog(tr("Downloading Database"), tr(".Please wait."), tr("Abort"), 0, 100);
m_progress_dialog = new progress_dialog(tr("Downloading Database"), tr(".Please wait."), tr("Abort"), 0, 100, true);
m_progress_dialog->show();
// Animate progress dialog a bit more

View File

@ -1373,7 +1373,7 @@ void game_list_frame::BatchCreatePPUCaches()
return;
}
progress_dialog* pdlg = new progress_dialog(tr("PPU Cache Batch Creation"), tr("Creating all PPU caches"), tr("Cancel"), 0, total, this);
progress_dialog* pdlg = new progress_dialog(tr("PPU Cache Batch Creation"), tr("Creating all PPU caches"), tr("Cancel"), 0, total, true, this);
pdlg->setAutoClose(false);
pdlg->setAutoReset(false);
pdlg->show();
@ -1418,7 +1418,7 @@ void game_list_frame::BatchRemovePPUCaches()
return;
}
progress_dialog* pdlg = new progress_dialog(tr("PPU Cache Batch Removal"), tr("Removing all PPU caches"), tr("Cancel"), 0, total, this);
progress_dialog* pdlg = new progress_dialog(tr("PPU Cache Batch Removal"), tr("Removing all PPU caches"), tr("Cancel"), 0, total, true, this);
pdlg->setAutoClose(false);
pdlg->setAutoReset(false);
pdlg->show();
@ -1503,7 +1503,7 @@ void game_list_frame::BatchRemoveCustomConfigurations()
return;
}
progress_dialog* pdlg = new progress_dialog(tr("Custom Configuration Batch Removal"), tr("Removing all custom configurations"), tr("Cancel"), 0, total, this);
progress_dialog* pdlg = new progress_dialog(tr("Custom Configuration Batch Removal"), tr("Removing all custom configurations"), tr("Cancel"), 0, total, true, this);
pdlg->setAutoClose(false);
pdlg->setAutoReset(false);
pdlg->show();
@ -1548,7 +1548,7 @@ void game_list_frame::BatchRemoveCustomPadConfigurations()
return;
}
progress_dialog* pdlg = new progress_dialog(tr("Custom Pad Configuration Batch Removal"), tr("Removing all custom pad configurations"), tr("Cancel"), 0, total, this);
progress_dialog* pdlg = new progress_dialog(tr("Custom Pad Configuration Batch Removal"), tr("Removing all custom pad configurations"), tr("Cancel"), 0, total, true, this);
pdlg->setAutoClose(false);
pdlg->setAutoReset(false);
pdlg->show();
@ -1590,7 +1590,7 @@ void game_list_frame::BatchRemoveShaderCaches()
return;
}
progress_dialog* pdlg = new progress_dialog(tr("Shader Cache Batch Removal"), tr("Removing all shader caches"), tr("Cancel"), 0, total, this);
progress_dialog* pdlg = new progress_dialog(tr("Shader Cache Batch Removal"), tr("Removing all shader caches"), tr("Cancel"), 0, total, true, this);
pdlg->setAutoClose(false);
pdlg->setAutoReset(false);
pdlg->show();

View File

@ -370,36 +370,34 @@ void main_window::BootRsxCapture(std::string path)
}
}
bool main_window::InstallPkg(QString filePath, bool show_confirm, bool show_success)
void main_window::InstallPackages(QStringList file_paths, bool show_confirm)
{
if (filePath.isEmpty())
if (file_paths.isEmpty())
{
QString path_last_PKG = guiSettings->GetValue(gui::fd_install_pkg).toString();
filePath = QFileDialog::getOpenFileName(this, tr("Select PKG To Install"), path_last_PKG, tr("PKG files (*.pkg);;All files (*.*)"));
const QString file_path = QFileDialog::getOpenFileName(this, tr("Select PKG To Install"), path_last_PKG, tr("PKG files (*.pkg);;All files (*.*)"));
if (!file_path.isEmpty())
{
file_paths.append(file_path);
}
}
else if (show_confirm)
{
if (QMessageBox::question(this, tr("PKG Decrypter / Installer"), tr("Install package: %1?").arg(filePath),
if (QMessageBox::question(this, tr("PKG Decrypter / Installer"), tr("Install package: %1?").arg(file_paths.front()),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No) != QMessageBox::Yes)
{
LOG_NOTICE(LOADER, "PKG: Cancelled installation from drop. File: %s", sstr(filePath));
return false;
LOG_NOTICE(LOADER, "PKG: Cancelled installation from drop. File: %s", sstr(file_paths.front()));
return;
}
}
if (filePath.isEmpty())
if (file_paths.isEmpty())
{
return false;
return;
}
Emu.SetForceBoot(true);
Emu.Stop();
guiSettings->SetValue(gui::fd_install_pkg, QFileInfo(filePath).path());
const std::string fileName = sstr(QFileInfo(filePath).fileName());
const std::string path = sstr(filePath);
progress_dialog pdlg(tr("RPCS3 Package Installer"), tr("Installing package ... please wait ..."), tr("Cancel"), 0, 1000, this);
progress_dialog pdlg(tr("RPCS3 Package Installer"), tr("Installing package ... please wait ..."), tr("Cancel"), 0, 1000, false, this);
pdlg.show();
// Synchronization variable
@ -407,13 +405,30 @@ bool main_window::InstallPkg(QString filePath, bool show_confirm, bool show_succ
bool cancelled = false;
// Run PKG unpacking asynchronously
named_thread worker("PKG Installer", [&]
for (int i = 0, count = file_paths.count(); i < count; i++)
{
return pkg_install(path, progress);
});
progress = 0.;
pdlg.SetValue(0);
pdlg.setLabelText(tr("Installing package %0/%1 ... please wait ...").arg(i + 1).arg(count));
pdlg.show();
Emu.SetForceBoot(true);
Emu.Stop();
const QString file_path = file_paths.at(i);
const QFileInfo file_info(file_path);
const std::string path = sstr(file_path);
const std::string file_name = sstr(file_info.fileName());
guiSettings->SetValue(gui::fd_install_pkg, file_info.path());
// Run PKG unpacking asynchronously
named_thread worker("PKG Installer", [path, &progress]
{
return pkg_install(path, progress);
});
{
// Wait for the completion
while (std::this_thread::sleep_for(5ms), worker != thread_state::finished)
{
@ -441,24 +456,33 @@ bool main_window::InstallPkg(QString filePath, bool show_confirm, bool show_succ
pdlg.setHidden(true);
pdlg.SignalFailure();
}
}
if (worker())
{
m_gameListFrame->Refresh(true);
LOG_SUCCESS(GENERAL, "Successfully installed %s.", fileName);
if (show_success)
if (worker())
{
guiSettings->ShowInfoBox(tr("Success!"), tr("Successfully installed software from package(s)!"), gui::ib_pkg_success, this);
m_gameListFrame->Refresh(true);
LOG_SUCCESS(GENERAL, "Successfully installed %s.", file_name);
if (i == (count - 1))
{
guiSettings->ShowInfoBox(tr("Success!"), tr("Successfully installed software from package(s)!"), gui::ib_pkg_success, this);
}
}
else
{
if (!cancelled)
{
LOG_ERROR(GENERAL, "Failed to install %s.", file_name);
QMessageBox::critical(this, tr("Failure!"), tr("Failed to install software from package %1!").arg(file_path));
}
return;
}
// return if the thread was still running after cancel
if (cancelled)
{
return;
}
return true;
}
else if (!cancelled)
{
LOG_ERROR(GENERAL, "Failed to install %s.", fileName);
QMessageBox::critical(this, tr("Failure!"), tr("Failed to install software from package %1!").arg(filePath));
}
return false;
}
void main_window::InstallPup(QString filePath)
@ -554,7 +578,7 @@ void main_window::InstallPup(QString filePath)
return;
}
progress_dialog pdlg(tr("RPCS3 Firmware Installer"), tr("Installing firmware version %1\nPlease wait...").arg(qstr(version_string)), tr("Cancel"), 0, static_cast<int>(updatefilenames.size()), this);
progress_dialog pdlg(tr("RPCS3 Firmware Installer"), tr("Installing firmware version %1\nPlease wait...").arg(qstr(version_string)), tr("Cancel"), 0, static_cast<int>(updatefilenames.size()), false, this);
pdlg.show();
// Synchronization variable
@ -1203,7 +1227,7 @@ void main_window::CreateConnects()
guiSettings->SetValue(gui::rg_freeze, checked);
});
connect(ui->bootInstallPkgAct, &QAction::triggered, [this] {InstallPkg(); });
connect(ui->bootInstallPkgAct, &QAction::triggered, [this] {InstallPackages(); });
connect(ui->bootInstallPupAct, &QAction::triggered, [this] {InstallPup(); });
connect(ui->exitAct, &QAction::triggered, this, &QWidget::close);
@ -1899,18 +1923,16 @@ void main_window::dropEvent(QDropEvent* event)
connect(&dlg, &QDialog::accepted, [this, &dlg]()
{
const QStringList paths = dlg.GetPathsToInstall();
for (int i = 0, count = paths.count(); i < count; i++)
if (!paths.isEmpty())
{
if (!InstallPkg(paths.at(i), false, i == count - 1))
break;
InstallPackages(paths, false);
}
});
dlg.exec();
}
else
{
InstallPkg(dropPaths.front(), true);
InstallPackages(dropPaths, true);
}
break;
case drop_type::drop_pup: // install the firmware

View File

@ -116,7 +116,7 @@ private:
void CreateDockWindows();
void EnableMenus(bool enabled);
void ShowTitleBars(bool show);
bool InstallPkg(QString filePath = "", bool show_confirm = true, bool show_success = true);
void InstallPackages(QStringList file_paths = QStringList(), bool show_confirm = true);
void InstallPup(QString filePath = "");
int IsValidFile(const QMimeData& md, QStringList* dropPaths = nullptr);

View File

@ -2,14 +2,18 @@
#include <QLabel>
progress_dialog::progress_dialog(const QString &windowTitle, const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent, Qt::WindowFlags flags)
progress_dialog::progress_dialog(const QString &windowTitle, const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, bool delete_on_close, QWidget *parent, Qt::WindowFlags flags)
: QProgressDialog(labelText, cancelButtonText, minimum, maximum, parent, flags)
{
setWindowTitle(windowTitle);
setFixedSize(QLabel("This is the very length of the progressdialog due to hidpi reasons.").sizeHint().width(), sizeHint().height());
setValue(0);
setWindowModality(Qt::WindowModal);
connect(this, &QProgressDialog::canceled, this, &QProgressDialog::deleteLater);
if (delete_on_close)
{
connect(this, &QProgressDialog::canceled, this, &QProgressDialog::deleteLater);
}
#ifdef _WIN32
m_tb_button = std::make_unique<QWinTaskbarButton>();

View File

@ -17,7 +17,7 @@
class progress_dialog : public QProgressDialog
{
public:
progress_dialog(const QString &windowTitle, const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags());
progress_dialog(const QString &windowTitle, const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, bool delete_on_close, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags());
~progress_dialog();
void SetValue(int progress);
void SignalFailure();

View File

@ -59,7 +59,7 @@ void update_manager::check_for_updates(bool automatic, QWidget* parent)
const std::string request_url = m_update_url + rpcs3::get_commit_and_hash().second;
QNetworkReply* reply_json = m_manager.get(QNetworkRequest(QUrl(QString::fromStdString(request_url))));
m_progress_dialog = new progress_dialog(tr("Checking For Updates"), tr("Please wait..."), tr("Abort"), 0, 100, parent);
m_progress_dialog = new progress_dialog(tr("Checking For Updates"), tr("Please wait..."), tr("Abort"), 0, 100, true, parent);
m_progress_dialog->setAutoClose(false);
m_progress_dialog->setAutoReset(false);
m_progress_dialog->show();