From 482865ca74b9ca40b8f75138db8d577bfd561923 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 29 May 2016 20:27:26 +0200 Subject: [PATCH] Added: Uninstall Wizard Dialog used in Add/Remove programs under Windows --- .../src/uninstallwizarddialog.cpp | 217 ++++++++++++++++++ .../src/uninstallwizarddialog.h | 56 +++++ .../ryzom_installer/ui/uninstallwizard.ui | 127 ++++++++++ 3 files changed, 400 insertions(+) create mode 100644 code/ryzom/tools/client/ryzom_installer/src/uninstallwizarddialog.cpp create mode 100644 code/ryzom/tools/client/ryzom_installer/src/uninstallwizarddialog.h create mode 100644 code/ryzom/tools/client/ryzom_installer/ui/uninstallwizard.ui diff --git a/code/ryzom/tools/client/ryzom_installer/src/uninstallwizarddialog.cpp b/code/ryzom/tools/client/ryzom_installer/src/uninstallwizarddialog.cpp new file mode 100644 index 000000000..7c5bdfab0 --- /dev/null +++ b/code/ryzom/tools/client/ryzom_installer/src/uninstallwizarddialog.cpp @@ -0,0 +1,217 @@ +// 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 "uninstallwizarddialog.h" +#include "configfile.h" +#include "utils.h" + +#include "nel/misc/system_info.h" +#include "nel/misc/common.h" + +#ifdef DEBUG_NEW + #define new DEBUG_NEW +#endif + +CUninstallWizardDialog::CUninstallWizardDialog(QWidget *parent):QDialog(parent), m_installerIndex(-1) +{ + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + setupUi(this); + + CConfigFile *config = CConfigFile::getInstance(); + + int serverCount = config->getServersCount(); + + QStandardItemModel *model = new QStandardItemModel(0, 2, this); + + QStringList columns; + columns << tr("Component"); + columns << tr("Size"); + + model->setHorizontalHeaderLabels(columns); + + // clients + for (int row = 0; row < serverCount; ++row) + { + const CServer &server = config->getServer(row); + + if (QFile::exists(config->getInstallationDirectory() + "/" + server.id)) + { + m_serversIndices[row] = model->rowCount(); + + QStandardItem *item = new QStandardItem(tr("Client for %1").arg(server.name)); + item->setCheckable(true); + item->setCheckState(Qt::Checked); + model->appendRow(item); + } + } + + int profilesCount = config->getProfilesCount(); + + // profiles + for (int row = 0; row < profilesCount; ++row) + { + m_profilesIndices[row] = model->rowCount(); + + const CProfile &profile = config->getProfile(row); + + QStandardItem *item = new QStandardItem(tr("Profile #%1: %2").arg(profile.id).arg(profile.name)); + item->setCheckable(true); + model->appendRow(item); + + } + + m_installerIndex = model->rowCount(); + + QStandardItem *item = new QStandardItem(tr("Ryzom Installer")); + item->setCheckable(true); + item->setCheckState(Qt::Checked); + model->appendRow(item); + + componentsTreeView->setModel(model); + componentsTreeView->resizeColumnToContents(0); + + connect(uninstallButton, SIGNAL(clicked()), SLOT(accept())); + connect(quitButton, SIGNAL(clicked()), SLOT(reject())); + connect(model, SIGNAL(itemChanged(QStandardItem *)), SLOT(onItemChanged(QStandardItem *))); + + adjustSize(); + + QtConcurrent::run(this, &CUninstallWizardDialog::updateSizes); + + updateButtons(); +} + +CUninstallWizardDialog::~CUninstallWizardDialog() +{ +} + +QVector CUninstallWizardDialog::getSelectedServers() const +{ + QVector res; + + QStandardItemModel *model = qobject_cast(componentsTreeView->model()); + if (model == NULL) return res; + + QMap::const_iterator it = m_serversIndices.begin(), iend = m_serversIndices.end(); + + while (it != iend) + { + QStandardItem *item = model->item(m_installerIndex); + + if (item && item->checkState() == Qt::Checked) res << it.value(); + + ++it; + } + + return res; +} + +QVector CUninstallWizardDialog::getSelectedProfiles() const +{ + QVector res; + + QStandardItemModel *model = qobject_cast(componentsTreeView->model()); + if (model == NULL) return res; + + QMap::const_iterator it = m_profilesIndices.begin(), iend = m_profilesIndices.end(); + + while (it != iend) + { + QStandardItem *item = model->item(m_installerIndex); + + if (item && item->checkState() == Qt::Checked) res << it.value(); + + ++it; + } + + return res; +} + +bool CUninstallWizardDialog::isInstallerSelected() const +{ + QStandardItemModel *model = qobject_cast(componentsTreeView->model()); + if (model == NULL) return false; + + QStandardItem *item = model->item(m_installerIndex); + + return item && item->checkState() == Qt::Checked; +} + +void CUninstallWizardDialog::accept() +{ + QDialog::accept(); +} + +void CUninstallWizardDialog::onItemChanged(QStandardItem * /* item */) +{ + updateButtons(); +} + +void CUninstallWizardDialog::updateSizes() +{ + QStandardItemModel *model = qobject_cast(componentsTreeView->model()); + + CConfigFile *config = CConfigFile::getInstance(); + + // clients + QMap::const_iterator it = m_serversIndices.begin(), iend = m_serversIndices.end(); + + while(it != iend) + { + const CServer &server = config->getServer(it.key()); + + qint64 bytes = getDirectorySize(config->getInstallationDirectory() + "/" + server.id); + + QStandardItem *item = new QStandardItem(qBytesToHumanReadable(bytes)); + model->setItem(it.value(), 1, item); + + ++it; + } + + // profiles + it = m_profilesIndices.begin(), iend = m_profilesIndices.end(); + + while (it != iend) + { + const CProfile &profile = config->getProfile(it.key()); + + qint64 bytes = getDirectorySize(config->getProfileDirectory() + "/" + profile.id); + + QStandardItem *item = new QStandardItem(qBytesToHumanReadable(bytes)); + model->setItem(it.value(), 1, item); + + ++it; + } + + componentsTreeView->resizeColumnToContents(1); +} + +void CUninstallWizardDialog::updateButtons() +{ + QStandardItemModel *model = qobject_cast(componentsTreeView->model()); + + int checkedCount = 0; + + // Uninstall button should be enabled only if at least one component is selected + for (int i = 0; i < model->rowCount(); ++i) + { + if (model->item(i)->checkState() == Qt::Checked) ++checkedCount; + } + + uninstallButton->setEnabled(checkedCount > 0); +} diff --git a/code/ryzom/tools/client/ryzom_installer/src/uninstallwizarddialog.h b/code/ryzom/tools/client/ryzom_installer/src/uninstallwizarddialog.h new file mode 100644 index 000000000..c5f911b33 --- /dev/null +++ b/code/ryzom/tools/client/ryzom_installer/src/uninstallwizarddialog.h @@ -0,0 +1,56 @@ +// 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 UNINSTALLWIZARDDIALOG_H +#define UNINSTALLWIZARDDIALOG_H + +#include "ui_uninstallwizard.h" + +/** + * Wizard displayed at first launch, that asks user to choose source and destination directories. + * + * \author Cedric 'Kervala' OCHS + * \date 2016 + */ +class CUninstallWizardDialog : public QDialog, public Ui::UninstallWizardDialog +{ + Q_OBJECT + +public: + CUninstallWizardDialog(QWidget *parent = NULL); + virtual ~CUninstallWizardDialog(); + + QVector getSelectedServers() const; + QVector getSelectedProfiles() const; + + bool isInstallerSelected() const; + +private slots: + void accept(); + void onItemChanged(QStandardItem *item); + +private: + void updateSizes(); + void updateButtons(); + + // key is original ID, value is row index + QMap m_serversIndices; + QMap m_profilesIndices; + + int m_installerIndex; +}; + +#endif diff --git a/code/ryzom/tools/client/ryzom_installer/ui/uninstallwizard.ui b/code/ryzom/tools/client/ryzom_installer/ui/uninstallwizard.ui new file mode 100644 index 000000000..b8c0ee298 --- /dev/null +++ b/code/ryzom/tools/client/ryzom_installer/ui/uninstallwizard.ui @@ -0,0 +1,127 @@ + + + UninstallWizardDialog + + + Qt::ApplicationModal + + + + 0 + 0 + 415 + 365 + + + + Ryzom Installer + + + true + + + + + + + + :/images/background.png + + + + + + + + + You're about to uninstall some or all components of Ryzom. Please check each component you want to remove (warning, it can't be reverted). + + + Qt::PlainText + + + Qt::AlignJustify|Qt::AlignTop + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Components to remove + + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::NoSelection + + + false + + + true + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Uninstall + + + + + + + Quit + + + + + + + + + + + +