diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2023-06-07 14:26:55 +0300 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2023-06-19 08:48:35 +0000 |
commit | 835ccf1766bc77e4ef581e9e6ba699a43338ecf3 (patch) | |
tree | 6a62aab1805bc8c1ad9888d6516cd277e5d1e27d | |
parent | 308c2a7fdeeef50096186ac5aff8d22ecd853fe0 (diff) |
Allow generating offline installers from Gui
This was previously possible only from the CLI. The same methods
can be used from the graphical installer, so we do not need to
limit the feature for CLI users.
Task-number: QTIFW-3072
Change-Id: I271aecf163528b922e6cc399d31f07218e2a1650
Reviewed-by: Katja Marttila <katja.marttila@qt.io>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
-rw-r--r-- | src/libs/installer/componentselectionpage_p.cpp | 40 | ||||
-rw-r--r-- | src/libs/installer/componentselectionpage_p.h | 5 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 7 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.cpp | 29 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.h | 4 |
5 files changed, 79 insertions, 6 deletions
diff --git a/src/libs/installer/componentselectionpage_p.cpp b/src/libs/installer/componentselectionpage_p.cpp index db42cdfd1..a564f3458 100644 --- a/src/libs/installer/componentselectionpage_p.cpp +++ b/src/libs/installer/componentselectionpage_p.cpp @@ -75,6 +75,7 @@ ComponentSelectionPagePrivate::ComponentSelectionPagePrivate(ComponentSelectionP , m_descriptionBaseWidget(nullptr) , m_categoryWidget(Q_NULLPTR) , m_allowCompressedRepositoryInstall(false) + , m_allowCreateOfflineInstaller(true) , m_categoryLayoutVisible(false) , m_allModel(m_core->defaultComponentModel()) , m_updaterModel(m_core->updaterComponentModel()) @@ -121,19 +122,35 @@ ComponentSelectionPagePrivate::ComponentSelectionPagePrivate(ComponentSelectionP m_sizeLabel->setObjectName(QLatin1String("ComponentSizeLabel")); descriptionVLayout->addWidget(m_sizeLabel); + QHBoxLayout *pushButtonHLayout = new QHBoxLayout; + pushButtonHLayout->setObjectName(QLatin1String("PushButtonHLayout")); + + m_createOfflinePushButton = new QPushButton(q); + m_createOfflinePushButton->setVisible(false); + m_createOfflinePushButton->setText(ComponentSelectionPage::tr("Create Offline Installer")); + m_createOfflinePushButton->setToolTip( + ComponentSelectionPage::tr("Create offline installer from selected components, instead " + "of installing now.")); + pushButtonHLayout->addWidget(m_createOfflinePushButton); + + connect(m_createOfflinePushButton, &QPushButton::clicked, + this, &ComponentSelectionPagePrivate::createOfflineButtonClicked); + connect(q, &ComponentSelectionPage::completeChanged, + this, [&]() { m_createOfflinePushButton->setEnabled(q->isComplete()); }); + m_qbspPushButton = new QPushButton(q); m_qbspPushButton->setVisible(false); m_qbspPushButton->setText(ComponentSelectionPage::tr("Browse &QBSP files")); - m_qbspPushButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_qbspPushButton->setToolTip( ComponentSelectionPage::tr("Select a Qt Board Support Package file to install " "additional content that is not directly available from the online repositories.")); + pushButtonHLayout->addWidget(m_qbspPushButton); connect(m_qbspPushButton, &QPushButton::clicked, this, &ComponentSelectionPagePrivate::qbspButtonClicked); m_rightSideVLayout->addWidget(m_descriptionBaseWidget); - m_rightSideVLayout->addWidget(m_qbspPushButton, 0, Qt::AlignRight | Qt::AlignBottom); + m_rightSideVLayout->addLayout(pushButtonHLayout); QHBoxLayout *topHLayout = new QHBoxLayout; @@ -240,6 +257,11 @@ void ComponentSelectionPagePrivate::allowCompressedRepositoryInstall() m_allowCompressedRepositoryInstall = true; } +void ComponentSelectionPagePrivate::setAllowCreateOfflineInstaller(bool allow) +{ + m_allowCreateOfflineInstaller = allow; +} + void ComponentSelectionPagePrivate::showCompressedRepositoryButton() { if (m_allowCompressedRepositoryInstall) @@ -251,6 +273,14 @@ void ComponentSelectionPagePrivate::hideCompressedRepositoryButton() m_qbspPushButton->setVisible(false); } +void ComponentSelectionPagePrivate::showCreateOfflineInstallerButton(bool show) +{ + if (show && m_allowCreateOfflineInstaller) + m_createOfflinePushButton->setVisible(m_core->isInstaller() && !m_core->isOfflineOnly()); + else + m_createOfflinePushButton->setVisible(false); +} + void ComponentSelectionPagePrivate::setupCategoryLayout() { if (m_categoryWidget) @@ -531,6 +561,12 @@ void ComponentSelectionPagePrivate::fetchRepositoryCategories() m_searchLineEdit->text().isEmpty() ? expandDefault() : expandSearchResults(); } +void ComponentSelectionPagePrivate::createOfflineButtonClicked() +{ + m_core->setOfflineGenerator(); + q->gui()->button(QWizard::NextButton)->click(); +} + void ComponentSelectionPagePrivate::qbspButtonClicked() { QString defaultDownloadDirectory = diff --git a/src/libs/installer/componentselectionpage_p.h b/src/libs/installer/componentselectionpage_p.h index 3667f000e..ee00347a8 100644 --- a/src/libs/installer/componentselectionpage_p.h +++ b/src/libs/installer/componentselectionpage_p.h @@ -67,8 +67,10 @@ public: ~ComponentSelectionPagePrivate(); void allowCompressedRepositoryInstall(); + void setAllowCreateOfflineInstaller(bool allow); void showCompressedRepositoryButton(); void hideCompressedRepositoryButton(); + void showCreateOfflineInstallerButton(bool show); void setupCategoryLayout(); void showCategoryLayout(bool show); void updateTreeView(); @@ -84,6 +86,7 @@ public slots: void enableRepositoryCategory(const QString &repositoryName, bool enable); void updateWidgetVisibility(bool show); void fetchRepositoryCategories(); + void createOfflineButtonClicked(); void qbspButtonClicked(); void onProgressChanged(int progress); void setMessage(const QString &msg); @@ -105,6 +108,7 @@ private: QWidget *m_descriptionBaseWidget; QLabel *m_sizeLabel; QLabel *m_descriptionLabel; + QPushButton *m_createOfflinePushButton; QPushButton *m_qbspPushButton; CustomComboBox *m_checkStateComboBox; QWidget *m_categoryWidget; @@ -114,6 +118,7 @@ private: QGridLayout *m_mainGLayout; QVBoxLayout *m_rightSideVLayout; bool m_allowCompressedRepositoryInstall; + bool m_allowCreateOfflineInstaller; bool m_categoryLayoutVisible; ComponentModel *m_allModel; ComponentModel *m_updaterModel; diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index ef27f6b53..0c4f13470 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -3129,7 +3129,10 @@ bool PackageManagerCore::checkAvailableSpace(QString &message) const } #endif } - message = QString::fromLatin1("%1 %2").arg(message, tr("Installation will use %1 of disk space.") + message = QString::fromLatin1("%1 %2").arg(message, + (isOfflineGenerator() + ? tr("Created installer will use %1 of disk space.") + : tr("Installation will use %1 of disk space.")) .arg(humanReadableSize(requiredDiskSpace()))).simplified(); return true; @@ -3823,6 +3826,7 @@ bool PackageManagerCore::isPackageManager() const void PackageManagerCore::setOfflineGenerator() { d->m_magicMarkerSupplement = BinaryContent::OfflineGenerator; + emit installerBinaryMarkerChanged(d->m_magicBinaryMarker); } /*! @@ -3841,6 +3845,7 @@ bool PackageManagerCore::isOfflineGenerator() const void PackageManagerCore::setPackageViewer() { d->m_magicMarkerSupplement = BinaryContent::PackageViewer; + emit installerBinaryMarkerChanged(d->m_magicBinaryMarker); } /*! diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index 976a05a0f..5ee382771 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -2227,6 +2227,7 @@ void ComponentSelectionPage::entering() d->showCategoryLayout(false); } d->showCompressedRepositoryButton(); + d->showCreateOfflineInstallerButton(true); } /*! @@ -2236,6 +2237,7 @@ void ComponentSelectionPage::entering() void ComponentSelectionPage::leaving() { d->hideCompressedRepositoryButton(); + d->showCreateOfflineInstallerButton(false); } /*! @@ -2348,6 +2350,11 @@ bool ComponentSelectionPage::addVirtualComponentToUninstall(const QString &name) return false; } +void ComponentSelectionPage::setAllowCreateOfflineInstaller(bool allow) +{ + d->setAllowCreateOfflineInstaller(allow); +} + void ComponentSelectionPage::setModified(bool modified) { setComplete(modified); @@ -2710,6 +2717,10 @@ void ReadyForInstallationPage::entering() setButtonText(QWizard::CommitButton, tr("U&pdate")); setColoredTitle(tr("Ready to Update Packages")); m_msgLabel->setText(tr("All required information is now available to begin updating your installation.")); + } else if (packageManagerCore()->isOfflineGenerator()) { + setButtonText(QWizard::CommitButton, tr("Create Offline Installer")); + setColoredTitle(tr("Ready to Create Offline Installer")); + m_msgLabel->setText(tr("All required information is now available to create an offline installer for selected components.")); } else { Q_ASSERT(packageManagerCore()->isInstaller()); setButtonText(QWizard::CommitButton, tr("&Install")); @@ -2750,7 +2761,9 @@ void ReadyForInstallationPage::leaving() void ReadyForInstallationPage::updatePageListTitle() { PackageManagerCore *core = packageManagerCore(); - if (core->isInstaller()) + if (core->isOfflineGenerator()) + setPageListTitle(tr("Ready to Create Offline Installer")); + else if (core->isInstaller()) setPageListTitle(tr("Ready to Install")); else if (core->isMaintainer()) setPageListTitle(tr("Ready to Update")); @@ -2808,6 +2821,11 @@ PerformInstallationPage::PerformInstallationPage(PackageManagerCore *core) connect(core, &PackageManagerCore::installationFinished, this, &PerformInstallationPage::installationFinished); + connect(core, &PackageManagerCore::offlineGenerationStarted, + this, &PerformInstallationPage::installationStarted); + connect(core, &PackageManagerCore::offlineGenerationFinished, + this, &PerformInstallationPage::installationFinished); + connect(core, &PackageManagerCore::uninstallationStarted, this, &PerformInstallationPage::uninstallationStarted); connect(core, &PackageManagerCore::uninstallationFinished, @@ -2877,6 +2895,11 @@ void PerformInstallationPage::entering() setColoredTitle(tr("Updating components of %1").arg(productName())); QTimer::singleShot(30, packageManagerCore(), SLOT(runPackageUpdater())); + } else if (packageManagerCore()->isOfflineGenerator()) { + setButtonText(QWizard::CommitButton, tr("&Create Offline Installer")); + setColoredTitle(tr("Creating Offline Installer for %1").arg(productName())); + + QTimer::singleShot(30, packageManagerCore(), SLOT(runOfflineGenerator())); } else { setButtonText(QWizard::CommitButton, tr("&Install")); setColoredTitle(tr("Installing %1").arg(productName())); @@ -2901,7 +2924,9 @@ void PerformInstallationPage::leaving() void PerformInstallationPage::updatePageListTitle() { PackageManagerCore *core = packageManagerCore(); - if (core->isInstaller()) + if (core->isOfflineGenerator()) + setPageListTitle(tr("Creating Offline Installer")); + else if (core->isInstaller()) setPageListTitle(tr("Installing")); else if (core->isMaintainer()) setPageListTitle(tr("Updating")); diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h index ba27c4af6..655dd9875 100644 --- a/src/libs/installer/packagemanagergui.h +++ b/src/libs/installer/packagemanagergui.h @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2022 The Qt Company Ltd. +** Copyright (C) 2023 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -333,6 +333,8 @@ public: Q_INVOKABLE void allowCompressedRepositoryInstall(); Q_INVOKABLE bool addVirtualComponentToUninstall(const QString &name); + void setAllowCreateOfflineInstaller(bool allow); + protected: void entering() override; void leaving() override; |