diff --git a/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp b/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp index 7b3952a22..f23976cd9 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp @@ -27,7 +27,8 @@ CConfigFile *CConfigFile::s_instance = NULL; CConfigFile::CConfigFile(QObject *parent):QObject(parent), m_version(-1), - m_defaultServerIndex(0), m_defaultProfileIndex(0), m_use64BitsClient(false), m_shouldUninstallOldClient(true) + m_defaultServerIndex(0), m_defaultProfileIndex(0), m_use64BitsClient(false), m_shouldUninstallOldClient(true), + m_uninstallingOldClient(false) { s_instance = this; @@ -461,6 +462,16 @@ void CConfigFile::setShouldUninstallOldClient(bool on) m_shouldUninstallOldClient = on; } +bool CConfigFile::uninstallingOldClient() const +{ + return m_uninstallingOldClient; +} + +void CConfigFile::setUninstallingOldClient(bool on) +{ + m_uninstallingOldClient = on; +} + QString CConfigFile::expandVariables(const QString &str) const { QString res = str; @@ -972,7 +983,7 @@ OperationStep CConfigFile::getInstallNextStep() const if (!settings.contains("InstallLocation")) return CreateAddRemoveEntry; #endif - if (m_shouldUninstallOldClient && !getSrcServerDirectory().isEmpty() && QFile::exists(getSrcServerDirectory() + "/Uninstall.exe")) + if (!m_uninstallingOldClient && m_shouldUninstallOldClient && !getSrcServerDirectory().isEmpty() && QFile::exists(getSrcServerDirectory() + "/Uninstall.exe")) { return UninstallOldClient; } diff --git a/code/ryzom/tools/client/ryzom_installer/src/configfile.h b/code/ryzom/tools/client/ryzom_installer/src/configfile.h index b2a4ae7e5..5c2a4dacc 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/configfile.h +++ b/code/ryzom/tools/client/ryzom_installer/src/configfile.h @@ -109,6 +109,9 @@ public: bool shouldUninstallOldClient() const; void setShouldUninstallOldClient(bool on); + bool uninstallingOldClient() const; + void setUninstallingOldClient(bool on); + QString expandVariables(const QString &str) const; QString getClientArch() const; @@ -147,6 +150,7 @@ private: QString m_srcDirectory; bool m_use64BitsClient; bool m_shouldUninstallOldClient; + bool m_uninstallingOldClient; QString m_language; QString m_defaultConfigPath; diff --git a/code/ryzom/tools/client/ryzom_installer/src/main.cpp b/code/ryzom/tools/client/ryzom_installer/src/main.cpp index 6a9662c4f..3d7ee1d1c 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/main.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/main.cpp @@ -86,6 +86,11 @@ int main(int argc, char *argv[]) _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif +#ifdef Q_OS_WIN + // to fix the bug with QFileDialog::getExistingDirectory hanging under Windows + CoInitialize(NULL); +#endif + NLMISC::CApplicationContext appContext; QApplication app(argc, argv); @@ -218,8 +223,10 @@ int main(int argc, char *argv[]) if (step == Done) { +#if defined(Q_OS_WIN) && !defined(_DEBUG) // restart Installer, so it could be copied in TEMP and allowed to update itself if (QProcess::startDetached(QApplication::applicationFilePath(), QApplication::arguments())) return 0; +#endif } } diff --git a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp index 55aa3b5bc..0f196a787 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp @@ -41,6 +41,11 @@ CMainWindow::CMainWindow():QMainWindow() connect(m_downloader, SIGNAL(htmlPageContent(QString)), SLOT(onHtmlPageContent(QString))); connect(actionProfiles, SIGNAL(triggered()), SLOT(onProfiles())); + + // remove debug options + actionSettings->setVisible(false); + actionUninstall->setVisible(false); + connect(actionSettings, SIGNAL(triggered()), SLOT(onSettings())); connect(actionUninstall, SIGNAL(triggered()), SLOT(onUninstall())); connect(actionQuit, SIGNAL(triggered()), SLOT(onQuit())); @@ -60,6 +65,7 @@ CMainWindow::CMainWindow():QMainWindow() setFixedHeight(height()); updateProfiles(); + updateButtons(); } CMainWindow::~CMainWindow() @@ -83,6 +89,28 @@ void CMainWindow::updateProfiles() profilesComboBox->setModel(new CProfilesModel(this)); } +void CMainWindow::updateButtons() +{ + int profileIndex = profilesComboBox->currentIndex(); + + if (profileIndex < 0) return; + + CConfigFile *config = CConfigFile::getInstance(); + + const CProfile &profile = config->getProfile(profileIndex); + const CServer &server = config->getServer(profile.server); + + // get full path of client executable + QString executable = profile.getClientFullPath(); + + playButton->setEnabled(!executable.isEmpty() && QFile::exists(executable)); + + // get full path of configuration executable + executable = server.getConfigurationFullPath(); + + configureButton->setEnabled(!executable.isEmpty() && QFile::exists(executable)); +} + void CMainWindow::onPlayClicked() { int profileIndex = profilesComboBox->currentIndex(); @@ -123,6 +151,7 @@ void CMainWindow::onConfigureClicked() const CProfile &profile = config->getProfile(profileIndex); const CServer &server = config->getServer(profile.server); + // get full path of configuration executable QString executable = server.getConfigurationFullPath(); if (executable.isEmpty() || !QFile::exists(executable)) return; @@ -262,4 +291,6 @@ void CMainWindow::onProfileChanged(int profileIndex) // load changelog m_downloader->getHtmlPageContent(config->expandVariables(server.displayUrl)); + + updateButtons(); } diff --git a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.h b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.h index 0f7d88138..7449b2039 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.h +++ b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.h @@ -61,6 +61,7 @@ protected: void closeEvent(QCloseEvent *e); void updateProfiles(); + void updateButtons(); QWinTaskbarButton *m_button; CDownloader *m_downloader; diff --git a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp index da7a2f52d..5f3215e31 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp @@ -92,7 +92,7 @@ void COperationDialog::processNextStep() { if (operationShouldStop()) { - reject(); + rejectDelayed(); return; } @@ -184,7 +184,7 @@ void COperationDialog::processInstallNextStep() break; case Done: - accept(); + acceptDelayed(); break; default: @@ -253,6 +253,8 @@ void COperationDialog::updateAddRemoveComponents() void COperationDialog::processUpdateProfilesNextStep() { + m_currentOperation = tr("Update profiles"); + // for "update profiles" operations, we set installer to false when components are updated, // since we're not using this variable if (m_addComponents.installer && m_removeComponents.installer) @@ -344,6 +346,8 @@ void COperationDialog::processUpdateProfilesNextStep() } updateAddRemoveEntry(); + + acceptDelayed(); } void COperationDialog::processUninstallNextStep() @@ -369,7 +373,7 @@ void COperationDialog::processUninstallNextStep() else { // done - accept(); + acceptDelayed(); } } @@ -460,7 +464,7 @@ void COperationDialog::onProgressStop() m_button->progress()->hide(); #endif - reject(); + rejectDelayed(); } void COperationDialog::onProgressProgress(qint64 current, const QString &filename) @@ -789,9 +793,14 @@ void COperationDialog::uninstallOldClient() if (button == QMessageBox::Yes) { + // remember the choice CConfigFile::getInstance()->setShouldUninstallOldClient(true); + // launch old uninstaller QDesktopServices::openUrl(QUrl::fromLocalFile(uninstaller)); + + // to not ask twice + CConfigFile::getInstance()->setUninstallingOldClient(true); } else { @@ -1247,3 +1256,15 @@ void COperationDialog::renamePartFile() QFile::rename(partFile, finalFile); } } + +void COperationDialog::acceptDelayed() +{ + // wait 500ms before to call accept() + QTimer::singleShot(500, this, SLOT(accept())); +} + +void COperationDialog::rejectDelayed() +{ + // wait 500ms before to call reject() + QTimer::singleShot(500, this, SLOT(reject())); +} diff --git a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h index e9966c4d2..d2172815c 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h +++ b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h @@ -133,6 +133,10 @@ protected: void renamePartFile(); + // hacks to prevent an infinite loop + void acceptDelayed(); + void rejectDelayed(); + QWinTaskbarButton *m_button; CDownloader *m_downloader;