From 56e220a050f9dd83853ca38ed57dfc8a0e8c96f0 Mon Sep 17 00:00:00 2001 From: kervala Date: Mon, 16 May 2016 11:11:40 +0200 Subject: [PATCH] Changed: New COperationDialog that manager progress bar in a dialog --HG-- branch : develop --- .../tools/client/ryzom_installer/src/main.cpp | 24 +- .../client/ryzom_installer/src/mainwindow.cpp | 342 +------------- .../client/ryzom_installer/src/mainwindow.h | 29 +- .../ryzom_installer/src/operationdialog.cpp | 431 ++++++++++++++++++ .../ryzom_installer/src/operationdialog.h | 114 +++++ .../client/ryzom_installer/ui/mainwindow.ui | 56 +-- .../ryzom_installer/ui/operationdialog.ui | 52 +++ 7 files changed, 642 insertions(+), 406 deletions(-) create mode 100644 code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp create mode 100644 code/ryzom/tools/client/ryzom_installer/src/operationdialog.h create mode 100644 code/ryzom/tools/client/ryzom_installer/ui/operationdialog.ui diff --git a/code/ryzom/tools/client/ryzom_installer/src/main.cpp b/code/ryzom/tools/client/ryzom_installer/src/main.cpp index d4ee9926e..fe837335c 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/main.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/main.cpp @@ -18,6 +18,7 @@ #include "mainwindow.h" #include "configfile.h" #include "wizarddialog.h" +#include "operationdialog.h" #include "nel/misc/path.h" #include "nel/misc/ucstring.h" @@ -98,10 +99,27 @@ int main(int argc, char *argv[]) if (displayMainWindow) { - CMainWindow mainWindow; - mainWindow.show(); + step = config.getNextStep(); - 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; diff --git a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp index f8d6b6ed6..0ead4615e 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp @@ -17,59 +17,25 @@ #include "stdpch.h" #include "mainwindow.h" #include "downloader.h" -#include "archive.h" #include "wizarddialog.h" #include "profilesdialog.h" #include "configfile.h" #include "config.h" #include "profilesmodel.h" -#include "seven_zip.h" - -#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) -#include -#include -#endif - #ifdef DEBUG_NEW #define new DEBUG_NEW #endif -CMainWindow::CMainWindow():QMainWindow(), m_archive(NULL), m_statusLabel(NULL) +CMainWindow::CMainWindow():QMainWindow(), m_statusLabel(NULL) { 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(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))); - // 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(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(actionAbout, SIGNAL(triggered()), SLOT(onAbout())); + connect(profilesComboBox, SIGNAL(currentIndexChanged(int)), SLOT(onProfileChanged(int))); + m_statusLabel = new QLabel(); statusBar()->addWidget(m_statusLabel); + updateProfiles(); + // 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) { -#if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) - m_button->setWindow(windowHandle()); -#endif - e->accept(); - - processNextStep(); } void CMainWindow::closeEvent(QCloseEvent *e) @@ -211,28 +71,9 @@ void CMainWindow::closeEvent(QCloseEvent *e) e->accept(); } -void CMainWindow::onResumeClicked() +void CMainWindow::updateProfiles() { - m_downloader->getFile(); -} - -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(); - } + profilesComboBox->setModel(new CProfilesModel(this)); } void CMainWindow::onPlayClicked() @@ -251,6 +92,8 @@ void CMainWindow::onPlayClicked() arguments << profile.arguments; bool started = QProcess::startDetached(profile.executable, arguments); + + CConfigFile::getInstance()->setDefaultProfileIndex(profileIndex); } void CMainWindow::onConfigureClicked() @@ -261,7 +104,10 @@ void CMainWindow::onProfiles() { CProfilesDialog dialog; - dialog.exec(); + if (dialog.exec()) + { + updateProfiles(); + } } void CMainWindow::onAbout() @@ -270,7 +116,7 @@ void CMainWindow::onAbout() QMessageBox::about(this, 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.") + br+br+ tr("Author: %1").arg("Cedric 'Kervala' OCHS") + br + @@ -283,166 +129,20 @@ void CMainWindow::onAboutQt() 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) { htmlTextEdit->setHtml(html); } -void CMainWindow::onExtractPrepare() +void CMainWindow::onProfileChanged(int profileIndex) { - progressBar->setFormat("%p%"); - - progressBar->setMinimum(0); - progressBar->setMaximum(0); - progressBar->setValue(0); - - resumeButton->setVisible(false); - stopButton->setVisible(false); -} - -void CMainWindow::onExtractInit(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::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 + if (profileIndex < 0) return; - resumeButton->setVisible(false); - stopButton->setVisible(false); -} + CConfigFile *config = CConfigFile::getInstance(); -void CMainWindow::onDone() -{ - processNextStep(); -} + CProfile profile = config->getProfile(profileIndex); + CServer server = config->getServer(profile.server); -void CMainWindow::onExtractFail(const QString &error) -{ - resumeButton->setVisible(true); - stopButton->setVisible(false); + // load changelog + m_downloader->getHtmlPageContent(config->expandVariables(server.displayUrl)); } diff --git a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.h b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.h index aa2be5659..89ff52313 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.h +++ b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.h @@ -38,9 +38,6 @@ public: virtual ~CMainWindow(); public slots: - void onResumeClicked(); - void onStopClicked(); - void onPlayClicked(); void onConfigureClicked(); @@ -48,40 +45,18 @@ public slots: void onAbout(); 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 onExtractPrepare(); - 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(); + void onProfileChanged(int index); protected: void showEvent(QShowEvent *e); void closeEvent(QCloseEvent *e); - void processNextStep(); - - void displayProgressBar(); - void hideProgressBar(); - - void displayConfigurationsChoices(); + void updateProfiles(); QWinTaskbarButton *m_button; CDownloader *m_downloader; - CArchive *m_archive; QLabel *m_statusLabel; }; diff --git a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp new file mode 100644 index 000000000..88656a68a --- /dev/null +++ b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp @@ -0,0 +1,431 @@ +// Ryzom - MMORPG Framework +// 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 . + +#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 +#include +#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; +} diff --git a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h new file mode 100644 index 000000000..b4004988b --- /dev/null +++ b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h @@ -0,0 +1,114 @@ +// Ryzom - MMORPG Framework +// 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 . + +#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 diff --git a/code/ryzom/tools/client/ryzom_installer/ui/mainwindow.ui b/code/ryzom/tools/client/ryzom_installer/ui/mainwindow.ui index 644a3a2c2..8ed606d37 100644 --- a/code/ryzom/tools/client/ryzom_installer/ui/mainwindow.ui +++ b/code/ryzom/tools/client/ryzom_installer/ui/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 627 - 539 + 479 @@ -43,60 +43,6 @@ p, li { white-space: pre-wrap; } - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - 0 - - - Qt::AlignCenter - - - %p% - - - - - - - Resume - - - - - - - Stop - - - - - - diff --git a/code/ryzom/tools/client/ryzom_installer/ui/operationdialog.ui b/code/ryzom/tools/client/ryzom_installer/ui/operationdialog.ui new file mode 100644 index 000000000..104cdd200 --- /dev/null +++ b/code/ryzom/tools/client/ryzom_installer/ui/operationdialog.ui @@ -0,0 +1,52 @@ + + + OperationDialog + + + + 0 + 0 + 400 + 106 + + + + Dialog + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + 24 + + + Qt::AlignCenter + + + + + + + QDialogButtonBox::Abort + + + + + + + +