SettingsAccessor: Use optional as return value of findIssues

Change-Id: Ib7ef8ec408f812a71735939514d98cf8755d292b
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Tobias Hunger
2017-11-17 21:53:54 +01:00
parent 6044b84e14
commit 0a202e4c29
3 changed files with 52 additions and 79 deletions

View File

@@ -397,27 +397,31 @@ SettingsAccessor::ProceedInfo SettingsAccessor::reportIssues(const QVariantMap &
if (!path.exists()) if (!path.exists())
return Continue; return Continue;
IssueInfo issue = findIssues(data, path); const Utils::optional<IssueInfo> issue = findIssues(data, path);
QMessageBox::Icon icon = QMessageBox::Information; if (!issue)
if (issue.buttons.count() > 1)
icon = QMessageBox::Question;
QMessageBox::StandardButtons buttons = QMessageBox::NoButton;
foreach (QMessageBox::StandardButton b, issue.buttons.keys())
buttons |= b;
if (buttons == QMessageBox::NoButton)
return Continue; return Continue;
QMessageBox msgBox(icon, issue.title, issue.message, buttons, parent); const IssueInfo &details = issue.value();
if (issue.defaultButton != QMessageBox::NoButton)
msgBox.setDefaultButton(issue.defaultButton); const QMessageBox::Icon icon
if (issue.escapeButton != QMessageBox::NoButton) = details.buttons.count() > 1 ? QMessageBox::Question : QMessageBox::Information;
msgBox.setEscapeButton(issue.escapeButton); const QMessageBox::StandardButtons buttons = [&details]()
{
QMessageBox::StandardButtons buttons = QMessageBox::NoButton;
for (const QMessageBox::StandardButton &b : details.buttons.keys())
buttons |= b;
return buttons;
}();
QTC_ASSERT(buttons != QMessageBox::NoButton, return Continue);
QMessageBox msgBox(icon, details.title, details.message, buttons, parent);
if (details.defaultButton != QMessageBox::NoButton)
msgBox.setDefaultButton(details.defaultButton);
if (details.escapeButton != QMessageBox::NoButton)
msgBox.setEscapeButton(details.escapeButton);
int boxAction = msgBox.exec(); int boxAction = msgBox.exec();
return issue.buttons.value(static_cast<QMessageBox::StandardButton>(boxAction)); return details.buttons.value(static_cast<QMessageBox::StandardButton>(boxAction));
} }
/*! /*!
@@ -425,14 +429,14 @@ SettingsAccessor::ProceedInfo SettingsAccessor::reportIssues(const QVariantMap &
* *
* Returns a IssueInfo object which is then used by reportIssues. * Returns a IssueInfo object which is then used by reportIssues.
*/ */
SettingsAccessor::IssueInfo SettingsAccessor::findIssues(const QVariantMap &data, const FileName &path) const Utils::optional<SettingsAccessor::IssueInfo>
SettingsAccessor::findIssues(const QVariantMap &data, const FileName &path) const
{ {
SettingsAccessor::IssueInfo result;
const FileName defaultSettingsPath = userFilePath(d->m_baseFile, d->m_userSuffix); const FileName defaultSettingsPath = userFilePath(d->m_baseFile, d->m_userSuffix);
int version = versionFromMap(data); const int version = versionFromMap(data);
if (data.isEmpty() || version < firstSupportedVersion() || version > currentVersion()) { if (data.isEmpty() || version < firstSupportedVersion() || version > currentVersion()) {
IssueInfo result;
result.title = QApplication::translate("Utils::SettingsAccessor", "No Valid Settings Found"); result.title = QApplication::translate("Utils::SettingsAccessor", "No Valid Settings Found");
result.message = QApplication::translate("Utils::SettingsAccessor", result.message = QApplication::translate("Utils::SettingsAccessor",
"<p>No valid settings file could be found.</p>" "<p>No valid settings file could be found.</p>"
@@ -440,7 +444,10 @@ SettingsAccessor::IssueInfo SettingsAccessor::findIssues(const QVariantMap &data
"were either too new or too old to be read.</p>") "were either too new or too old to be read.</p>")
.arg(path.toUserOutput()); .arg(path.toUserOutput());
result.buttons.insert(QMessageBox::Ok, DiscardAndContinue); result.buttons.insert(QMessageBox::Ok, DiscardAndContinue);
} else if ((path != defaultSettingsPath) && (version < currentVersion())) { return result;
}
if ((path != defaultSettingsPath) && (version < currentVersion())) {
IssueInfo result;
result.title = QApplication::translate("Utils::SettingsAccessor", "Using Old Settings"); result.title = QApplication::translate("Utils::SettingsAccessor", "Using Old Settings");
result.message = QApplication::translate("Utils::SettingsAccessor", result.message = QApplication::translate("Utils::SettingsAccessor",
"<p>The versioned backup \"%1\" of the settings " "<p>The versioned backup \"%1\" of the settings "
@@ -452,13 +459,12 @@ SettingsAccessor::IssueInfo SettingsAccessor::findIssues(const QVariantMap &data
"the newer version.</p>").arg(path.toUserOutput()) "the newer version.</p>").arg(path.toUserOutput())
.arg(d->m_applicationDisplayName); .arg(d->m_applicationDisplayName);
result.buttons.insert(QMessageBox::Ok, Continue); result.buttons.insert(QMessageBox::Ok, Continue);
return result;
} }
if (!result.buttons.isEmpty()) const QByteArray readId = settingsIdFromMap(data);
return result;
QByteArray readId = settingsIdFromMap(data);
if (!readId.isEmpty() && readId != settingsId()) { if (!readId.isEmpty() && readId != settingsId()) {
IssueInfo result;
result.title = differentEnvironmentMsg(d->m_displayName); result.title = differentEnvironmentMsg(d->m_displayName);
result.message = QApplication::translate("Utils::EnvironmentIdAccessor", result.message = QApplication::translate("Utils::EnvironmentIdAccessor",
"<p>No .user settings file created by this instance " "<p>No .user settings file created by this instance "
@@ -472,8 +478,10 @@ SettingsAccessor::IssueInfo SettingsAccessor::findIssues(const QVariantMap &data
result.escapeButton = QMessageBox::No; result.escapeButton = QMessageBox::No;
result.buttons.insert(QMessageBox::Yes, SettingsAccessor::Continue); result.buttons.insert(QMessageBox::Yes, SettingsAccessor::Continue);
result.buttons.insert(QMessageBox::No, SettingsAccessor::DiscardAndContinue); result.buttons.insert(QMessageBox::No, SettingsAccessor::DiscardAndContinue);
}
return result; return result;
}
return Utils::nullopt;
} }
void SettingsAccessor::storeSharedSettings(const QVariantMap &data) const void SettingsAccessor::storeSharedSettings(const QVariantMap &data) const

View File

@@ -28,6 +28,7 @@
#include "utils_global.h" #include "utils_global.h"
#include "fileutils.h" #include "fileutils.h"
#include "optional.h"
#include <QHash> #include <QHash>
#include <QVariantMap> #include <QVariantMap>
@@ -80,35 +81,10 @@ public:
typedef QHash<QMessageBox::StandardButton, ProceedInfo> ButtonMap; typedef QHash<QMessageBox::StandardButton, ProceedInfo> ButtonMap;
class IssueInfo { class IssueInfo {
public: public:
IssueInfo() : defaultButton(QMessageBox::NoButton), escapeButton(QMessageBox::NoButton) { }
IssueInfo(const QString &t, const QString &m,
QMessageBox::StandardButton d = QMessageBox::NoButton,
QMessageBox::StandardButton e = QMessageBox::NoButton,
const ButtonMap &b = ButtonMap()) :
title(t), message(m), defaultButton(d), escapeButton(e), buttons(b)
{ }
IssueInfo(const IssueInfo &other) :
title(other.title),
message(other.message),
defaultButton(other.defaultButton),
escapeButton(other.escapeButton),
buttons(other.buttons)
{ }
IssueInfo &operator = (const IssueInfo &other)
{
title = other.title;
message = other.message;
defaultButton = other.defaultButton;
escapeButton = other.escapeButton;
buttons = other.buttons;
return *this;
}
QString title; QString title;
QString message; QString message;
QMessageBox::StandardButton defaultButton; QMessageBox::StandardButton defaultButton = QMessageBox::NoButton;
QMessageBox::StandardButton escapeButton; QMessageBox::StandardButton escapeButton = QMessageBox::NoButton;
QHash<QMessageBox::StandardButton, ProceedInfo> buttons; QHash<QMessageBox::StandardButton, ProceedInfo> buttons;
}; };
@@ -130,7 +106,8 @@ protected:
virtual Utils::FileName backupName(const QVariantMap &data) const; virtual Utils::FileName backupName(const QVariantMap &data) const;
virtual IssueInfo findIssues(const QVariantMap &data, const Utils::FileName &path) const; virtual Utils::optional<IssueInfo> findIssues(const QVariantMap &data,
const Utils::FileName &path) const;
virtual void storeSharedSettings(const QVariantMap &data) const; virtual void storeSharedSettings(const QVariantMap &data) const;
virtual QVariant retrieveSharedSettings() const; virtual QVariant retrieveSharedSettings() const;

View File

@@ -473,11 +473,9 @@ void tst_SettingsAccessor::findIssues_ok()
const QVariantMap data = versionedMap(6, TESTACCESSOR_DEFAULT_ID); const QVariantMap data = versionedMap(6, TESTACCESSOR_DEFAULT_ID);
const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user"); const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user");
const Utils::SettingsAccessor::IssueInfo info = accessor.findIssues(data, path); const Utils::optional<Utils::SettingsAccessor::IssueInfo> info = accessor.findIssues(data, path);
QVERIFY(info.title.isEmpty()); QVERIFY(!info);
QVERIFY(info.message.isEmpty());
QVERIFY(info.buttons.isEmpty());
} }
void tst_SettingsAccessor::findIssues_emptyData() void tst_SettingsAccessor::findIssues_emptyData()
@@ -486,11 +484,9 @@ void tst_SettingsAccessor::findIssues_emptyData()
const QVariantMap data; const QVariantMap data;
const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user"); const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user");
const Utils::SettingsAccessor::IssueInfo info = accessor.findIssues(data, path); const Utils::optional<Utils::SettingsAccessor::IssueInfo> info = accessor.findIssues(data, path);
QVERIFY(!info.title.isEmpty()); QVERIFY(info);
QVERIFY(!info.message.isEmpty());
QVERIFY(!info.buttons.isEmpty());
} }
void tst_SettingsAccessor::findIssues_tooNew() void tst_SettingsAccessor::findIssues_tooNew()
@@ -499,11 +495,9 @@ void tst_SettingsAccessor::findIssues_tooNew()
const QVariantMap data = versionedMap(42, TESTACCESSOR_DEFAULT_ID); const QVariantMap data = versionedMap(42, TESTACCESSOR_DEFAULT_ID);
const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user"); const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user");
const Utils::SettingsAccessor::IssueInfo info = accessor.findIssues(data, path); const Utils::optional<Utils::SettingsAccessor::IssueInfo> info = accessor.findIssues(data, path);
QVERIFY(!info.title.isEmpty()); QVERIFY(info);
QVERIFY(!info.message.isEmpty());
QVERIFY(!info.buttons.isEmpty());
} }
void tst_SettingsAccessor::findIssues_tooOld() void tst_SettingsAccessor::findIssues_tooOld()
@@ -512,11 +506,9 @@ void tst_SettingsAccessor::findIssues_tooOld()
const QVariantMap data = versionedMap(2, TESTACCESSOR_DEFAULT_ID); const QVariantMap data = versionedMap(2, TESTACCESSOR_DEFAULT_ID);
const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user"); const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user");
const Utils::SettingsAccessor::IssueInfo info = accessor.findIssues(data, path); const Utils::optional<Utils::SettingsAccessor::IssueInfo> info = accessor.findIssues(data, path);
QVERIFY(!info.title.isEmpty()); QVERIFY(info);
QVERIFY(!info.message.isEmpty());
QVERIFY(!info.buttons.isEmpty());
} }
void tst_SettingsAccessor::findIssues_wrongId() void tst_SettingsAccessor::findIssues_wrongId()
@@ -525,11 +517,9 @@ void tst_SettingsAccessor::findIssues_wrongId()
const QVariantMap data = versionedMap(6, "foo"); const QVariantMap data = versionedMap(6, "foo");
const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user"); const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user");
const Utils::SettingsAccessor::IssueInfo info = accessor.findIssues(data, path); const Utils::optional<Utils::SettingsAccessor::IssueInfo> info = accessor.findIssues(data, path);
QVERIFY(!info.title.isEmpty()); QVERIFY(info);
QVERIFY(!info.message.isEmpty());
QVERIFY(!info.buttons.isEmpty());
} }
void tst_SettingsAccessor::findIssues_nonDefaultPath() void tst_SettingsAccessor::findIssues_nonDefaultPath()
@@ -538,11 +528,9 @@ void tst_SettingsAccessor::findIssues_nonDefaultPath()
const QVariantMap data = versionedMap(6, TESTACCESSOR_DEFAULT_ID); const QVariantMap data = versionedMap(6, TESTACCESSOR_DEFAULT_ID);
const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user.foobar"); const Utils::FileName path = Utils::FileName::fromString("/foo/bar.user.foobar");
const Utils::SettingsAccessor::IssueInfo info = accessor.findIssues(data, path); const Utils::optional<Utils::SettingsAccessor::IssueInfo> info = accessor.findIssues(data, path);
QVERIFY(!info.title.isEmpty()); QVERIFY(info);
QVERIFY(!info.message.isEmpty());
QVERIFY(!info.buttons.isEmpty());
} }
QTEST_MAIN(tst_SettingsAccessor) QTEST_MAIN(tst_SettingsAccessor)