diff options
author | kh1 <karsten.heimrich@digia.com> | 2014-04-10 12:54:59 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@digia.com> | 2014-04-26 09:50:14 +0200 |
commit | 5135dcbf0ac23a52ceb2b4d1463eb2fd20b09346 (patch) | |
tree | f4515e2fbbdcdb3855f7b0cdf0a65b5995fbc555 /src/libs | |
parent | 56e326946159407a13eda62e894e11be5a824a4c (diff) |
Merge IntroductionPage and IntroductionPageImpl.
Change-Id: Ib8a08779979ccde42dab8a1bd83b27a24f318de0
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/installer/packagemanagergui.cpp | 313 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.h | 44 |
2 files changed, 345 insertions, 12 deletions
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index f31ade6aa..30e1a51d5 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -51,6 +51,7 @@ #include "settings.h" #include "utils.h" #include "scriptengine.h" +#include "productkeycheck.h" #include "kdsysinfo.h" @@ -70,6 +71,7 @@ #include <QListWidget> #include <QListWidgetItem> #include <QMessageBox> +#include <QProgressBar> #include <QPushButton> #include <QRadioButton> #include <QTextBrowser> @@ -845,31 +847,322 @@ int PackageManagerPage::nextId() const IntroductionPage::IntroductionPage(PackageManagerCore *core) : PackageManagerPage(core) - , m_widget(0) + , m_updatesFetched(false) + , m_allPackagesFetched(false) + , m_label(0) + , m_msgLabel(0) + , m_errorLabel(0) + , m_progressBar(0) + , m_packageManager(0) + , m_updateComponents(0) + , m_removeAllComponents(0) { setObjectName(QLatin1String("IntroductionPage")); setColoredTitle(tr("Setup - %1").arg(productName())); + QVBoxLayout *layout = new QVBoxLayout(this); + setLayout(layout); + m_msgLabel = new QLabel(this); m_msgLabel->setWordWrap(true); m_msgLabel->setObjectName(QLatin1String("MessageLabel")); m_msgLabel->setText(tr("Welcome to the %1 Setup Wizard.").arg(productName())); - QVBoxLayout *layout = new QVBoxLayout(this); - setLayout(layout); + QWidget *widget = new QWidget(this); + QVBoxLayout *boxLayout = new QVBoxLayout(widget); + + m_packageManager = new QRadioButton(tr("Package manager"), this); + m_packageManager->setObjectName(QLatin1String("PackageManagerRadioButton")); + boxLayout->addWidget(m_packageManager); + m_packageManager->setChecked(core->isPackageManager()); + connect(m_packageManager, SIGNAL(toggled(bool)), this, SLOT(setPackageManager(bool))); + + m_updateComponents = new QRadioButton(tr("Update components"), this); + m_updateComponents->setObjectName(QLatin1String("UpdaterRadioButton")); + boxLayout->addWidget(m_updateComponents); + m_updateComponents->setChecked(core->isUpdater()); + connect(m_updateComponents, SIGNAL(toggled(bool)), this, SLOT(setUpdater(bool))); + + m_removeAllComponents = new QRadioButton(tr("Remove all components"), this); + m_removeAllComponents->setObjectName(QLatin1String("UninstallerRadioButton")); + boxLayout->addWidget(m_removeAllComponents); + m_removeAllComponents->setChecked(core->isUninstaller()); + connect(m_removeAllComponents, SIGNAL(toggled(bool)), this, SLOT(setUninstaller(bool))); + connect(m_removeAllComponents, SIGNAL(toggled(bool)), core, SLOT(setCompleteUninstallation(bool))); + + boxLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding)); + + m_label = new QLabel(this); + m_label->setWordWrap(true); + m_label->setText(tr("Retrieving information from remote installation sources...")); + boxLayout->addWidget(m_label); + + m_progressBar = new QProgressBar(this); + m_progressBar->setRange(0, 0); + boxLayout->addWidget(m_progressBar); + + boxLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding)); + + m_errorLabel = new QLabel(this); + m_errorLabel->setWordWrap(true); + boxLayout->addWidget(m_errorLabel); + layout->addWidget(m_msgLabel); + layout->addWidget(widget); layout->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding)); + + core->setCompleteUninstallation(core->isUninstaller()); + + connect(core, SIGNAL(metaJobProgress(int)), this, SLOT(onProgressChanged(int))); + connect(core, SIGNAL(metaJobInfoMessage(QString)), this, SLOT(setMessage(QString))); + connect(core, SIGNAL(coreNetworkSettingsChanged()), this, SLOT(onCoreNetworkSettingsChanged())); + + m_updateComponents->setEnabled(ProductKeyCheck::instance()->hasValidKey()); +} + +int IntroductionPage::nextId() const +{ + if (packageManagerCore()->isUninstaller()) + return PackageManagerCore::ReadyForInstallation; + + if (packageManagerCore()->isUpdater() || packageManagerCore()->isPackageManager()) + return PackageManagerCore::ComponentSelection; + + return PackageManagerPage::nextId(); } -void IntroductionPage::setWidget(QWidget *widget) +bool IntroductionPage::validatePage() { - if (m_widget) { - layout()->removeWidget(m_widget); - delete m_widget; + PackageManagerCore *core = packageManagerCore(); + if (core->isUninstaller()) + return true; + + setComplete(false); + if (!validRepositoriesAvailable()) { + setErrorMessage(QLatin1String("<font color=\"red\">") + tr("At least one valid and enabled " + "repository required for this action to succeed.") + QLatin1String("</font>")); + return isComplete(); } - m_widget = widget; - if (m_widget) - static_cast<QVBoxLayout*>(layout())->addWidget(m_widget, 1); + + gui()->setSettingsButtonEnabled(false); + const bool maintanence = core->isUpdater() || core->isPackageManager(); + if (maintanence) { + showAll(); + setMaintenanceToolsEnabled(false); + } else { + showMetaInfoUdate(); + } + + // fetch updater packages + if (core->isUpdater()) { + if (!m_updatesFetched) { + m_updatesFetched = core->fetchRemotePackagesTree(); + if (!m_updatesFetched) + setErrorMessage(core->error()); + } + + callControlScript(QLatin1String("UpdaterSelectedCallback")); + + if (m_updatesFetched) { + if (core->updaterComponents().count() <= 0) + setErrorMessage(QLatin1String("<b>") + tr("No updates available.") + QLatin1String("</b>")); + else + setComplete(true); + } + } + + // fetch common packages + if (core->isInstaller() || core->isPackageManager()) { + bool localPackagesTreeFetched = false; + if (!m_allPackagesFetched) { + // first try to fetch the server side packages tree + m_allPackagesFetched = core->fetchRemotePackagesTree(); + if (!m_allPackagesFetched) { + QString error = core->error(); + if (core->isPackageManager() && core->status() != PackageManagerCore::ForceUpdate) { + // if that fails and we're in maintenance mode, try to fetch local installed tree + localPackagesTreeFetched = core->fetchLocalPackagesTree(); + if (localPackagesTreeFetched) { + // if that succeeded, adjust error message + error = QLatin1String("<font color=\"red\">") + error + tr(" Only local package " + "management available.") + QLatin1String("</font>"); + } + } + setErrorMessage(error); + } + } + + callControlScript(QLatin1String("PackageManagerSelectedCallback")); + + if (m_allPackagesFetched | localPackagesTreeFetched) + setComplete(true); + } + + if (maintanence) { + showMaintenanceTools(); + setMaintenanceToolsEnabled(true); + } else { + hideAll(); + } + gui()->setSettingsButtonEnabled(true); + + return isComplete(); +} + +void IntroductionPage::showAll() +{ + showWidgets(true); +} + +void IntroductionPage::hideAll() +{ + showWidgets(false); +} + +void IntroductionPage::showMetaInfoUdate() +{ + showWidgets(false); + m_label->setVisible(true); + m_progressBar->setVisible(true); +} + +void IntroductionPage::showMaintenanceTools() +{ + showWidgets(true); + m_label->setVisible(false); + m_progressBar->setVisible(false); +} + +void IntroductionPage::setMaintenanceToolsEnabled(bool enable) +{ + m_packageManager->setEnabled(enable); + m_updateComponents->setEnabled(enable && ProductKeyCheck::instance()->hasValidKey()); + m_removeAllComponents->setEnabled(enable); +} + +// -- public slots + +void IntroductionPage::setMessage(const QString &msg) +{ + m_label->setText(msg); +} + +void IntroductionPage::onProgressChanged(int progress) +{ + m_progressBar->setRange(0, 100); + m_progressBar->setValue(progress); +} + +void IntroductionPage::setErrorMessage(const QString &error) +{ + QPalette palette; + const PackageManagerCore::Status s = packageManagerCore()->status(); + if (s == PackageManagerCore::Failure || s == PackageManagerCore::Failure) { + palette.setColor(QPalette::WindowText, Qt::red); + } else { + palette.setColor(QPalette::WindowText, palette.color(QPalette::WindowText)); + } + + m_errorLabel->setText(error); + m_errorLabel->setPalette(palette); +} + +void IntroductionPage::callControlScript(const QString &callback) +{ + // Initialize the gui. Needs to be done after check repositories as only then the ui can handle + // hide of pages depending on the components. + gui()->init(); + gui()->callControlScriptMethod(callback); +} + +bool IntroductionPage::validRepositoriesAvailable() const +{ + const PackageManagerCore *const core = packageManagerCore(); + bool valid = (core->isInstaller() && core->isOfflineOnly()) || core->isUninstaller(); + + if (!valid) { + foreach (const Repository &repo, core->settings().repositories()) { + if (repo.isEnabled() && repo.isValid()) { + valid = true; + break; + } + } + } + return valid; +} + +// -- private slots + +void IntroductionPage::setUpdater(bool value) +{ + if (value) { + entering(); + gui()->showSettingsButton(true); + packageManagerCore()->setUpdater(); + emit packageManagerCoreTypeChanged(); + } +} + +void IntroductionPage::setUninstaller(bool value) +{ + if (value) { + entering(); + gui()->showSettingsButton(false); + packageManagerCore()->setUninstaller(); + emit packageManagerCoreTypeChanged(); + } +} + +void IntroductionPage::setPackageManager(bool value) +{ + if (value) { + entering(); + gui()->showSettingsButton(true); + packageManagerCore()->setPackageManager(); + emit packageManagerCoreTypeChanged(); + } +} + +void IntroductionPage::onCoreNetworkSettingsChanged() +{ + m_updatesFetched = false; + m_allPackagesFetched = false; +} + +// -- private + +void IntroductionPage::entering() +{ + setComplete(true); + showWidgets(false); + setMessage(QString()); + setErrorMessage(QString()); + setButtonText(QWizard::CancelButton, tr("Quit")); + + m_progressBar->setValue(0); + m_progressBar->setRange(0, 0); + PackageManagerCore *core = packageManagerCore(); + if (core->isUninstaller() || core->isUpdater() || core->isPackageManager()) { + showMaintenanceTools(); + setMaintenanceToolsEnabled(true); + } + setSettingsButtonRequested((!core->isOfflineOnly()) && (!core->isUninstaller())); +} + +void IntroductionPage::leaving() +{ + m_progressBar->setValue(0); + m_progressBar->setRange(0, 0); + setButtonText(QWizard::CancelButton, gui()->defaultButtonText(QWizard::CancelButton)); +} + +void IntroductionPage::showWidgets(bool show) +{ + m_label->setVisible(show); + m_progressBar->setVisible(show); + m_packageManager->setVisible(show); + m_updateComponents->setVisible(show); + m_removeAllComponents->setVisible(show); } void IntroductionPage::setText(const QString &text) diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h index e1544306a..a2cf23139 100644 --- a/src/libs/installer/packagemanagergui.h +++ b/src/libs/installer/packagemanagergui.h @@ -58,6 +58,7 @@ class QLabel; class QLineEdit; class QListWidget; class QListWidgetItem; +class QProgressBar; class QRadioButton; class QTextBrowser; QT_END_NAMESPACE @@ -213,12 +214,51 @@ class INSTALLER_EXPORT IntroductionPage : public PackageManagerPage public: explicit IntroductionPage(PackageManagerCore *core); - void setWidget(QWidget *widget); void setText(const QString &text); + int nextId() const; + bool validatePage(); + + void showAll(); + void hideAll(); + void showMetaInfoUdate(); + void showMaintenanceTools(); + void setMaintenanceToolsEnabled(bool enable); + + public Q_SLOTS: + void onCoreNetworkSettingsChanged(); + void setMessage(const QString &msg); + void onProgressChanged(int progress); + void setErrorMessage(const QString &error); + +Q_SIGNALS: + void packageManagerCoreTypeChanged(); + + private Q_SLOTS: + void setUpdater(bool value); + void setUninstaller(bool value); + void setPackageManager(bool value); + private: + void entering(); + void leaving(); + + void showWidgets(bool show); + void callControlScript(const QString &callback); + + bool validRepositoriesAvailable() const; + +private: + bool m_updatesFetched; + bool m_allPackagesFetched; + + QLabel *m_label; QLabel *m_msgLabel; - QWidget *m_widget; + QLabel *m_errorLabel; + QProgressBar *m_progressBar; + QRadioButton *m_packageManager; + QRadioButton *m_updateComponents; + QRadioButton *m_removeAllComponents; }; |