summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2020-05-08 16:38:15 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2020-06-11 12:19:06 +0300
commitf6565bdc455d7b3a10941c29d780b58fc1305ef2 (patch)
treea9b11b7ba52e29ad845533303c85b4f69113ed92
parentfc973b4c0b1b4e30ff69564565fd30e5ac18524a (diff)
Add a page list widget to installer wizard
If an installer is configured with <WizardShowPageList> set to true (default), a QListWidget set as a side widget for the wizard will be shown. The list should indicate completed and incomplete pages and the current wizard page. User navigation is not enabled in this change. The page list should honor the visibility of individual pages and update itself dynamically. In addition the visibility of a page in page list widget can be set internally with setShowOnPageList() which overrides other factors when hiding a page. The page item title shown on the list can be set internally with setPageListTitle() for the PackageManagerPage object, or the item can alternatively use the normal page title and the object name. Task-number: QTIFW-1755 Change-Id: I8a792d957a10e2176de5f42f29b1282e8e7667db Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r--doc/installerfw.qdoc10
-rw-r--r--src/libs/installer/constants.h1
-rw-r--r--src/libs/installer/packagemanagercore.cpp5
-rw-r--r--src/libs/installer/packagemanagercore.h1
-rw-r--r--src/libs/installer/packagemanagergui.cpp173
-rw-r--r--src/libs/installer/packagemanagergui.h17
-rw-r--r--src/libs/installer/settings.cpp14
-rw-r--r--src/libs/installer/settings.h3
-rw-r--r--tests/auto/installer/settings/tst_settings.cpp3
9 files changed, 217 insertions, 10 deletions
diff --git a/doc/installerfw.qdoc b/doc/installerfw.qdoc
index 0a6c7bfe4..22dc89d40 100644
--- a/doc/installerfw.qdoc
+++ b/doc/installerfw.qdoc
@@ -206,13 +206,15 @@
\li Filename for a logo used as \c QWizard::LogoPixmap.
\row
\li Watermark
- \li Filename for a watermark used as \c QWizard::WatermarkPixmap.
+ \li Filename for a watermark used as \c QWizard::WatermarkPixmap. If
+ \c <WizardShowPageList> is set to \c true, the watermark is hidden.
\row
\li Banner
\li Filename for a banner used as \c QWizard::BannerPixmap (only used by ModernStyle).
\row
\li Background
\li Filename for an image used as \c QWizard::BackgroundPixmap (only used by MacStyle).
+ If \c <WizardShowPageList> is set to \c true, the background is hidden.
\row
\li WizardStyle
\li Set the wizard style to be used ("Modern", "Mac", "Aero" or "Classic").
@@ -230,6 +232,12 @@
override this. You can add the \c em or \c ex suffix to the specified value to
use the \e em or \e ex unit, as in a CSS file.
\row
+ \li WizardShowPageList
+ \li Set to \c false if the widget listing installer pages on the left side of the
+ wizard should not be shown. Defaults to \c true. If visible, this widget hides
+ \c QWizard::WatermarkPixmap on \c QWizard::ClassicStyle and \c QWizard::ModernStyle,
+ and \c QWizard::BackgroundPixmap on \c QWizard::MacStyle.
+ \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 356fa75e4..c5d018bf4 100644
--- a/src/libs/installer/constants.h
+++ b/src/libs/installer/constants.h
@@ -89,6 +89,7 @@ static const QLatin1String scStyleSheet("StyleSheet");
static const QLatin1String scTitleColor("TitleColor");
static const QLatin1String scWizardDefaultWidth("WizardDefaultWidth");
static const QLatin1String scWizardDefaultHeight("WizardDefaultHeight");
+static const QLatin1String scWizardShowPageList("WizardShowPageList");
static const QLatin1String scUrlQueryString("UrlQueryString");
static const QLatin1String scProductUUID("ProductUUID");
static const QLatin1String scAllUsers("AllUsers");
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index d34f608cd..73909e365 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -3111,6 +3111,7 @@ QString PackageManagerCore::installerBinaryPath() const
void PackageManagerCore::setInstaller()
{
d->m_magicBinaryMarker = BinaryContent::MagicInstallerMarker;
+ emit installerBinaryMarkerChanged(d->m_magicBinaryMarker);
}
/*!
@@ -3141,6 +3142,7 @@ bool PackageManagerCore::isOfflineOnly() const
void PackageManagerCore::setUninstaller()
{
d->m_magicBinaryMarker = BinaryContent::MagicUninstallerMarker;
+ emit installerBinaryMarkerChanged(d->m_magicBinaryMarker);
}
/*!
@@ -3161,6 +3163,7 @@ bool PackageManagerCore::isUninstaller() const
void PackageManagerCore::setUpdater()
{
d->m_magicBinaryMarker = BinaryContent::MagicUpdaterMarker;
+ emit installerBinaryMarkerChanged(d->m_magicBinaryMarker);
}
/*!
@@ -3180,6 +3183,7 @@ bool PackageManagerCore::isUpdater() const
void PackageManagerCore::setPackageManager()
{
d->m_magicBinaryMarker = BinaryContent::MagicPackageManagerMarker;
+ emit installerBinaryMarkerChanged(d->m_magicBinaryMarker);
}
@@ -3202,6 +3206,7 @@ void PackageManagerCore::setUserSetBinaryMarker(qint64 magicMarker)
{
d->m_magicBinaryMarker = magicMarker;
d->m_userSetBinaryMarker = true;
+ emit installerBinaryMarkerChanged(d->m_magicBinaryMarker);
}
/*!
diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h
index 27fb20b0e..13b4c47ad 100644
--- a/src/libs/installer/packagemanagercore.h
+++ b/src/libs/installer/packagemanagercore.h
@@ -362,6 +362,7 @@ Q_SIGNALS:
void guiObjectChanged(QObject *gui);
void unstableComponentFound(const QString &type, const QString &errorMessage, const QString &component);
+ void installerBinaryMarkerChanged(qint64 magicMarker);
private:
struct Data {
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp
index e921ab978..090465b28 100644
--- a/src/libs/installer/packagemanagergui.cpp
+++ b/src/libs/installer/packagemanagergui.cpp
@@ -309,7 +309,8 @@ PackageManagerGui::PackageManagerGui(PackageManagerCore *core, QWidget *parent)
#ifndef Q_OS_MACOS
setWindowIcon(QIcon(m_core->settings().installerWindowIcon()));
#else
- setPixmap(QWizard::BackgroundPixmap, m_core->settings().background());
+ if (!m_core->settings().wizardShowPageList())
+ setPixmap(QWizard::BackgroundPixmap, m_core->settings().background());
#endif
#ifdef Q_OS_LINUX
setWizardStyle(QWizard::ModernStyle);
@@ -339,6 +340,33 @@ PackageManagerGui::PackageManagerGui(PackageManagerCore *core, QWidget *parent)
setOption(QWizard::NoBackButtonOnStartPage);
setOption(QWizard::NoBackButtonOnLastPage);
+ if (m_core->settings().wizardShowPageList()) {
+ QWidget *sideWidget = new QWidget(this);
+
+ m_pageListWidget = new QListWidget(sideWidget);
+ m_pageListWidget->viewport()->setAutoFillBackground(false);
+ m_pageListWidget->setFrameShape(QFrame::NoFrame);
+ m_pageListWidget->setMinimumWidth(200);
+ // The widget should be view-only but we do not want it to be grayed out,
+ // so instead of calling setEnabled(false), do not accept keyboard focus
+ // and disable delivery of mouse events.
+ m_pageListWidget->setFocusPolicy(Qt::NoFocus);
+ m_pageListWidget->setAttribute(Qt::WA_TransparentForMouseEvents);
+ m_pageListWidget->setSelectionMode(QAbstractItemView::NoSelection);
+ m_pageListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+ QFrame *verticalLine = new QFrame(sideWidget);
+ verticalLine->setFrameShape(QFrame::VLine);
+ verticalLine->setFrameShadow(QFrame::Sunken);
+
+ QHBoxLayout *sideWidgetLayout = new QHBoxLayout(sideWidget);
+ sideWidgetLayout->addWidget(m_pageListWidget);
+ sideWidgetLayout->addWidget(verticalLine);
+ sideWidget->setLayout(sideWidgetLayout);
+
+ setSideWidget(sideWidget);
+ }
+
connect(this, &QDialog::rejected, m_core, &PackageManagerCore::setCanceled);
connect(this, &PackageManagerGui::interrupted, m_core, &PackageManagerCore::interrupt);
@@ -402,6 +430,54 @@ void PackageManagerGui::setMaxSize()
}
/*!
+ Updates the installer page list.
+*/
+void PackageManagerGui::updatePageListWidget()
+{
+ if (!m_core->settings().wizardShowPageList() || !m_pageListWidget)
+ return;
+
+ static const QRegularExpression regExp1 {QLatin1String("(.)([A-Z][a-z]+)")};
+ static const QRegularExpression regExp2 {QLatin1String("([a-z0-9])([A-Z])")};
+
+ m_pageListWidget->clear();
+ foreach (int id, pageIds()) {
+ PackageManagerPage *page = qobject_cast<PackageManagerPage *>(pageById(id));
+ if (!page->showOnPageList())
+ continue;
+
+ // Use page list title if set, otherwise try to use the normal title. If that
+ // is not set either, use the object name with spaces added between words.
+ QString itemText;
+ if (!page->pageListTitle().isEmpty()) {
+ itemText = page->pageListTitle();
+ } else if (!page->title().isEmpty()) {
+ // Title may contain formatting, return only contained plain text
+ QTextDocument doc;
+ doc.setHtml(page->title());
+ itemText = doc.toPlainText().trimmed();
+ } else {
+ // Remove "Page" suffix from object name if exists and add spaces between words
+ itemText = page->objectName();
+ itemText.remove(QLatin1String("Page"), Qt::CaseInsensitive);
+ itemText.replace(regExp1, QLatin1String("\\1 \\2"));
+ itemText.replace(regExp2, QLatin1String("\\1 \\2"));
+ }
+ QListWidgetItem *item = new QListWidgetItem(itemText, m_pageListWidget);
+ item->setSizeHint(QSize(item->sizeHint().width(), 30));
+
+ // Give visual indication about current & non-visited pages
+ if (id == d->m_currentId) {
+ QFont currentItemFont = item->font();
+ currentItemFont.setBold(true);
+ item->setFont(currentItemFont);
+ } else if (!visitedPages().contains(id)) {
+ item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
+ }
+ }
+}
+
+/*!
Destructs a package manager UI.
*/
PackageManagerGui::~PackageManagerGui()
@@ -693,6 +769,7 @@ void PackageManagerGui::wizardPageInsertionRequested(QWidget *widget,
// add it
setPage(pageId, new DynamicInstallerPage(widget, m_core));
+ updatePageListWidget();
}
/*!
@@ -711,6 +788,7 @@ void PackageManagerGui::wizardPageRemovalRequested(QWidget *widget)
packageManagerCore()->controlScriptEngine()->removeFromGlobalObject(dynamicPage);
packageManagerCore()->componentScriptEngine()->removeFromGlobalObject(dynamicPage);
}
+ updatePageListWidget();
}
/*!
@@ -750,6 +828,7 @@ void PackageManagerGui::wizardPageVisibilityChangeRequested(bool visible, int p)
d->m_defaultPages[p] = page(p);
removePage(p);
}
+ updatePageListWidget();
}
/*!
@@ -976,7 +1055,8 @@ void PackageManagerGui::dependsOnLocalInstallerBinary()
/*!
Called when the current page changes to \a newId. Calls the leaving() method for the old page
and the entering() method for the new one. Also, executes the control script associated with the
- new page by calling executeControlScript().
+ new page by calling executeControlScript(). Updates the page list set as QWizard::sideWidget().
+
Emits the left() and entered() signals.
*/
@@ -994,6 +1074,7 @@ void PackageManagerGui::currentPageChanged(int newId)
if (newPage) {
newPage->entering();
emit newPage->entered();
+ updatePageListWidget();
}
executeControlScript(newId);
@@ -1082,13 +1163,22 @@ PackageManagerPage::PackageManagerPage(PackageManagerCore *core)
, m_needsSettingsButton(false)
, m_core(core)
, validatorComponent(nullptr)
+ , m_showOnPageList(true)
{
if (!m_core->settings().titleColor().isEmpty())
m_titleColor = m_core->settings().titleColor();
- setPixmap(QWizard::WatermarkPixmap, watermarkPixmap());
+ if (!m_core->settings().wizardShowPageList())
+ setPixmap(QWizard::WatermarkPixmap, watermarkPixmap());
+
setPixmap(QWizard::BannerPixmap, bannerPixmap());
setPixmap(QWizard::LogoPixmap, logoPixmap());
+
+ // Can't use PackageManagerPage::gui() here as the page is not set yet
+ if (PackageManagerGui *gui = qobject_cast<PackageManagerGui *>(core->guiObject())) {
+ connect(this, &PackageManagerPage::showOnPageListChanged,
+ gui, &PackageManagerGui::updatePageListWidget);
+ }
}
/*!
@@ -1162,6 +1252,44 @@ void PackageManagerPage::setColoredSubTitle(const QString &subTitle)
}
/*!
+ Sets the title shown on installer page indicator for this page to \a title.
+ Pages that do not set this will use a fallback title instead.
+*/
+void PackageManagerPage::setPageListTitle(const QString &title)
+{
+ m_pageListTitle = title;
+}
+
+/*!
+ Returns the title shown on installer page indicator for this page. If empty,
+ a fallback title is being used instead.
+*/
+QString PackageManagerPage::pageListTitle() const
+{
+ return m_pageListTitle;
+}
+
+/*!
+ Sets the page visibility on installer page indicator based on \a show.
+ All pages are shown by default.
+*/
+void PackageManagerPage::setShowOnPageList(bool show)
+{
+ if (m_showOnPageList != show)
+ emit showOnPageListChanged();
+
+ m_showOnPageList = show;
+}
+
+/*!
+ Returns \c true if the page should be shown on installer page indicator.
+*/
+bool PackageManagerPage::showOnPageList() const
+{
+ return m_showOnPageList;
+}
+
+/*!
Returns \c true if the page is complete; otherwise, returns \c false.
*/
bool PackageManagerPage::isComplete() const
@@ -2356,6 +2484,7 @@ ReadyForInstallationPage::ReadyForInstallationPage(PackageManagerCore *core)
{
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setObjectName(QLatin1String("ReadyForInstallationPage"));
+ updatePageListTitle();
QVBoxLayout *baseLayout = new QVBoxLayout();
baseLayout->setObjectName(QLatin1String("BaseLayout"));
@@ -2384,6 +2513,9 @@ ReadyForInstallationPage::ReadyForInstallationPage(PackageManagerCore *core)
setCommitPage(true);
setLayout(baseLayout);
+
+ connect(core, &PackageManagerCore::installerBinaryMarkerChanged,
+ this, &ReadyForInstallationPage::updatePageListTitle);
}
/*!
@@ -2443,6 +2575,20 @@ void ReadyForInstallationPage::leaving()
setButtonText(QWizard::CommitButton, gui()->defaultButtonText(QWizard::CommitButton));
}
+/*!
+ Updates page list title based on installer binary type.
+*/
+void ReadyForInstallationPage::updatePageListTitle()
+{
+ PackageManagerCore *core = packageManagerCore();
+ if (core->isInstaller())
+ setPageListTitle(tr("Ready to Install"));
+ else if (core->isMaintainer())
+ setPageListTitle(tr("Ready to Update"));
+ else if (core->isUninstaller())
+ setPageListTitle(tr("Ready to Uninstall"));
+}
+
// -- PerformInstallationPage
/*!
@@ -2476,6 +2622,7 @@ PerformInstallationPage::PerformInstallationPage(PackageManagerCore *core)
{
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setObjectName(QLatin1String("PerformInstallationPage"));
+ updatePageListTitle();
m_performInstallationForm->setupUi(this);
@@ -2501,6 +2648,9 @@ PerformInstallationPage::PerformInstallationPage(PackageManagerCore *core)
connect(this, &PerformInstallationPage::setAutomatedPageSwitchEnabled,
core, &PackageManagerCore::setAutomatedPageSwitchEnabled);
+ connect(core, &PackageManagerCore::installerBinaryMarkerChanged,
+ this, &PerformInstallationPage::updatePageListTitle);
+
m_performInstallationForm->setDetailsWidgetVisible(true);
setCommitPage(true);
@@ -2566,6 +2716,20 @@ void PerformInstallationPage::leaving()
setButtonText(QWizard::CommitButton, gui()->defaultButtonText(QWizard::CommitButton));
}
+/*!
+ Updates page list title based on installer binary type.
+*/
+void PerformInstallationPage::updatePageListTitle()
+{
+ PackageManagerCore *core = packageManagerCore();
+ if (core->isInstaller())
+ setPageListTitle(tr("Installing"));
+ else if (core->isMaintainer())
+ setPageListTitle(tr("Updating"));
+ else if (core->isUninstaller())
+ setPageListTitle(tr("Uninstalling"));
+}
+
// -- public slots
/*!
@@ -2634,6 +2798,7 @@ FinishedPage::FinishedPage(PackageManagerCore *core)
{
setObjectName(QLatin1String("FinishedPage"));
setColoredTitle(tr("Completing the %1 Wizard").arg(productName()));
+ setPageListTitle(tr("Finished"));
m_msgLabel = new QLabel(this);
m_msgLabel->setWordWrap(true);
@@ -2805,6 +2970,8 @@ RestartPage::RestartPage(PackageManagerCore *core)
setObjectName(QLatin1String("RestartPage"));
setColoredTitle(tr("Completing the %1 Setup Wizard").arg(productName()));
+ // Never show this page on the page list
+ setShowOnPageList(false);
setFinalPage(false);
}
diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h
index 70ec43aca..099f2e4f3 100644
--- a/src/libs/installer/packagemanagergui.h
+++ b/src/libs/installer/packagemanagergui.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.
@@ -108,6 +108,7 @@ public Q_SLOTS:
void showFinishedPage();
void setModified(bool value);
void setMaxSize();
+ void updatePageListWidget();
protected Q_SLOTS:
void wizardPageInsertionRequested(QWidget *widget, QInstaller::PackageManagerCore::WizardPage page);
@@ -136,6 +137,7 @@ private:
class Private;
Private *const d;
PackageManagerCore *m_core;
+ QListWidget *m_pageListWidget;
};
@@ -157,6 +159,12 @@ public:
void setColoredTitle(const QString &title);
void setColoredSubTitle(const QString &subTitle);
+ void setPageListTitle(const QString &title);
+ QString pageListTitle() const;
+
+ void setShowOnPageList(bool show);
+ bool showOnPageList() const;
+
virtual bool isComplete() const;
void setComplete(bool complete);
@@ -173,6 +181,7 @@ public:
signals:
void entered();
void left();
+ void showOnPageListChanged();
protected:
PackageManagerCore *packageManagerCore() const;
@@ -193,6 +202,8 @@ protected:
private:
bool m_complete;
QString m_titleColor;
+ QString m_pageListTitle;
+ bool m_showOnPageList;
bool m_needsSettingsButton;
PackageManagerCore *m_core;
@@ -401,6 +412,9 @@ protected:
void entering();
void leaving();
+private Q_SLOTS:
+ void updatePageListTitle();
+
private:
QLabel *m_msgLabel;
QTextBrowser* m_taskDetailsBrowser;
@@ -437,6 +451,7 @@ private Q_SLOTS:
void uninstallationFinished();
void toggleDetailsWereChanged();
+ void updatePageListTitle();
private:
PerformInstallationForm *m_performInstallationForm;
diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp
index e6395e44c..97c20243d 100644
--- a/src/libs/installer/settings.cpp
+++ b/src/libs/installer/settings.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.
@@ -291,7 +291,7 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix,
<< scAllowSpaceInPath << scAllowNonAsciiCharacters << scDisableAuthorizationFallback
<< scDisableCommandLineInterface
<< scWizardStyle << scStyleSheet << scTitleColor
- << scWizardDefaultWidth << scWizardDefaultHeight
+ << scWizardDefaultWidth << scWizardDefaultHeight << scWizardShowPageList
<< scRepositorySettingsPageVisible << scTargetConfigurationFile
<< scRemoteRepositories << scTranslations << scUrlQueryString << QLatin1String(scControlScript)
<< scCreateLocalRepository << scInstallActionColumnVisible << scSupportsModify << scAllowUnstableComponents
@@ -455,7 +455,10 @@ static int lengthToInt(const QVariant &variant)
int Settings::wizardDefaultWidth() const
{
- return lengthToInt(d->m_data.value(scWizardDefaultWidth));
+ // Add a bit more sensible default width in case the page list widget is shown
+ // as it can take quite a lot horizontal space. A vendor can always override
+ // the default value.
+ return lengthToInt(d->m_data.value(scWizardDefaultWidth, wizardShowPageList() ? 800 : 0));
}
int Settings::wizardDefaultHeight() const
@@ -463,6 +466,11 @@ int Settings::wizardDefaultHeight() const
return lengthToInt(d->m_data.value(scWizardDefaultHeight));
}
+bool Settings::wizardShowPageList() const
+{
+ return d->m_data.value(scWizardShowPageList, true).toBool();
+}
+
QString Settings::installerApplicationIcon() const
{
return d->absolutePathFromKey(scInstallerApplicationIcon, systemIconSuffix());
diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h
index 93e658bd8..0c2bcd95e 100644
--- a/src/libs/installer/settings.h
+++ b/src/libs/installer/settings.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.
@@ -88,6 +88,7 @@ public:
QString titleColor() const;
int wizardDefaultWidth() const;
int wizardDefaultHeight() const;
+ bool wizardShowPageList() const;
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 d3a929269..88ee4b338 100644
--- a/tests/auto/installer/settings/tst_settings.cpp
+++ b/tests/auto/installer/settings/tst_settings.cpp
@@ -87,8 +87,9 @@ void tst_Settings::loadTutorialConfig()
QCOMPARE(settings.systemIconSuffix(), QLatin1String(".png"));
#endif
QCOMPARE(settings.wizardStyle(), QString());
- QCOMPARE(settings.wizardDefaultWidth(), 0);
+ QCOMPARE(settings.wizardDefaultWidth(), settings.wizardShowPageList() ? 800 : 0);
QCOMPARE(settings.wizardDefaultHeight(), 0);
+ QCOMPARE(settings.wizardShowPageList(), true);
QCOMPARE(settings.titleColor(), QString());
QCOMPARE(settings.runProgram(), QString());
QCOMPARE(settings.runProgramArguments(), QStringList());