// 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); QStandardItem *item = NULL; // 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(); item = new QStandardItem(tr("Client for %1").arg(server.name)); item->setCheckable(true); 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); item = new QStandardItem(tr("Profile #%1: %2").arg(profile.id).arg(profile.name)); item->setCheckable(true); model->appendRow(item); } // installer m_installerIndex = model->rowCount(); item = new QStandardItem(tr("Ryzom Installer")); item->setCheckable(true); model->appendRow(item); componentsTreeView->setModel(model); componentsTreeView->resizeColumnToContents(0); // resize layout depending on content and constraints adjustSize(); // click signals connect(uninstallButton, SIGNAL(clicked()), SLOT(accept())); connect(quitButton, SIGNAL(clicked()), SLOT(reject())); connect(model, SIGNAL(itemChanged(QStandardItem *)), SLOT(onItemChanged(QStandardItem *))); // semi-hack to not update UI on another thread connect(this, SIGNAL(updateSize(int, QString)), SLOT(onUpdateSize(int, QString))); connect(this, SIGNAL(updateLayout()), SLOT(onUpdateLayout())); } CUninstallWizardDialog::~CUninstallWizardDialog() { } void CUninstallWizardDialog::showEvent(QShowEvent *event) { QDialog::showEvent(event); // update size of all components sizes in a thread to not block interface QtConcurrent::run(this, &CUninstallWizardDialog::updateSizes); } void CUninstallWizardDialog::setSelectedComponents(const SUninstallComponents &components) { QStandardItemModel *model = qobject_cast(componentsTreeView->model()); if (model == NULL) return; QStandardItem *item = NULL; // servers QMap::const_iterator it = m_serversIndices.begin(), iend = m_serversIndices.end(); while (it != iend) { item = model->item(it.value()); if (item) item->setCheckState(components.servers.indexOf(it.key()) > -1 ? Qt::Checked : Qt::Unchecked); ++it; } // profiles it = m_profilesIndices.begin(), iend = m_profilesIndices.end(); while (it != iend) { item = model->item(it.value()); if (item) item->setCheckState(components.profiles.indexOf(it.key()) > -1 ? Qt::Checked : Qt::Unchecked); ++it; } // installer item = model->item(m_installerIndex); if (item) item->setCheckState(components.installer ? Qt::Checked : Qt::Unchecked); } SUninstallComponents CUninstallWizardDialog::getSelectedCompenents() const { SUninstallComponents res; QStandardItemModel *model = qobject_cast(componentsTreeView->model()); if (model == NULL) return res; QStandardItem *item = NULL; // servers QMap::const_iterator it = m_serversIndices.begin(), iend = m_serversIndices.end(); while (it != iend) { item = model->item(it.value()); if (item && item->checkState() == Qt::Checked) res.servers << it.key(); ++it; } // profiles it = m_profilesIndices.begin(), iend = m_profilesIndices.end(); while (it != iend) { item = model->item(it.value()); if (item && item->checkState() == Qt::Checked) res.profiles << it.key(); ++it; } // installer item = model->item(m_installerIndex); res.installer = item && item->checkState() == Qt::Checked; return res; } void CUninstallWizardDialog::accept() { QDialog::accept(); } void CUninstallWizardDialog::onItemChanged(QStandardItem * /* item */) { updateButtons(); } void CUninstallWizardDialog::onUpdateSize(int row, const QString &text) { QStandardItemModel *model = qobject_cast(componentsTreeView->model()); if (model == NULL) return; // set size for a component QStandardItem *item = new QStandardItem(text); model->setItem(row, 1, item); } void CUninstallWizardDialog::onUpdateLayout() { componentsTreeView->resizeColumnToContents(1); updateButtons(); adjustSize(); } void CUninstallWizardDialog::updateSizes() { 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); emit updateSize(it.value(), qBytesToHumanReadable(bytes)); ++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); emit updateSize(it.value(), qBytesToHumanReadable(bytes)); ++it; } emit updateLayout(); } void CUninstallWizardDialog::updateButtons() { QStandardItemModel *model = qobject_cast(componentsTreeView->model()); int checkedCount = 0; for (int i = 0; i < model->rowCount(); ++i) { if (model->item(i)->checkState() == Qt::Checked) ++checkedCount; } // Uninstall button should be enabled only if at least one component is checked uninstallButton->setEnabled(checkedCount > 0); }