Changed: New COperationDialog that manager progress bar in a dialog

This commit is contained in:
kervala 2016-05-16 11:11:40 +02:00
parent debf070ec1
commit 2f46d107f4
7 changed files with 643 additions and 407 deletions

View file

@ -18,6 +18,7 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "configfile.h" #include "configfile.h"
#include "wizarddialog.h" #include "wizarddialog.h"
#include "operationdialog.h"
#include "nel/misc/path.h" #include "nel/misc/path.h"
#include "nel/misc/ucstring.h" #include "nel/misc/ucstring.h"
@ -98,10 +99,27 @@ int main(int argc, char *argv[])
if (displayMainWindow) if (displayMainWindow)
{ {
CMainWindow mainWindow; step = config.getNextStep();
mainWindow.show();
return QApplication::exec(); if (step != CConfigFile::Done)
{
COperationDialog dialog;
if (!dialog.exec()) displayMainWindow = false;
}
}
if (displayMainWindow)
{
step = config.getNextStep();
if (step == CConfigFile::Done)
{
CMainWindow mainWindow;
mainWindow.show();
return QApplication::exec();
}
} }
return 0; return 0;

View file

@ -17,59 +17,25 @@
#include "stdpch.h" #include "stdpch.h"
#include "mainwindow.h" #include "mainwindow.h"
#include "downloader.h" #include "downloader.h"
#include "archive.h"
#include "wizarddialog.h" #include "wizarddialog.h"
#include "profilesdialog.h" #include "profilesdialog.h"
#include "configfile.h" #include "configfile.h"
#include "config.h" #include "config.h"
#include "profilesmodel.h" #include "profilesmodel.h"
#include "seven_zip.h"
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
#include <QtWinExtras/QWinTaskbarProgress>
#include <QtWinExtras/QWinTaskbarButton>
#endif
#ifdef DEBUG_NEW #ifdef DEBUG_NEW
#define new DEBUG_NEW #define new DEBUG_NEW
#endif #endif
CMainWindow::CMainWindow():QMainWindow(), m_archive(NULL), m_statusLabel(NULL) CMainWindow::CMainWindow():QMainWindow(), m_statusLabel(NULL)
{ {
setupUi(this); setupUi(this);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button = new QWinTaskbarButton(this);
#endif
connect(resumeButton, SIGNAL(clicked()), SLOT(onResumeClicked()));
connect(stopButton, SIGNAL(clicked()), SLOT(onStopClicked()));
// downloader // downloader
m_downloader = new CDownloader(this); m_downloader = new CDownloader(this);
connect(m_downloader, SIGNAL(downloadPrepare()), SLOT(onDownloadPrepare()));
connect(m_downloader, SIGNAL(downloadInit(qint64, qint64)), SLOT(onDownloadInit(qint64, qint64)));
connect(m_downloader, SIGNAL(downloadStart()), SLOT(onDownloadStart()));
connect(m_downloader, SIGNAL(downloadStop()), SLOT(onDownloadStop()));
connect(m_downloader, SIGNAL(downloadProgress(qint64)), SLOT(onDownloadProgress(qint64)));
connect(m_downloader, SIGNAL(downloadSuccess(qint64)), SLOT(onDownloadSuccess(qint64)));
connect(m_downloader, SIGNAL(downloadFail(QString)), SLOT(onDownloadFail(QString)));
connect(m_downloader, SIGNAL(htmlPageContent(QString)), SLOT(onHtmlPageContent(QString))); connect(m_downloader, SIGNAL(htmlPageContent(QString)), SLOT(onHtmlPageContent(QString)));
// archive
m_archive = new CArchive(this);
connect(m_archive, SIGNAL(extractPrepare()), SLOT(onExtractPrepare()));
connect(m_archive, SIGNAL(extractInit(qint64, qint64)), SLOT(onExtractInit(qint64, qint64)));
connect(m_archive, SIGNAL(extractStart()), SLOT(onExtractStart()));
connect(m_archive, SIGNAL(extractStop()), SLOT(onExtractStop()));
connect(m_archive, SIGNAL(extractProgress(qint64, QString)), SLOT(onExtractProgress(qint64, QString)));
connect(m_archive, SIGNAL(extractSuccess(qint64)), SLOT(onExtractSuccess(qint64)));
connect(m_archive, SIGNAL(extractFail(QString)), SLOT(onExtractFail(QString)));
connect(m_archive, SIGNAL(done()), SLOT(onDone()));
connect(actionProfiles, SIGNAL(triggered()), SLOT(onProfiles())); connect(actionProfiles, SIGNAL(triggered()), SLOT(onProfiles()));
connect(playButton, SIGNAL(clicked()), SLOT(onPlayClicked())); connect(playButton, SIGNAL(clicked()), SLOT(onPlayClicked()));
@ -78,10 +44,14 @@ CMainWindow::CMainWindow():QMainWindow(), m_archive(NULL), m_statusLabel(NULL)
connect(actionAboutQt, SIGNAL(triggered()), SLOT(onAboutQt())); connect(actionAboutQt, SIGNAL(triggered()), SLOT(onAboutQt()));
connect(actionAbout, SIGNAL(triggered()), SLOT(onAbout())); connect(actionAbout, SIGNAL(triggered()), SLOT(onAbout()));
connect(profilesComboBox, SIGNAL(currentIndexChanged(int)), SLOT(onProfileChanged(int)));
m_statusLabel = new QLabel(); m_statusLabel = new QLabel();
statusBar()->addWidget(m_statusLabel); statusBar()->addWidget(m_statusLabel);
updateProfiles();
// setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); // setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
} }
@ -89,119 +59,9 @@ CMainWindow::~CMainWindow()
{ {
} }
void CMainWindow::processNextStep()
{
CConfigFile *config = CConfigFile::getInstance();
// default server
const CServer &server = config->getServer();
// default profile
const CProfile &configuration = config->getProfile();
switch(CConfigFile::getInstance()->getNextStep())
{
case CConfigFile::DisplayNoServerError:
break;
case CConfigFile::ShowWizard:
break;
case CConfigFile::DownloadData:
displayProgressBar();
m_downloader->prepareFile(config->expandVariables(server.dataDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.dataDownloadFilename) + ".part");
break;
case CConfigFile::ExtractDownloadedData:
displayProgressBar();
break;
case CConfigFile::DownloadClient:
displayProgressBar();
m_downloader->prepareFile(config->expandVariables(server.clientDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.clientDownloadFilename) + ".part");
break;
case CConfigFile::ExtractDownloadedClient:
displayProgressBar();
// TODO
break;
case CConfigFile::CopyServerFiles:
displayProgressBar();
m_archive->copyServerFiles(config->getSrcServerDirectory(), config->getInstallationDirectory() + "/" + server.id);
break;
case CConfigFile::CopyProfileFiles:
displayProgressBar();
m_archive->copyProfileFiles(config->getSrcProfileDirectory(), config->getProfileDirectory() + "/0");
break;
case CConfigFile::ExtractBnpClient:
displayProgressBar();
m_archive->extract(config->getSrcServerClientBNPFullPath(), config->getInstallationDirectory() + "/" + server.id);
break;
case CConfigFile::CleanFiles:
hideProgressBar();
m_archive->cleanServerFiles(config->getInstallationDirectory() + "/" + server.id);
break;
case CConfigFile::CreateProfile:
hideProgressBar();
config->createDefaultProfile();
onDone();
break;
case CConfigFile::CreateShortcuts:
hideProgressBar();
config->createDefaultShortcuts();
onDone();
break;
default:
// cases already managed in main.cpp
displayConfigurationsChoices();
break;
}
m_downloader->getHtmlPageContent(config->expandVariables(server.displayUrl));
}
void CMainWindow::displayProgressBar()
{
downloadFrame->setVisible(true);
configurationFrame->setVisible(false);
resumeButton->setVisible(true);
stopButton->setVisible(false);
}
void CMainWindow::hideProgressBar()
{
downloadFrame->setVisible(false);
configurationFrame->setVisible(false);
resumeButton->setVisible(false);
stopButton->setVisible(false);
}
void CMainWindow::displayConfigurationsChoices()
{
downloadFrame->setVisible(false);
configurationFrame->setVisible(true);
profilesComboBox->setModel(new CProfilesModel(this));
}
void CMainWindow::showEvent(QShowEvent *e) void CMainWindow::showEvent(QShowEvent *e)
{ {
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->setWindow(windowHandle());
#endif
e->accept(); e->accept();
processNextStep();
} }
void CMainWindow::closeEvent(QCloseEvent *e) void CMainWindow::closeEvent(QCloseEvent *e)
@ -211,28 +71,9 @@ void CMainWindow::closeEvent(QCloseEvent *e)
e->accept(); e->accept();
} }
void CMainWindow::onResumeClicked() void CMainWindow::updateProfiles()
{ {
m_downloader->getFile(); profilesComboBox->setModel(new CProfilesModel(this));
}
void CMainWindow::onStopClicked()
{
if (m_downloader->isDownloading())
{
if (!m_downloader->supportsResume())
{
QMessageBox::StandardButton res = QMessageBox::question(this, tr("Confirmation"), tr("Warning, this server doesn't support resume! If you stop download now, you won't be able to resume it later.\nAre you sure to abort download?"));
if (res != QMessageBox::Yes) return;
}
m_downloader->stop();
}
else
{
m_archive->stop();
}
} }
void CMainWindow::onPlayClicked() void CMainWindow::onPlayClicked()
@ -251,6 +92,8 @@ void CMainWindow::onPlayClicked()
arguments << profile.arguments; arguments << profile.arguments;
bool started = QProcess::startDetached(profile.executable, arguments); bool started = QProcess::startDetached(profile.executable, arguments);
CConfigFile::getInstance()->setDefaultProfileIndex(profileIndex);
} }
void CMainWindow::onConfigureClicked() void CMainWindow::onConfigureClicked()
@ -261,7 +104,10 @@ void CMainWindow::onProfiles()
{ {
CProfilesDialog dialog; CProfilesDialog dialog;
dialog.exec(); if (dialog.exec())
{
updateProfiles();
}
} }
void CMainWindow::onAbout() void CMainWindow::onAbout()
@ -270,7 +116,7 @@ void CMainWindow::onAbout()
QMessageBox::about(this, QMessageBox::about(this,
tr("About %1").arg("Ryzom Installer"), tr("About %1").arg("Ryzom Installer"),
QString("Ryzom Installer") + QApplication::applicationVersion() + br + QString("Ryzom Installer %1").arg(QApplication::applicationVersion()) + br +
tr("Program to install, download and manage Ryzom configurations.") + tr("Program to install, download and manage Ryzom configurations.") +
br+br+ br+br+
tr("Author: %1").arg("Cedric 'Kervala' OCHS") + br + tr("Author: %1").arg("Cedric 'Kervala' OCHS") + br +
@ -283,166 +129,20 @@ void CMainWindow::onAboutQt()
QMessageBox::aboutQt(this); QMessageBox::aboutQt(this);
} }
void CMainWindow::onDownloadPrepare()
{
progressBar->setFormat(tr("%p% (%v/%m KiB)"));
progressBar->setMinimum(0);
progressBar->setMaximum(0);
progressBar->setValue(0);
resumeButton->setVisible(false);
stopButton->setVisible(false);
}
void CMainWindow::onDownloadInit(qint64 current, qint64 total)
{
resumeButton->setVisible(true);
stopButton->setVisible(false);
progressBar->setMinimum(0);
progressBar->setMaximum(total / 1024);
progressBar->setValue(current / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->setMinimum(0);
m_button->progress()->setMaximum(total / 1024);
m_button->progress()->setValue(current / 1024);
#endif
}
void CMainWindow::onDownloadStart()
{
resumeButton->setVisible(false);
stopButton->setVisible(true);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->show();
#endif
}
void CMainWindow::onDownloadStop()
{
resumeButton->setVisible(true);
stopButton->setVisible(false);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->hide();
#endif
}
void CMainWindow::onDownloadProgress(qint64 current)
{
progressBar->setValue(current / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->setValue(current / 1024);
#endif
}
void CMainWindow::onDownloadSuccess(qint64 total)
{
progressBar->setValue(total / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->hide();
#endif
resumeButton->setVisible(false);
stopButton->setVisible(false);
}
void CMainWindow::onDownloadFail(const QString &error)
{
resumeButton->setVisible(true);
stopButton->setVisible(false);
}
void CMainWindow::onHtmlPageContent(const QString &html) void CMainWindow::onHtmlPageContent(const QString &html)
{ {
htmlTextEdit->setHtml(html); htmlTextEdit->setHtml(html);
} }
void CMainWindow::onExtractPrepare() void CMainWindow::onProfileChanged(int profileIndex)
{ {
progressBar->setFormat("%p%"); if (profileIndex < 0) return;
progressBar->setMinimum(0); CConfigFile *config = CConfigFile::getInstance();
progressBar->setMaximum(0);
progressBar->setValue(0);
resumeButton->setVisible(false); CProfile profile = config->getProfile(profileIndex);
stopButton->setVisible(false); CServer server = config->getServer(profile.server);
}
// load changelog
void CMainWindow::onExtractInit(qint64 current, qint64 total) m_downloader->getHtmlPageContent(config->expandVariables(server.displayUrl));
{
resumeButton->setVisible(true);
stopButton->setVisible(false);
progressBar->setMinimum(0);
progressBar->setMaximum(total / 1024);
progressBar->setValue(current / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->setMinimum(0);
m_button->progress()->setMaximum(total / 1024);
m_button->progress()->setValue(current / 1024);
#endif
}
void CMainWindow::onExtractStart()
{
resumeButton->setVisible(false);
stopButton->setVisible(true);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->show();
#endif
}
void CMainWindow::onExtractStop()
{
resumeButton->setVisible(true);
stopButton->setVisible(false);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->hide();
#endif
}
void CMainWindow::onExtractProgress(qint64 current, const QString &filename)
{
m_statusLabel->setText(tr("Extracting %1...").arg(filename));
progressBar->setValue(current / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->setValue(current / 1024);
#endif
}
void CMainWindow::onExtractSuccess(qint64 total)
{
m_statusLabel->setText(tr("Extraction done"));
progressBar->setValue(total / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->hide();
#endif
resumeButton->setVisible(false);
stopButton->setVisible(false);
}
void CMainWindow::onDone()
{
processNextStep();
}
void CMainWindow::onExtractFail(const QString &error)
{
resumeButton->setVisible(true);
stopButton->setVisible(false);
} }

View file

@ -38,9 +38,6 @@ public:
virtual ~CMainWindow(); virtual ~CMainWindow();
public slots: public slots:
void onResumeClicked();
void onStopClicked();
void onPlayClicked(); void onPlayClicked();
void onConfigureClicked(); void onConfigureClicked();
@ -48,40 +45,18 @@ public slots:
void onAbout(); void onAbout();
void onAboutQt(); void onAboutQt();
void onDownloadPrepare();
void onDownloadInit(qint64 current, qint64 total);
void onDownloadStart();
void onDownloadStop();
void onDownloadProgress(qint64 current);
void onDownloadSuccess(qint64 total);
void onDownloadFail(const QString &error);
void onHtmlPageContent(const QString &html); void onHtmlPageContent(const QString &html);
void onExtractPrepare(); void onProfileChanged(int index);
void onExtractInit(qint64 current, qint64 total);
void onExtractStart();
void onExtractStop();
void onExtractProgress(qint64 current, const QString &filename);
void onExtractSuccess(qint64 total);
void onExtractFail(const QString &error);
void onDone();
protected: protected:
void showEvent(QShowEvent *e); void showEvent(QShowEvent *e);
void closeEvent(QCloseEvent *e); void closeEvent(QCloseEvent *e);
void processNextStep(); void updateProfiles();
void displayProgressBar();
void hideProgressBar();
void displayConfigurationsChoices();
QWinTaskbarButton *m_button; QWinTaskbarButton *m_button;
CDownloader *m_downloader; CDownloader *m_downloader;
CArchive *m_archive;
QLabel *m_statusLabel; QLabel *m_statusLabel;
}; };

View file

@ -0,0 +1,431 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdpch.h"
#include "operationdialog.h"
#include "downloader.h"
#include "wizarddialog.h"
#include "profilesdialog.h"
#include "configfile.h"
#include "config.h"
#include "profilesmodel.h"
#include "filescopier.h"
#include "filesextractor.h"
#include "filescleaner.h"
#include "seven_zip.h"
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
#include <QtWinExtras/QWinTaskbarProgress>
#include <QtWinExtras/QWinTaskbarButton>
#endif
#ifdef DEBUG_NEW
#define new DEBUG_NEW
#endif
COperationDialog::COperationDialog():QDialog(), m_aborting(false)
{
setupUi(this);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button = new QWinTaskbarButton(this);
#endif
// connect(resumeButton, SIGNAL(clicked()), SLOT(onResumeClicked()));
// connect(stopButton, SIGNAL(clicked()), SLOT(onStopClicked()));
// downloader
m_downloader = new CDownloader(this);
connect(m_downloader, SIGNAL(downloadPrepare()), SLOT(onProgressPrepare()));
connect(m_downloader, SIGNAL(downloadInit(qint64, qint64)), SLOT(onProgressInit(qint64, qint64)));
connect(m_downloader, SIGNAL(downloadStart()), SLOT(onProgressStart()));
connect(m_downloader, SIGNAL(downloadStop()), SLOT(onProgressStop()));
connect(m_downloader, SIGNAL(downloadProgress(qint64)), SLOT(onProgressProgress(qint64)));
connect(m_downloader, SIGNAL(downloadSuccess(qint64)), SLOT(onProgressSuccess(qint64)));
connect(m_downloader, SIGNAL(downloadFail(QString)), SLOT(onProgressFail(QString)));
connect(operationButtonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(onAbortClicked()));
// operations
connect(this, SIGNAL(prepare()), SLOT(onProgressPrepare()));
connect(this, SIGNAL(init(qint64, qint64)), SLOT(onProgressInit(qint64, qint64)));
connect(this, SIGNAL(start()), SLOT(onProgressStart()));
connect(this, SIGNAL(stop()), SLOT(onProgressStop()));
connect(this, SIGNAL(progress(qint64, QString)), SLOT(onProgressProgress(qint64, QString)));
connect(this, SIGNAL(success(qint64)), SLOT(onProgressSuccess(qint64)));
connect(this, SIGNAL(fail(QString)), SLOT(onProgressFail(QString)));
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
}
COperationDialog::~COperationDialog()
{
}
void COperationDialog::processNextStep()
{
CConfigFile *config = CConfigFile::getInstance();
// default server
const CServer &server = config->getServer();
// default profile
const CProfile &configuration = config->getProfile();
switch(config->getNextStep())
{
case CConfigFile::DisplayNoServerError:
break;
case CConfigFile::ShowWizard:
break;
case CConfigFile::DownloadData:
m_downloader->prepareFile(config->expandVariables(server.dataDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.dataDownloadFilename) + ".part");
break;
case CConfigFile::ExtractDownloadedData:
// TODO
break;
case CConfigFile::DownloadClient:
m_downloader->prepareFile(config->expandVariables(server.clientDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.clientDownloadFilename) + ".part");
break;
case CConfigFile::ExtractDownloadedClient:
// TODO
break;
case CConfigFile::CopyServerFiles:
QtConcurrent::run(this, &COperationDialog::copyServerFiles);
break;
case CConfigFile::CopyProfileFiles:
QtConcurrent::run(this, &COperationDialog::copyProfileFiles);
break;
case CConfigFile::ExtractBnpClient:
QtConcurrent::run(this, &COperationDialog::extractBnpClient);
break;
case CConfigFile::CleanFiles:
QtConcurrent::run(this, &COperationDialog::cleanFiles);
break;
case CConfigFile::CreateProfile:
createDefaultProfile();
break;
case CConfigFile::CreateShortcuts:
createDefaultShortcuts();
break;
default:
// cases already managed in main.cpp
break;
}
m_downloader->getHtmlPageContent(config->expandVariables(server.displayUrl));
}
void COperationDialog::showEvent(QShowEvent *e)
{
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->setWindow(windowHandle());
#endif
e->accept();
processNextStep();
}
void COperationDialog::closeEvent(QCloseEvent *e)
{
if (e->spontaneous())
{
e->ignore();
onAbortClicked();
}
}
void COperationDialog::onAbortClicked()
{
if (m_downloader->isDownloading())
{
if (!m_downloader->supportsResume())
{
QMessageBox::StandardButton res = QMessageBox::question(this, tr("Confirmation"), tr("Warning, this server doesn't support resume! If you stop download now, you won't be able to resume it later.\nAre you sure to abort download?"));
if (res != QMessageBox::Yes) return;
}
}
QMutexLocker locker(&m_abortingMutex);
m_aborting = true;
}
void COperationDialog::onProgressPrepare()
{
operationProgressBar->setFormat(tr("%p% (%v/%m KiB)"));
operationProgressBar->setMinimum(0);
operationProgressBar->setMaximum(0);
operationProgressBar->setValue(0);
operationLabel->setText(m_currentOperation);
}
void COperationDialog::onProgressInit(qint64 current, qint64 total)
{
operationProgressBar->setMinimum(0);
operationProgressBar->setMaximum(total / 1024);
operationProgressBar->setValue(current / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->setMinimum(0);
m_button->progress()->setMaximum(total / 1024);
m_button->progress()->setValue(current / 1024);
#endif
}
void COperationDialog::onProgressStart()
{
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->show();
#endif
}
void COperationDialog::onProgressStop()
{
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->hide();
#endif
close();
}
void COperationDialog::onProgressProgress(qint64 current, const QString &filename)
{
operationProgressLabel->setText(m_currentOperationProgressFormat.arg(filename));
operationProgressBar->setValue(current / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->setValue(current / 1024);
#endif
}
void COperationDialog::onProgressSuccess(qint64 total)
{
operationProgressBar->setValue(total / 1024);
#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button->progress()->hide();
#endif
}
void COperationDialog::onProgressFail(const QString &error)
{
QMessageBox::critical(this, tr("Error"), error);
}
void COperationDialog::onDone()
{
processNextStep();
}
void COperationDialog::copyServerFiles()
{
CConfigFile *config = CConfigFile::getInstance();
// default server
const CServer &server = config->getServer();
// default profile
const CProfile &configuration = config->getProfile();
QStringList serverFiles;
serverFiles << "cfg";
serverFiles << "data";
serverFiles << "examples";
serverFiles << "patch";
serverFiles << "unpack";
serverFiles << "client_default.cfg";
m_currentOperation = QApplication::tr("Copying client files needed for server %1...").arg(server.name);
m_currentOperationProgressFormat = QApplication::tr("Copying %1...");
CFilesCopier copier(this);
copier.setSourceDirectory(config->getSrcServerDirectory());
copier.setDesinationDirectory(config->getInstallationDirectory() + "/" + server.id);
copier.setIncludeFilter(serverFiles);
if (copier.exec())
{
}
else
{
}
}
void COperationDialog::copyProfileFiles()
{
CConfigFile *config = CConfigFile::getInstance();
// default server
const CServer &server = config->getServer();
// default profile
const CProfile &profile = config->getProfile();
QStringList profileFiles;
profileFiles << "cache";
profileFiles << "save";
profileFiles << "user";
profileFiles << "screenshots";
profileFiles << "client.cfg";
profileFiles << "*.log";
CFilesCopier copier(this);
copier.setSourceDirectory(config->getSrcProfileDirectory());
copier.setDesinationDirectory(config->getProfileDirectory() + "/" + profile.id);
copier.setIncludeFilter(profileFiles);
if (copier.exec())
{
}
else
{
}
}
void COperationDialog::extractBnpClient()
{
CConfigFile *config = CConfigFile::getInstance();
// default server
const CServer &server = config->getServer();
// default profile
const CProfile &profile = config->getProfile();
CFilesExtractor extractor(this);
extractor.setSourceFile(config->getSrcServerClientBNPFullPath());
extractor.setDesinationDirectory(config->getInstallationDirectory() + "/" + server.id);
extractor.exec();
}
void COperationDialog::cleanFiles()
{
CConfigFile *config = CConfigFile::getInstance();
// default server
const CServer &server = config->getServer();
// default profile
const CProfile &profile = config->getProfile();
CFilesCleaner cleaner(this);
cleaner.setDirectory(config->getInstallationDirectory() + "/" + server.id);
cleaner.exec();
}
void COperationDialog::operationPrepare()
{
emit prepare();
}
void COperationDialog::operationInit(qint64 current, qint64 total)
{
emit init(current, total);
}
void COperationDialog::operationStart()
{
emit start();
}
void COperationDialog::operationStop()
{
emit stop();
}
void COperationDialog::operationProgress(qint64 current, const QString &filename)
{
emit progress(current, filename);
}
void COperationDialog::operationSuccess(qint64 total)
{
emit success(total);
}
void COperationDialog::operationFail(const QString &error)
{
emit fail(error);
}
void COperationDialog::operationFinish()
{
emit done();
}
bool COperationDialog::operationShouldStop()
{
QMutexLocker locker(&m_abortingMutex);
return m_aborting;
}
bool COperationDialog::createDefaultProfile()
{
CConfigFile *config = CConfigFile::getInstance();
CServer server = config->getServer(config->getDefaultServerIndex());
CProfile profile;
profile.id = 0;
profile.executable = config->getClientFullPath();
profile.name = QString("Ryzom (%1)").arg(server.name);
profile.server = server.id;
profile.comments = "Default profile created by Ryzom Installer";
#ifdef Q_OS_WIN32
profile.desktopShortcut = QFile::exists(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/Ryzom.lnk");
#endif
// TODO
// profile.menuShortcut
config->addProfile(profile);
config->save();
onDone();
return true;
}
bool COperationDialog::createDefaultShortcuts()
{
onDone();
return true;
}

View file

@ -0,0 +1,114 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef OPERATIONDIALOG_H
#define OPERATIONDIALOG_H
#include "ui_operationdialog.h"
#include "operation.h"
class QWinTaskbarButton;
class CDownloader;
class CArchive;
/**
* Main window
*
* \author Cedric 'Kervala' OCHS
* \date 2016
*/
class COperationDialog : public QDialog, public Ui::OperationDialog, public IOperationProgressListener
{
Q_OBJECT
public:
COperationDialog();
virtual ~COperationDialog();
public slots:
void onAbortClicked();
void onProgressPrepare();
void onProgressInit(qint64 current, qint64 total);
void onProgressStart();
void onProgressStop();
void onProgressProgress(qint64 current, const QString &filename);
void onProgressSuccess(qint64 total);
void onProgressFail(const QString &error);
void onDone();
signals:
// emitted when requesting real URL
void prepare();
// emitted when we got the initial (local) and total (remote) size of file
void init(qint64 current, qint64 total);
// emitted when we begin to download
void start();
// emitted when the download stopped
void stop();
// emitted when extracting
void progress(qint64 current, const QString &filename);
// emitted when the whole file is downloaded
void success(qint64 total);
// emitted when an error occurs
void fail(const QString &error);
// emitted when done and should process next step
void done();
protected:
void showEvent(QShowEvent *e);
void closeEvent(QCloseEvent *e);
void processNextStep();
// operations
void copyServerFiles();
void copyProfileFiles();
void extractBnpClient();
void cleanFiles();
bool createDefaultProfile();
bool createDefaultShortcuts();
// from CFilesCopier
virtual void operationPrepare();
virtual void operationInit(qint64 current, qint64 total);
virtual void operationStart();
virtual void operationStop();
virtual void operationProgress(qint64 current, const QString &filename);
virtual void operationSuccess(qint64 total);
virtual void operationFail(const QString &error);
virtual void operationFinish();
virtual bool operationShouldStop();
QWinTaskbarButton *m_button;
CDownloader *m_downloader;
QString m_currentOperation;
QString m_currentOperationProgressFormat;
QMutex m_abortingMutex;
bool m_aborting;
};
#endif

View file

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>627</width> <width>627</width>
<height>539</height> <height>479</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -43,60 +43,6 @@ p, li { white-space: pre-wrap; }
</item> </item>
</layout> </layout>
</item> </item>
<item>
<widget class="QFrame" name="downloadFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="downloadLayout" stretch="1,0,0">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QProgressBar" name="progressBar">
<property name="maximum">
<number>0</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="format">
<string>%p%</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="resumeButton">
<property name="text">
<string>Resume</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="stopButton">
<property name="text">
<string>Stop</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QFrame" name="configurationFrame"> <widget class="QFrame" name="configurationFrame">
<property name="frameShape"> <property name="frameShape">

View file

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>OperationDialog</class>
<widget class="QDialog" name="OperationDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>106</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="operationLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="operationProgressLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="operationProgressBar">
<property name="value">
<number>24</number>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="operationButtonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Abort</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>