Added: Uninstall Wizard Dialog used in Add/Remove programs under Windows

This commit is contained in:
kervala 2016-05-29 20:27:26 +02:00
parent 05e5a7ea33
commit daf19fe497
3 changed files with 400 additions and 0 deletions

View file

@ -0,0 +1,217 @@
// 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 "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<int> CUninstallWizardDialog::getSelectedServers() const
{
QVector<int> res;
QStandardItemModel *model = qobject_cast<QStandardItemModel*>(componentsTreeView->model());
if (model == NULL) return res;
QMap<int, int>::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<int> CUninstallWizardDialog::getSelectedProfiles() const
{
QVector<int> res;
QStandardItemModel *model = qobject_cast<QStandardItemModel*>(componentsTreeView->model());
if (model == NULL) return res;
QMap<int, int>::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<QStandardItemModel*>(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<QStandardItemModel*>(componentsTreeView->model());
CConfigFile *config = CConfigFile::getInstance();
// clients
QMap<int, int>::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<QStandardItemModel*>(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);
}

View file

@ -0,0 +1,56 @@
// 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 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<int> getSelectedServers() const;
QVector<int> 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<int, int> m_serversIndices;
QMap<int, int> m_profilesIndices;
int m_installerIndex;
};
#endif

View file

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>UninstallWizardDialog</class>
<widget class="QDialog" name="UninstallWizardDialog">
<property name="windowModality">
<enum>Qt::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>415</width>
<height>365</height>
</rect>
</property>
<property name="windowTitle">
<string>Ryzom Installer</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="dialogLayout">
<item>
<layout class="QHBoxLayout" name="mainLayout">
<item>
<widget class="QLabel" name="headerBitmap">
<property name="pixmap">
<pixmap resource="../res/resources.qrc">:/images/background.png</pixmap>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="contentLayout" stretch="0,0,0,0">
<item>
<widget class="QLabel" name="messageLabel">
<property name="text">
<string>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).</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="alignment">
<set>Qt::AlignJustify|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="componentsSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="componentsLabel">
<property name="text">
<string>Components to remove</string>
</property>
</widget>
</item>
<item>
<widget class="QTreeView" name="componentsTreeView">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="buttonsLayout" stretch="1,0,0">
<item>
<spacer name="buttonsSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="uninstallButton">
<property name="text">
<string>Uninstall</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="quitButton">
<property name="text">
<string>Quit</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources>
<include location="../res/resources.qrc"/>
</resources>
<connections/>
</ui>