summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2020-08-17 18:30:10 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2020-08-25 11:37:30 +0300
commit15cff3e2354f51d702976e704e4202390217c8c6 (patch)
tree0d6c41ff536f8e68eedf9c70315821aeb561e8a7
parent40c43e4c312c9f1cc4e2e44ac31b4482ccbbc6c0 (diff)
Add support for vendor set image decoration
Add possibility to show an arbitrary number of product related, or other images on PerformInstallationPage. These can be specified in the installer configuration file, using <ProductImages> element with one <Image> child element for each file name. Task-number: QTIFW-1900 Change-Id: I2be727d9189963ef1a79046150111dd8c91153c6 Reviewed-by: Iikka Eklund <iikka.eklund@qt.io> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r--doc/installerfw.qdoc4
-rw-r--r--src/libs/installer/constants.h1
-rw-r--r--src/libs/installer/packagemanagergui.cpp31
-rw-r--r--src/libs/installer/packagemanagergui.h3
-rw-r--r--src/libs/installer/performinstallationform.cpp42
-rw-r--r--src/libs/installer/performinstallationform.h6
-rw-r--r--src/libs/installer/settings.cpp23
-rw-r--r--src/libs/installer/settings.h2
-rw-r--r--tests/auto/installer/settings/tst_settings.cpp1
-rw-r--r--tools/binarycreator/binarycreator.cpp15
10 files changed, 125 insertions, 3 deletions
diff --git a/doc/installerfw.qdoc b/doc/installerfw.qdoc
index 22dc89d40..657d0d3db 100644
--- a/doc/installerfw.qdoc
+++ b/doc/installerfw.qdoc
@@ -238,6 +238,10 @@
\c QWizard::WatermarkPixmap on \c QWizard::ClassicStyle and \c QWizard::ModernStyle,
and \c QWizard::BackgroundPixmap on \c QWizard::MacStyle.
\row
+ \li ProductImages
+ \li A list of images to be shown on \c PerformInstallationPage. This element can have
+ one or several \c <Image> child elements that contain a filename for an image.
+ \row
\li TitleColor
\li Set the color of the titles and subtitles (takes an HTML color code,
such as "#88FF33").
diff --git a/src/libs/installer/constants.h b/src/libs/installer/constants.h
index 27b9c08ee..f600ed033 100644
--- a/src/libs/installer/constants.h
+++ b/src/libs/installer/constants.h
@@ -90,6 +90,7 @@ static const QLatin1String scTitleColor("TitleColor");
static const QLatin1String scWizardDefaultWidth("WizardDefaultWidth");
static const QLatin1String scWizardDefaultHeight("WizardDefaultHeight");
static const QLatin1String scWizardShowPageList("WizardShowPageList");
+static const QLatin1String scProductImages("ProductImages");
static const QLatin1String scUrlQueryString("UrlQueryString");
static const QLatin1String scProductUUID("ProductUUID");
static const QLatin1String scAllUsers("AllUsers");
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp
index 86038f5df..26af00bdc 100644
--- a/src/libs/installer/packagemanagergui.cpp
+++ b/src/libs/installer/packagemanagergui.cpp
@@ -2644,6 +2644,7 @@ PerformInstallationPage::PerformInstallationPage(PackageManagerCore *core)
updatePageListTitle();
m_performInstallationForm->setupUi(this);
+ m_imageChangeTimer.setInterval(10000);
connect(ProgressCoordinator::instance(), &ProgressCoordinator::detailTextChanged,
m_performInstallationForm, &PerformInstallationForm::appendProgressDetails);
@@ -2670,6 +2671,9 @@ PerformInstallationPage::PerformInstallationPage(PackageManagerCore *core)
connect(core, &PackageManagerCore::installerBinaryMarkerChanged,
this, &PerformInstallationPage::updatePageListTitle);
+ connect(&m_imageChangeTimer, &QTimer::timeout,
+ this, &PerformInstallationPage::changeCurrentImage);
+
m_performInstallationForm->setDetailsWidgetVisible(true);
setCommitPage(true);
@@ -2705,6 +2709,11 @@ void PerformInstallationPage::entering()
m_performInstallationForm->enableDetails();
emit setAutomatedPageSwitchEnabled(true);
+ changeCurrentImage();
+ // No need to start the timer if we only have one, or no images
+ if (packageManagerCore()->settings().productImages().count() > 1)
+ m_imageChangeTimer.start();
+
if (isVerbose()) {
m_performInstallationForm->toggleDetails();
}
@@ -2733,6 +2742,7 @@ void PerformInstallationPage::entering()
void PerformInstallationPage::leaving()
{
setButtonText(QWizard::CommitButton, gui()->defaultButtonText(QWizard::CommitButton));
+ m_imageChangeTimer.stop();
}
/*!
@@ -2759,6 +2769,27 @@ void PerformInstallationPage::setTitleMessage(const QString &title)
setColoredTitle(title);
}
+/*!
+ Changes the currently shown product image to the next available
+ image from installer configuration.
+*/
+void PerformInstallationPage::changeCurrentImage()
+{
+ const QStringList productImages = packageManagerCore()->settings().productImages();
+ if (productImages.isEmpty())
+ return;
+
+ const QString nextImage = (m_currentImage.isEmpty() || m_currentImage == productImages.last())
+ ? productImages.first()
+ : productImages.at(productImages.indexOf(m_currentImage) + 1);
+
+ // Do not update the pixmap if there was only one image available
+ if (nextImage != m_currentImage) {
+ m_performInstallationForm->setImageFromFileName(nextImage);
+ m_currentImage = nextImage;
+ }
+}
+
// -- private slots
void PerformInstallationPage::installationStarted()
diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h
index 166bd5225..b266b1109 100644
--- a/src/libs/installer/packagemanagergui.h
+++ b/src/libs/installer/packagemanagergui.h
@@ -441,6 +441,7 @@ protected:
public Q_SLOTS:
void setTitleMessage(const QString& title);
+ void changeCurrentImage();
Q_SIGNALS:
void setAutomatedPageSwitchEnabled(bool request);
@@ -457,6 +458,8 @@ private Q_SLOTS:
private:
PerformInstallationForm *m_performInstallationForm;
+ QTimer m_imageChangeTimer;
+ QString m_currentImage;
};
diff --git a/src/libs/installer/performinstallationform.cpp b/src/libs/installer/performinstallationform.cpp
index 28506bcde..2c5edf70f 100644
--- a/src/libs/installer/performinstallationform.cpp
+++ b/src/libs/installer/performinstallationform.cpp
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -30,6 +30,7 @@
#include "lazyplaintextedit.h"
#include "progresscoordinator.h"
+#include "globals.h"
#include <QApplication>
#include <QLabel>
@@ -37,6 +38,8 @@
#include <QPushButton>
#include <QScrollBar>
#include <QVBoxLayout>
+#include <QImageReader>
+#include <QScrollArea>
#include <QtCore/QTimer>
@@ -78,6 +81,8 @@ PerformInstallationForm::PerformInstallationForm(QObject *parent)
: QObject(parent)
, m_progressBar(nullptr)
, m_progressLabel(nullptr)
+ , m_productImagesScrollArea(nullptr)
+ , m_productImagesLabel(nullptr)
, m_detailsButton(nullptr)
, m_detailsBrowser(nullptr)
, m_updateTimer(nullptr)
@@ -130,6 +135,19 @@ void PerformInstallationForm::setupUi(QWidget *widget)
bottomLayout->setObjectName(QLatin1String("BottomLayout"));
bottomLayout->addStretch();
+ m_productImagesScrollArea = new QScrollArea(widget);
+ m_productImagesScrollArea->setObjectName(QLatin1String("ProductImagesScrollArea"));
+ m_productImagesScrollArea->setWidgetResizable(true);
+ m_productImagesScrollArea->setFrameShape(QFrame::NoFrame);
+
+ m_productImagesLabel = new QLabel(widget);
+ m_productImagesLabel->setObjectName(QLatin1String("ProductImagesLabel"));
+ m_productImagesLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
+ m_productImagesLabel->setScaledContents(true);
+
+ m_productImagesScrollArea->setWidget(m_productImagesLabel);
+ bottomLayout->addWidget(m_productImagesScrollArea);
+
m_detailsBrowser = new LazyPlainTextEdit(widget);
m_detailsBrowser->setReadOnly(true);
m_detailsBrowser->setWordWrapMode(QTextOption::NoWrap);
@@ -138,6 +156,7 @@ void PerformInstallationForm::setupUi(QWidget *widget)
bottomLayout->addWidget(m_detailsBrowser);
bottomLayout->setStretch(1, 10);
+ bottomLayout->setStretch(2, 10);
baseLayout->addLayout(topLayout);
baseLayout->addLayout(bottomLayout);
@@ -200,6 +219,7 @@ void PerformInstallationForm::toggleDetails()
const bool willShow = !isShowingDetails();
m_detailsButton->setText(willShow ? tr("&Hide Details") : tr("&Show Details"));
m_detailsBrowser->setVisible(willShow);
+ m_productImagesScrollArea->setVisible(!willShow);
emit showDetailsChanged();
}
@@ -220,6 +240,7 @@ void PerformInstallationForm::enableDetails()
m_detailsButton->setEnabled(true);
m_detailsButton->setText(tr("&Show Details"));
m_detailsBrowser->setVisible(false);
+ m_productImagesScrollArea->setVisible(true);
}
/*!
@@ -273,3 +294,22 @@ void PerformInstallationForm::onDownloadStatusChanged(const QString &status)
m_downloadStatus->setText(m_downloadStatus->fontMetrics().elidedText(status, Qt::ElideRight,
m_downloadStatus->width()));
}
+
+/*!
+ Sets currently shown form image specified by \a fileName.
+*/
+void PerformInstallationForm::setImageFromFileName(const QString &fileName)
+{
+ if (!QFile::exists(fileName)) {
+ qCWarning(QInstaller::lcDeveloperBuild) << "Image file does not exist:" << fileName;
+ return;
+ }
+ QImageReader reader(fileName);
+ QPixmap pixmap = QPixmap::fromImageReader(&reader);
+ if (!pixmap.isNull()) {
+ m_productImagesLabel->setPixmap(pixmap);
+ } else {
+ qCWarning(QInstaller::lcDeveloperBuild) <<
+ QString::fromLatin1("Failed to load image '%1' : %2.").arg(fileName, reader.errorString());
+ }
+}
diff --git a/src/libs/installer/performinstallationform.h b/src/libs/installer/performinstallationform.h
index 954b8e09b..db0a35ee8 100644
--- a/src/libs/installer/performinstallationform.h
+++ b/src/libs/installer/performinstallationform.h
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -38,6 +38,7 @@ class QPushButton;
class QTimer;
class QWidget;
class QWinTaskbarButton;
+class QScrollArea;
QT_END_NAMESPACE
class LazyPlainTextEdit;
@@ -69,11 +70,14 @@ public slots:
void toggleDetails();
void clearDetailsBrowser();
void onDownloadStatusChanged(const QString &status);
+ void setImageFromFileName(const QString &fileName);
private:
QProgressBar *m_progressBar;
QLabel *m_progressLabel;
QLabel *m_downloadStatus;
+ QScrollArea *m_productImagesScrollArea;
+ QLabel *m_productImagesLabel;
QPushButton *m_detailsButton;
LazyPlainTextEdit *m_detailsBrowser;
QTimer *m_updateTimer;
diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp
index 19918c3f9..a8c0eece3 100644
--- a/src/libs/installer/settings.cpp
+++ b/src/libs/installer/settings.cpp
@@ -291,7 +291,7 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix,
<< scAllowSpaceInPath << scAllowNonAsciiCharacters << scDisableAuthorizationFallback
<< scDisableCommandLineInterface
<< scWizardStyle << scStyleSheet << scTitleColor
- << scWizardDefaultWidth << scWizardDefaultHeight << scWizardShowPageList
+ << scWizardDefaultWidth << scWizardDefaultHeight << scWizardShowPageList << scProductImages
<< scRepositorySettingsPageVisible << scTargetConfigurationFile
<< scRemoteRepositories << scTranslations << scUrlQueryString << QLatin1String(scControlScript)
<< scCreateLocalRepository << scInstallActionColumnVisible << scSupportsModify << scAllowUnstableComponents
@@ -316,6 +316,8 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix,
s.setTranslations(readArgumentAttributes(reader, parseMode, QLatin1String("Translation"), true));
} else if (name == scRunProgramArguments) {
s.setRunProgramArguments(readArgumentAttributes(reader, parseMode, QLatin1String("Argument")));
+ } else if (name == scProductImages) {
+ s.setProductImages(readArgumentAttributes(reader, parseMode, QLatin1String("Image")));
} else if (name == scRemoteRepositories) {
s.addDefaultRepositories(readRepositories(reader, true, parseMode));
} else if (name == scRepositoryCategories) {
@@ -471,6 +473,25 @@ bool Settings::wizardShowPageList() const
return d->m_data.value(scWizardShowPageList, true).toBool();
}
+QStringList Settings::productImages() const
+{
+ const QVariant variant = d->m_data.value(scProductImages);
+ QStringList imagePaths;
+ if (variant.canConvert<QStringList>()) {
+ foreach (const QString &imagePath, variant.value<QStringList>()) {
+ QFileInfo(imagePath).isAbsolute()
+ ? imagePaths.append(imagePath)
+ : imagePaths.append(d->m_data.value(scPrefix).toString() + QLatin1Char('/') + imagePath);
+ }
+ }
+ return imagePaths;
+}
+
+void Settings::setProductImages(const QStringList &images)
+{
+ d->m_data.insert(scProductImages, images);
+}
+
QString Settings::installerApplicationIcon() const
{
return d->absolutePathFromKey(scInstallerApplicationIcon, systemIconSuffix());
diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h
index 82e10beb1..1e372d1f3 100644
--- a/src/libs/installer/settings.h
+++ b/src/libs/installer/settings.h
@@ -89,6 +89,8 @@ public:
int wizardDefaultWidth() const;
int wizardDefaultHeight() const;
bool wizardShowPageList() const;
+ QStringList productImages() const;
+ void setProductImages(const QStringList &images);
QString applicationName() const;
QString version() const;
diff --git a/tests/auto/installer/settings/tst_settings.cpp b/tests/auto/installer/settings/tst_settings.cpp
index 88ee4b338..d6bb5f136 100644
--- a/tests/auto/installer/settings/tst_settings.cpp
+++ b/tests/auto/installer/settings/tst_settings.cpp
@@ -90,6 +90,7 @@ void tst_Settings::loadTutorialConfig()
QCOMPARE(settings.wizardDefaultWidth(), settings.wizardShowPageList() ? 800 : 0);
QCOMPARE(settings.wizardDefaultHeight(), 0);
QCOMPARE(settings.wizardShowPageList(), true);
+ QCOMPARE(settings.productImages(), QStringList());
QCOMPARE(settings.titleColor(), QString());
QCOMPARE(settings.runProgram(), QString());
QCOMPARE(settings.runProgramArguments(), QStringList());
diff --git a/tools/binarycreator/binarycreator.cpp b/tools/binarycreator/binarycreator.cpp
index a18690a73..6caf3ff1f 100644
--- a/tools/binarycreator/binarycreator.cpp
+++ b/tools/binarycreator/binarycreator.cpp
@@ -712,6 +712,21 @@ void copyConfigData(const QString &configFile, const QString &targetDir)
const QString elementText = domElement.text();
qDebug().noquote() << QString::fromLatin1("Read dom element: <%1>%2</%1>.").arg(tagName, elementText);
+ if (tagName == QLatin1String("ProductImages")) {
+ const QDomNodeList childNodes = domElement.childNodes();
+ for (int i = 0; i < childNodes.count(); ++i) {
+ const QDomElement childElement = childNodes.at(i).toElement();
+ const QString childName = childElement.tagName();
+ if (childName != QLatin1String("Image"))
+ continue;
+
+ const QString targetFile = targetDir + QLatin1Char('/') + childElement.text();
+ const QFileInfo childFileInfo = QFileInfo(sourceConfigFilePath, childElement.text());
+ QInstallerTools::copyWithException(childFileInfo.absoluteFilePath(), targetFile, childName);
+ }
+ continue;
+ }
+
QString newName = domElement.text().replace(QRegExp(QLatin1String("\\\\|/|\\.|:")),
QLatin1String("_"));