forked from qt-creator/qt-creator
SettingsAccessor: Factor out basic load/save behavior
Change-Id: I654321167c623b507a9f109e42f77f41df3eccd2 Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#include "settingsaccessor.h"
|
#include "settingsaccessor.h"
|
||||||
|
|
||||||
#include "persistentsettings.h"
|
|
||||||
#include "qtcassert.h"
|
#include "qtcassert.h"
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
@@ -80,6 +79,56 @@ QVariantMap VersionUpgrader::renameKeys(const QList<Change> &changes, QVariantMa
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// BasicSettingsAccessor:
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
BasicSettingsAccessor::BasicSettingsAccessor(const FileName &baseFilePath, const QString &docType) :
|
||||||
|
m_baseFilePath(baseFilePath),
|
||||||
|
m_docType(docType)
|
||||||
|
{
|
||||||
|
QTC_CHECK(!m_baseFilePath.isEmpty());
|
||||||
|
QTC_CHECK(!m_docType.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicSettingsAccessor::~BasicSettingsAccessor() = default;
|
||||||
|
|
||||||
|
QVariantMap BasicSettingsAccessor::restoreSettings(QWidget *parent) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent);
|
||||||
|
return readFile(m_baseFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BasicSettingsAccessor::saveSettings(const QVariantMap &data, QWidget *parent) const
|
||||||
|
{
|
||||||
|
return writeFile(m_baseFilePath, data, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap BasicSettingsAccessor::readFile(const FileName &path) const
|
||||||
|
{
|
||||||
|
PersistentSettingsReader reader;
|
||||||
|
if (!reader.load(path))
|
||||||
|
return QVariantMap();
|
||||||
|
|
||||||
|
return reader.restoreValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BasicSettingsAccessor::writeFile(const FileName &path, const QVariantMap &data, QWidget *parent) const
|
||||||
|
{
|
||||||
|
if (data.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!m_writer || m_writer->fileName() != path)
|
||||||
|
m_writer = std::make_unique<PersistentSettingsWriter>(path, m_docType);
|
||||||
|
|
||||||
|
return m_writer->save(data, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileName BasicSettingsAccessor::baseFilePath() const
|
||||||
|
{
|
||||||
|
return m_baseFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
// SettingsAccessorPrivate:
|
// SettingsAccessorPrivate:
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@@ -112,15 +161,12 @@ public:
|
|||||||
|
|
||||||
std::vector<std::unique_ptr<VersionUpgrader>> m_upgraders;
|
std::vector<std::unique_ptr<VersionUpgrader>> m_upgraders;
|
||||||
std::unique_ptr<PersistentSettingsWriter> m_writer;
|
std::unique_ptr<PersistentSettingsWriter> m_writer;
|
||||||
QString m_docType;
|
|
||||||
QByteArray m_settingsId;
|
QByteArray m_settingsId;
|
||||||
QString m_displayName;
|
QString m_displayName;
|
||||||
QString m_applicationDisplayName;
|
QString m_applicationDisplayName;
|
||||||
|
|
||||||
QString m_userSuffix;
|
QString m_userSuffix;
|
||||||
QString m_sharedSuffix;
|
QString m_sharedSuffix;
|
||||||
|
|
||||||
Utils::FileName m_baseFile;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return path to shared directory for .user files, create if necessary.
|
// Return path to shared directory for .user files, create if necessary.
|
||||||
@@ -196,13 +242,9 @@ static FileName userFilePath(const Utils::FileName &projectFilePath, const QStri
|
|||||||
}
|
}
|
||||||
|
|
||||||
SettingsAccessor::SettingsAccessor(const Utils::FileName &baseFile, const QString &docType) :
|
SettingsAccessor::SettingsAccessor(const Utils::FileName &baseFile, const QString &docType) :
|
||||||
|
BasicSettingsAccessor(baseFile, docType),
|
||||||
d(new SettingsAccessorPrivate)
|
d(new SettingsAccessorPrivate)
|
||||||
{
|
{
|
||||||
QTC_CHECK(!baseFile.isEmpty());
|
|
||||||
QTC_CHECK(!docType.isEmpty());
|
|
||||||
|
|
||||||
d->m_docType = docType;
|
|
||||||
d->m_baseFile = baseFile;
|
|
||||||
d->m_userSuffix = generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_EXTENSION")), ".user");
|
d->m_userSuffix = generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_EXTENSION")), ".user");
|
||||||
d->m_sharedSuffix = generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_SHARED_EXTENSION")), ".shared");
|
d->m_sharedSuffix = generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_SHARED_EXTENSION")), ".shared");
|
||||||
}
|
}
|
||||||
@@ -436,8 +478,7 @@ SettingsAccessor::ProceedInfo SettingsAccessor::reportIssues(const QVariantMap &
|
|||||||
Utils::optional<SettingsAccessor::IssueInfo>
|
Utils::optional<SettingsAccessor::IssueInfo>
|
||||||
SettingsAccessor::findIssues(const QVariantMap &data, const FileName &path) const
|
SettingsAccessor::findIssues(const QVariantMap &data, const FileName &path) const
|
||||||
{
|
{
|
||||||
const FileName defaultSettingsPath = userFilePath(d->m_baseFile, d->m_userSuffix);
|
const FileName defaultSettingsPath = userFilePath(baseFilePath(), d->m_userSuffix);
|
||||||
|
|
||||||
const 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;
|
IssueInfo result;
|
||||||
@@ -581,10 +622,7 @@ bool SettingsAccessor::saveSettings(const QVariantMap &map, QWidget *parent) con
|
|||||||
QVariantMap data = prepareToSaveSettings(map);
|
QVariantMap data = prepareToSaveSettings(map);
|
||||||
|
|
||||||
FileName path = FileName::fromString(defaultFileName(d->m_userSuffix));
|
FileName path = FileName::fromString(defaultFileName(d->m_userSuffix));
|
||||||
if (!d->m_writer || d->m_writer->fileName() != path)
|
return writeFile(path, data, parent);
|
||||||
d->m_writer = std::make_unique<PersistentSettingsWriter>(path, d->m_docType);
|
|
||||||
|
|
||||||
return d->m_writer->save(data, parent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SettingsAccessor::addVersionUpgrader(std::unique_ptr<VersionUpgrader> upgrader)
|
bool SettingsAccessor::addVersionUpgrader(std::unique_ptr<VersionUpgrader> upgrader)
|
||||||
@@ -620,7 +658,7 @@ FileNameList SettingsAccessor::settingsFiles(const QString &suffix) const
|
|||||||
FileNameList result;
|
FileNameList result;
|
||||||
|
|
||||||
QFileInfoList list;
|
QFileInfoList list;
|
||||||
const QFileInfo pfi = d->m_baseFile.toFileInfo();
|
const QFileInfo pfi = baseFilePath().toFileInfo();
|
||||||
const QStringList filter(pfi.fileName() + suffix + '*');
|
const QStringList filter(pfi.fileName() + suffix + '*');
|
||||||
|
|
||||||
if (!sharedUserFileDir().isEmpty()) {
|
if (!sharedUserFileDir().isEmpty()) {
|
||||||
@@ -654,7 +692,7 @@ QString SettingsAccessor::displayName() const
|
|||||||
|
|
||||||
QString SettingsAccessor::defaultFileName(const QString &suffix) const
|
QString SettingsAccessor::defaultFileName(const QString &suffix) const
|
||||||
{
|
{
|
||||||
return userFilePath(d->m_baseFile, suffix).toString();
|
return userFilePath(baseFilePath(), suffix).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
int SettingsAccessor::currentVersion() const
|
int SettingsAccessor::currentVersion() const
|
||||||
@@ -708,7 +746,7 @@ QVariantMap SettingsAccessor::readUserSettings(QWidget *parent) const
|
|||||||
|
|
||||||
result = d->bestSettings(this, fileList);
|
result = d->bestSettings(this, fileList);
|
||||||
if (result.path.isEmpty())
|
if (result.path.isEmpty())
|
||||||
result.path = d->m_baseFile.parentDir();
|
result.path = baseFilePath().parentDir();
|
||||||
|
|
||||||
ProceedInfo proceed = reportIssues(result.map, result.path, parent);
|
ProceedInfo proceed = reportIssues(result.map, result.path, parent);
|
||||||
if (proceed == DiscardAndContinue)
|
if (proceed == DiscardAndContinue)
|
||||||
@@ -720,7 +758,7 @@ QVariantMap SettingsAccessor::readUserSettings(QWidget *parent) const
|
|||||||
QVariantMap SettingsAccessor::readSharedSettings(QWidget *parent) const
|
QVariantMap SettingsAccessor::readSharedSettings(QWidget *parent) const
|
||||||
{
|
{
|
||||||
SettingsAccessorPrivate::Settings sharedSettings;
|
SettingsAccessorPrivate::Settings sharedSettings;
|
||||||
QString fn = d->m_baseFile.toString() + d->m_sharedSuffix;
|
QString fn = baseFilePath().toString() + d->m_sharedSuffix;
|
||||||
sharedSettings.path = FileName::fromString(fn);
|
sharedSettings.path = FileName::fromString(fn);
|
||||||
sharedSettings.map = readFile(sharedSettings.path);
|
sharedSettings.map = readFile(sharedSettings.path);
|
||||||
|
|
||||||
@@ -757,7 +795,8 @@ SettingsAccessorPrivate::Settings SettingsAccessorPrivate::bestSettings(const Se
|
|||||||
{
|
{
|
||||||
Settings bestMatch;
|
Settings bestMatch;
|
||||||
foreach (const FileName &path, pathList) {
|
foreach (const FileName &path, pathList) {
|
||||||
QVariantMap tmp = accessor->readFile(path);
|
const QVariantMap tmp = accessor->prepareSettings(accessor->readFile(path));
|
||||||
|
|
||||||
if (accessor->isBetterMatch(bestMatch.map, tmp)) {
|
if (accessor->isBetterMatch(bestMatch.map, tmp)) {
|
||||||
bestMatch.path = path;
|
bestMatch.path = path;
|
||||||
bestMatch.map = tmp;
|
bestMatch.map = tmp;
|
||||||
@@ -797,13 +836,4 @@ bool SettingsAccessorPrivate::Settings::isValid() const
|
|||||||
return SettingsAccessor::versionFromMap(map) > -1 && !path.isEmpty();
|
return SettingsAccessor::versionFromMap(map) > -1 && !path.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantMap SettingsAccessor::readFile(const FileName &path) const
|
|
||||||
{
|
|
||||||
PersistentSettingsReader reader;
|
|
||||||
if (!reader.load(path))
|
|
||||||
return QVariantMap();
|
|
||||||
|
|
||||||
return prepareSettings(reader.restoreValues());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Utils
|
} // namespace Utils
|
||||||
|
@@ -29,13 +29,39 @@
|
|||||||
|
|
||||||
#include "fileutils.h"
|
#include "fileutils.h"
|
||||||
#include "optional.h"
|
#include "optional.h"
|
||||||
|
#include "persistentsettings.h"
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QVariantMap>
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QVariantMap>
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// BasicSettingsAccessor:
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
class QTCREATOR_UTILS_EXPORT BasicSettingsAccessor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BasicSettingsAccessor(const Utils::FileName &baseFilePath, const QString &docType);
|
||||||
|
virtual ~BasicSettingsAccessor();
|
||||||
|
|
||||||
|
virtual QVariantMap restoreSettings(QWidget *parent) const;
|
||||||
|
virtual bool saveSettings(const QVariantMap &data, QWidget *parent) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QVariantMap readFile(const Utils::FileName &path) const;
|
||||||
|
bool writeFile(const Utils::FileName &path, const QVariantMap &data, QWidget *parent) const;
|
||||||
|
|
||||||
|
Utils::FileName baseFilePath() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Utils::FileName m_baseFilePath;
|
||||||
|
const QString m_docType;
|
||||||
|
mutable std::unique_ptr<PersistentSettingsWriter> m_writer;
|
||||||
|
};
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
// VersionUpgrader:
|
// VersionUpgrader:
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@@ -58,14 +84,14 @@ protected:
|
|||||||
|
|
||||||
class SettingsAccessorPrivate;
|
class SettingsAccessorPrivate;
|
||||||
|
|
||||||
class QTCREATOR_UTILS_EXPORT SettingsAccessor
|
class QTCREATOR_UTILS_EXPORT SettingsAccessor : public BasicSettingsAccessor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit SettingsAccessor(const Utils::FileName &baseFile, const QString &docType);
|
explicit SettingsAccessor(const Utils::FileName &baseFile, const QString &docType);
|
||||||
virtual ~SettingsAccessor();
|
~SettingsAccessor() override;
|
||||||
|
|
||||||
QVariantMap restoreSettings(QWidget *parent) const;
|
QVariantMap restoreSettings(QWidget *parent) const override;
|
||||||
bool saveSettings(const QVariantMap &data, QWidget *parent) const;
|
bool saveSettings(const QVariantMap &data, QWidget *parent) const override;
|
||||||
|
|
||||||
static QVariantMap setVersionInMap(const QVariantMap &data, int version);
|
static QVariantMap setVersionInMap(const QVariantMap &data, int version);
|
||||||
static int versionFromMap(const QVariantMap &data);
|
static int versionFromMap(const QVariantMap &data);
|
||||||
@@ -92,7 +118,6 @@ protected:
|
|||||||
void setSettingsId(const QByteArray &id);
|
void setSettingsId(const QByteArray &id);
|
||||||
void setDisplayName(const QString &dn);
|
void setDisplayName(const QString &dn);
|
||||||
void setApplicationDisplayName(const QString &dn);
|
void setApplicationDisplayName(const QString &dn);
|
||||||
QVariantMap readFile(const Utils::FileName &path) const;
|
|
||||||
QVariantMap upgradeSettings(const QVariantMap &data) const;
|
QVariantMap upgradeSettings(const QVariantMap &data) const;
|
||||||
QVariantMap upgradeSettings(const QVariantMap &data, const int targetVersion) const;
|
QVariantMap upgradeSettings(const QVariantMap &data, const int targetVersion) const;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user