forked from qt-creator/qt-creator
Utils/TextEditor: More use of Store and Key
Change-Id: I2feb47b2e6af7a299912b0c73a0c5d8a0e18a8aa Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
@@ -110,21 +110,21 @@ struct Context // Basic context containing element name string constants.
|
||||
|
||||
struct ParseValueStackEntry
|
||||
{
|
||||
explicit ParseValueStackEntry(QVariant::Type t = QVariant::Invalid, const QString &k = QString()) : type(t), key(k) {}
|
||||
explicit ParseValueStackEntry(const QVariant &aSimpleValue, const QString &k);
|
||||
explicit ParseValueStackEntry(QVariant::Type t = QVariant::Invalid, const Key &k = {}) : type(t), key(k) {}
|
||||
explicit ParseValueStackEntry(const QVariant &aSimpleValue, const Key &k);
|
||||
|
||||
QVariant value() const;
|
||||
void addChild(const QString &key, const QVariant &v);
|
||||
void addChild(const Key &key, const QVariant &v);
|
||||
|
||||
QVariant::Type type;
|
||||
QString key;
|
||||
Key key;
|
||||
QVariant simpleValue;
|
||||
QVariantList listValue;
|
||||
QVariantMap mapValue;
|
||||
Store mapValue;
|
||||
};
|
||||
|
||||
ParseValueStackEntry::ParseValueStackEntry(const QVariant &aSimpleValue, const QString &k) :
|
||||
type(aSimpleValue.type()), key(k), simpleValue(aSimpleValue)
|
||||
ParseValueStackEntry::ParseValueStackEntry(const QVariant &aSimpleValue, const Key &k)
|
||||
: type(aSimpleValue.type()), key(k), simpleValue(aSimpleValue)
|
||||
{
|
||||
QTC_ASSERT(simpleValue.isValid(), return);
|
||||
}
|
||||
@@ -135,7 +135,7 @@ QVariant ParseValueStackEntry::value() const
|
||||
case QVariant::Invalid:
|
||||
return QVariant();
|
||||
case QVariant::Map:
|
||||
return QVariant(mapValue);
|
||||
return QVariant::fromValue(mapValue);
|
||||
case QVariant::List:
|
||||
return QVariant(listValue);
|
||||
default:
|
||||
@@ -144,7 +144,7 @@ QVariant ParseValueStackEntry::value() const
|
||||
return simpleValue;
|
||||
}
|
||||
|
||||
void ParseValueStackEntry::addChild(const QString &key, const QVariant &v)
|
||||
void ParseValueStackEntry::addChild(const Key &key, const QVariant &v)
|
||||
{
|
||||
switch (type) {
|
||||
case QVariant::Map:
|
||||
@@ -163,7 +163,7 @@ void ParseValueStackEntry::addChild(const QString &key, const QVariant &v)
|
||||
class ParseContext : public Context
|
||||
{
|
||||
public:
|
||||
QVariantMap parse(const FilePath &file);
|
||||
Store parse(const FilePath &file);
|
||||
|
||||
private:
|
||||
enum Element { QtCreatorElement, DataElement, VariableElement,
|
||||
@@ -180,11 +180,11 @@ private:
|
||||
static QString formatWarning(const QXmlStreamReader &r, const QString &message);
|
||||
|
||||
QStack<ParseValueStackEntry> m_valueStack;
|
||||
QVariantMap m_result;
|
||||
QString m_currentVariableName;
|
||||
Store m_result;
|
||||
Key m_currentVariableName;
|
||||
};
|
||||
|
||||
QVariantMap ParseContext::parse(const FilePath &file)
|
||||
Store ParseContext::parse(const FilePath &file)
|
||||
{
|
||||
QXmlStreamReader r(file.fileContents().value_or(QByteArray()));
|
||||
|
||||
@@ -204,7 +204,7 @@ QVariantMap ParseContext::parse(const FilePath &file)
|
||||
case QXmlStreamReader::Invalid:
|
||||
qWarning("Error reading %s:%d: %s", qPrintable(file.fileName()),
|
||||
int(r.lineNumber()), qPrintable(r.errorString()));
|
||||
return QVariantMap();
|
||||
return Store();
|
||||
default:
|
||||
break;
|
||||
} // switch token
|
||||
@@ -224,8 +224,8 @@ bool ParseContext::handleStartElement(QXmlStreamReader &r)
|
||||
return false;
|
||||
|
||||
const QXmlStreamAttributes attributes = r.attributes();
|
||||
const QString key = attributes.hasAttribute(keyAttribute) ?
|
||||
attributes.value(keyAttribute).toString() : QString();
|
||||
const Key key = attributes.hasAttribute(keyAttribute) ?
|
||||
attributes.value(keyAttribute).toString() : Key();
|
||||
switch (e) {
|
||||
case SimpleValueElement: {
|
||||
// This reads away the end element, so, handle end element right here.
|
||||
@@ -318,14 +318,14 @@ QVariant ParseContext::readSimpleValue(QXmlStreamReader &r, const QXmlStreamAttr
|
||||
|
||||
PersistentSettingsReader::PersistentSettingsReader() = default;
|
||||
|
||||
QVariant PersistentSettingsReader::restoreValue(const QString &variable, const QVariant &defaultValue) const
|
||||
QVariant PersistentSettingsReader::restoreValue(const Key &variable, const QVariant &defaultValue) const
|
||||
{
|
||||
if (m_valueMap.contains(variable))
|
||||
return m_valueMap.value(variable);
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
QVariantMap PersistentSettingsReader::restoreValues() const
|
||||
Store PersistentSettingsReader::restoreValues() const
|
||||
{
|
||||
return m_valueMap;
|
||||
}
|
||||
@@ -352,13 +352,13 @@ FilePath PersistentSettingsReader::filePath()
|
||||
\class Utils::PersistentSettingsWriter
|
||||
\inmodule QtCreator
|
||||
|
||||
\brief The PersistentSettingsWriter class serializes a QVariantMap of
|
||||
\brief The PersistentSettingsWriter class serializes a Store of
|
||||
arbitrary, nested data structures to an XML file.
|
||||
\sa Utils::PersistentSettingsReader
|
||||
*/
|
||||
|
||||
static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
|
||||
const QVariant &variant, const QString &key = QString())
|
||||
const QVariant &variant, const Key &key = {})
|
||||
{
|
||||
switch (static_cast<int>(variant.type())) {
|
||||
case static_cast<int>(QVariant::StringList):
|
||||
@@ -378,9 +378,9 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
|
||||
w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::Map)));
|
||||
if (!key.isEmpty())
|
||||
w.writeAttribute(ctx.keyAttribute, key);
|
||||
const QVariantMap varMap = variant.toMap();
|
||||
const QVariantMap::const_iterator cend = varMap.constEnd();
|
||||
for (QVariantMap::const_iterator i = varMap.constBegin(); i != cend; ++i)
|
||||
const Store varMap = variant.value<Store>();
|
||||
const Store::const_iterator cend = varMap.constEnd();
|
||||
for (Store::const_iterator i = varMap.constBegin(); i != cend; ++i)
|
||||
writeVariantValue(w, ctx, i.value(), i.key());
|
||||
w.writeEndElement();
|
||||
}
|
||||
@@ -410,7 +410,7 @@ PersistentSettingsWriter::PersistentSettingsWriter(const FilePath &fileName, con
|
||||
m_fileName(fileName), m_docType(docType)
|
||||
{ }
|
||||
|
||||
bool PersistentSettingsWriter::save(const QVariantMap &data, QString *errorString) const
|
||||
bool PersistentSettingsWriter::save(const Store &data, QString *errorString) const
|
||||
{
|
||||
if (data == m_savedData)
|
||||
return true;
|
||||
@@ -418,7 +418,7 @@ bool PersistentSettingsWriter::save(const QVariantMap &data, QString *errorStrin
|
||||
}
|
||||
|
||||
#ifdef QT_GUI_LIB
|
||||
bool PersistentSettingsWriter::save(const QVariantMap &data, QWidget *parent) const
|
||||
bool PersistentSettingsWriter::save(const Store &data, QWidget *parent) const
|
||||
{
|
||||
QString errorString;
|
||||
const bool success = save(data, &errorString);
|
||||
@@ -432,12 +432,12 @@ FilePath PersistentSettingsWriter::fileName() const
|
||||
{ return m_fileName; }
|
||||
|
||||
//** * @brief Set contents of file (e.g. from data read from it). */
|
||||
void PersistentSettingsWriter::setContents(const QVariantMap &data)
|
||||
void PersistentSettingsWriter::setContents(const Store &data)
|
||||
{
|
||||
m_savedData = data;
|
||||
}
|
||||
|
||||
bool PersistentSettingsWriter::write(const QVariantMap &data, QString *errorString) const
|
||||
bool PersistentSettingsWriter::write(const Store &data, QString *errorString) const
|
||||
{
|
||||
m_fileName.parentDir().ensureWritableDir();
|
||||
FileSaver saver(m_fileName, QIODevice::Text);
|
||||
@@ -453,8 +453,8 @@ bool PersistentSettingsWriter::write(const QVariantMap &data, QString *errorStri
|
||||
QCoreApplication::applicationVersion(),
|
||||
QDateTime::currentDateTime().toString(Qt::ISODate)));
|
||||
w.writeStartElement(ctx.qtCreatorElement);
|
||||
const QVariantMap::const_iterator cend = data.constEnd();
|
||||
for (QVariantMap::const_iterator it = data.constBegin(); it != cend; ++it) {
|
||||
const Store::const_iterator cend = data.constEnd();
|
||||
for (Store::const_iterator it = data.constBegin(); it != cend; ++it) {
|
||||
w.writeStartElement(ctx.dataElement);
|
||||
w.writeTextElement(ctx.variableElement, it.key());
|
||||
writeVariantValue(w, ctx, it.value());
|
||||
|
@@ -6,6 +6,7 @@
|
||||
#include "utils_global.h"
|
||||
|
||||
#include "filepath.h"
|
||||
#include "store.h"
|
||||
|
||||
#include <QVariant>
|
||||
|
||||
@@ -19,13 +20,13 @@ class QTCREATOR_UTILS_EXPORT PersistentSettingsReader
|
||||
{
|
||||
public:
|
||||
PersistentSettingsReader();
|
||||
QVariant restoreValue(const QString &variable, const QVariant &defaultValue = QVariant()) const;
|
||||
QVariantMap restoreValues() const;
|
||||
QVariant restoreValue(const Key &variable, const QVariant &defaultValue = {}) const;
|
||||
Store restoreValues() const;
|
||||
bool load(const FilePath &fileName);
|
||||
FilePath filePath();
|
||||
|
||||
private:
|
||||
QMap<QString, QVariant> m_valueMap;
|
||||
Store m_valueMap;
|
||||
FilePath m_filePath;
|
||||
};
|
||||
|
||||
@@ -34,21 +35,21 @@ class QTCREATOR_UTILS_EXPORT PersistentSettingsWriter
|
||||
public:
|
||||
PersistentSettingsWriter(const FilePath &fileName, const QString &docType);
|
||||
|
||||
bool save(const QVariantMap &data, QString *errorString) const;
|
||||
bool save(const Store &data, QString *errorString) const;
|
||||
#ifdef QT_GUI_LIB
|
||||
bool save(const QVariantMap &data, QWidget *parent) const;
|
||||
bool save(const Store &data, QWidget *parent) const;
|
||||
#endif
|
||||
|
||||
FilePath fileName() const;
|
||||
|
||||
void setContents(const QVariantMap &data);
|
||||
void setContents(const Store &data);
|
||||
|
||||
private:
|
||||
bool write(const QVariantMap &data, QString *errorString) const;
|
||||
bool write(const Store &data, QString *errorString) const;
|
||||
|
||||
const FilePath m_fileName;
|
||||
const QString m_docType;
|
||||
mutable QMap<QString, QVariant> m_savedData;
|
||||
mutable Store m_savedData;
|
||||
};
|
||||
|
||||
} // namespace Utils
|
||||
|
@@ -46,9 +46,9 @@ SettingsAccessor::~SettingsAccessor() = default;
|
||||
/*!
|
||||
* Restore settings from disk and report any issues in a message box centered on \a parent.
|
||||
*/
|
||||
QVariantMap SettingsAccessor::restoreSettings(QWidget *parent) const
|
||||
Store SettingsAccessor::restoreSettings(QWidget *parent) const
|
||||
{
|
||||
QTC_ASSERT(!m_baseFilePath.isEmpty(), return QVariantMap());
|
||||
QTC_ASSERT(!m_baseFilePath.isEmpty(), return Store());
|
||||
|
||||
return restoreSettings(m_baseFilePath, parent);
|
||||
}
|
||||
@@ -56,7 +56,7 @@ QVariantMap SettingsAccessor::restoreSettings(QWidget *parent) const
|
||||
/*!
|
||||
* Save \a data to disk and report any issues in a message box centered on \a parent.
|
||||
*/
|
||||
bool SettingsAccessor::saveSettings(const QVariantMap &data, QWidget *parent) const
|
||||
bool SettingsAccessor::saveSettings(const Store &data, QWidget *parent) const
|
||||
{
|
||||
QTC_CHECK(!m_docType.isEmpty());
|
||||
QTC_CHECK(!m_applicationDisplayName.isEmpty());
|
||||
@@ -83,14 +83,14 @@ SettingsAccessor::RestoreData SettingsAccessor::readData(const FilePath &path, Q
|
||||
* Store the \a data in \a path on disk. Do all the necessary preprocessing of the data.
|
||||
*/
|
||||
std::optional<SettingsAccessor::Issue> SettingsAccessor::writeData(const FilePath &path,
|
||||
const QVariantMap &data,
|
||||
const Store &data,
|
||||
QWidget *parent) const
|
||||
{
|
||||
Q_UNUSED(parent)
|
||||
return writeFile(path, prepareToWriteSettings(data));
|
||||
}
|
||||
|
||||
QVariantMap SettingsAccessor::restoreSettings(const FilePath &settingsPath, QWidget *parent) const
|
||||
Store SettingsAccessor::restoreSettings(const FilePath &settingsPath, QWidget *parent) const
|
||||
{
|
||||
QTC_CHECK(!m_docType.isEmpty());
|
||||
QTC_CHECK(!m_applicationDisplayName.isEmpty());
|
||||
@@ -99,7 +99,7 @@ QVariantMap SettingsAccessor::restoreSettings(const FilePath &settingsPath, QWid
|
||||
|
||||
const ProceedInfo pi = result.hasIssue() ? reportIssues(result.issue.value(), result.path, parent)
|
||||
: ProceedInfo::Continue;
|
||||
return pi == ProceedInfo::DiscardAndContinue ? QVariantMap() : result.data;
|
||||
return pi == ProceedInfo::DiscardAndContinue ? Store() : result.data;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -116,7 +116,7 @@ SettingsAccessor::RestoreData SettingsAccessor::readFile(const FilePath &path) c
|
||||
.arg(path.toUserOutput()), Issue::Type::ERROR));
|
||||
}
|
||||
|
||||
const QVariantMap data = reader.restoreValues();
|
||||
const Store data = reader.restoreValues();
|
||||
if (!m_readOnly && path == m_baseFilePath) {
|
||||
if (!m_writer)
|
||||
m_writer = std::make_unique<PersistentSettingsWriter>(m_baseFilePath, m_docType);
|
||||
@@ -132,7 +132,7 @@ SettingsAccessor::RestoreData SettingsAccessor::readFile(const FilePath &path) c
|
||||
* This method does not do *any* processing of the file contents.
|
||||
*/
|
||||
std::optional<SettingsAccessor::Issue> SettingsAccessor::writeFile(const FilePath &path,
|
||||
const QVariantMap &data) const
|
||||
const Store &data) const
|
||||
{
|
||||
if (data.isEmpty()) {
|
||||
return Issue(Tr::tr("Failed to Write File"),
|
||||
@@ -175,7 +175,7 @@ SettingsAccessor::reportIssues(const Issue &issue, const FilePath &path, QWidget
|
||||
/*!
|
||||
* This method is called right after reading data from disk and modifies \a data.
|
||||
*/
|
||||
QVariantMap SettingsAccessor::preprocessReadSettings(const QVariantMap &data) const
|
||||
Store SettingsAccessor::preprocessReadSettings(const Store &data) const
|
||||
{
|
||||
return data;
|
||||
}
|
||||
@@ -183,7 +183,7 @@ QVariantMap SettingsAccessor::preprocessReadSettings(const QVariantMap &data) co
|
||||
/*!
|
||||
* This method is called right before writing data to disk and modifies \a data.
|
||||
*/
|
||||
QVariantMap SettingsAccessor::prepareToWriteSettings(const QVariantMap &data) const
|
||||
Store SettingsAccessor::prepareToWriteSettings(const Store &data) const
|
||||
{
|
||||
return data;
|
||||
}
|
||||
@@ -212,9 +212,9 @@ int BackUpStrategy::compare(const SettingsAccessor::RestoreData &data1,
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::optional<FilePath> BackUpStrategy::backupName(const QVariantMap &oldData,
|
||||
std::optional<FilePath> BackUpStrategy::backupName(const Store &oldData,
|
||||
const FilePath &path,
|
||||
const QVariantMap &data) const
|
||||
const Store &data) const
|
||||
{
|
||||
if (oldData == data)
|
||||
return std::nullopt;
|
||||
@@ -230,7 +230,7 @@ BackingUpSettingsAccessor::readData(const FilePath &path, QWidget *parent) const
|
||||
{
|
||||
const FilePaths fileList = readFileCandidates(path);
|
||||
if (fileList.isEmpty()) // No settings found at all.
|
||||
return RestoreData(path, QVariantMap());
|
||||
return RestoreData(path, Store());
|
||||
|
||||
RestoreData result = bestReadFileData(fileList, parent);
|
||||
if (result.path.isEmpty())
|
||||
@@ -253,7 +253,7 @@ BackingUpSettingsAccessor::readData(const FilePath &path, QWidget *parent) const
|
||||
}
|
||||
|
||||
std::optional<SettingsAccessor::Issue> BackingUpSettingsAccessor::writeData(const FilePath &path,
|
||||
const QVariantMap &data,
|
||||
const Store &data,
|
||||
QWidget *parent) const
|
||||
{
|
||||
if (data.isEmpty())
|
||||
@@ -290,7 +290,7 @@ BackingUpSettingsAccessor::bestReadFileData(const FilePaths &candidates, QWidget
|
||||
return bestMatch;
|
||||
}
|
||||
|
||||
void BackingUpSettingsAccessor::backupFile(const FilePath &path, const QVariantMap &data,
|
||||
void BackingUpSettingsAccessor::backupFile(const FilePath &path, const Store &data,
|
||||
QWidget *parent) const
|
||||
{
|
||||
RestoreData oldSettings = SettingsAccessor::readData(path, parent);
|
||||
@@ -331,9 +331,9 @@ int VersionedBackUpStrategy::compare(const SettingsAccessor::RestoreData &data1,
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::optional<FilePath> VersionedBackUpStrategy::backupName(const QVariantMap &oldData,
|
||||
std::optional<FilePath> VersionedBackUpStrategy::backupName(const Store &oldData,
|
||||
const FilePath &path,
|
||||
const QVariantMap &data) const
|
||||
const Store &data) const
|
||||
{
|
||||
Q_UNUSED(data)
|
||||
FilePath backupName = path;
|
||||
@@ -374,7 +374,7 @@ QString VersionUpgrader::backupExtension() const
|
||||
/*!
|
||||
* Performs a simple renaming of the listed keys in \a changes recursively on \a map.
|
||||
*/
|
||||
QVariantMap VersionUpgrader::renameKeys(const QList<Change> &changes, QVariantMap map) const
|
||||
Store VersionUpgrader::renameKeys(const QList<Change> &changes, Store map) const
|
||||
{
|
||||
for (const Change &change : changes) {
|
||||
const auto oldSetting = map.constFind(change.first);
|
||||
@@ -384,11 +384,11 @@ QVariantMap VersionUpgrader::renameKeys(const QList<Change> &changes, QVariantMa
|
||||
}
|
||||
}
|
||||
|
||||
QVariantMap::iterator i = map.begin();
|
||||
Store::iterator i = map.begin();
|
||||
while (i != map.end()) {
|
||||
QVariant v = i.value();
|
||||
if (v.type() == QVariant::Map)
|
||||
i.value() = renameKeys(changes, v.toMap());
|
||||
i.value() = renameKeys(changes, v.value<Store>());
|
||||
|
||||
++i;
|
||||
}
|
||||
@@ -433,9 +433,9 @@ SettingsAccessor::RestoreData UpgradingSettingsAccessor::readData(const FilePath
|
||||
return upgradeSettings(BackingUpSettingsAccessor::readData(path, parent), currentVersion());
|
||||
}
|
||||
|
||||
QVariantMap UpgradingSettingsAccessor::prepareToWriteSettings(const QVariantMap &data) const
|
||||
Store UpgradingSettingsAccessor::prepareToWriteSettings(const Store &data) const
|
||||
{
|
||||
QVariantMap tmp = BackingUpSettingsAccessor::prepareToWriteSettings(data);
|
||||
Store tmp = BackingUpSettingsAccessor::prepareToWriteSettings(data);
|
||||
|
||||
setVersionInMap(tmp,currentVersion());
|
||||
if (!m_id.isEmpty())
|
||||
@@ -639,7 +639,7 @@ MergingSettingsAccessor::mergeSettings(const SettingsAccessor::RestoreData &main
|
||||
= [this](const SettingsMergeData &global, const SettingsMergeData &local) {
|
||||
return merge(global, local);
|
||||
};
|
||||
const QVariantMap result = mergeQVariantMaps(main.data, secondary.data, mergeFunction).toMap();
|
||||
const Store result = mergeQVariantMaps(main.data, secondary.data, mergeFunction).value<Store>();
|
||||
|
||||
// Update from the base version to Creator's version.
|
||||
return RestoreData(main.path, postprocessMerge(main.data, secondary.data, result));
|
||||
@@ -653,9 +653,9 @@ bool MergingSettingsAccessor::isHouseKeepingKey(const QString &key)
|
||||
return key == VERSION_KEY || key == ORIGINAL_VERSION_KEY || key == SETTINGS_ID_KEY;
|
||||
}
|
||||
|
||||
QVariantMap MergingSettingsAccessor::postprocessMerge(const QVariantMap &main,
|
||||
const QVariantMap &secondary,
|
||||
const QVariantMap &result) const
|
||||
Store MergingSettingsAccessor::postprocessMerge(const Store &main,
|
||||
const Store &secondary,
|
||||
const Store &result) const
|
||||
{
|
||||
Q_UNUSED(main)
|
||||
Q_UNUSED(secondary)
|
||||
@@ -666,56 +666,56 @@ QVariantMap MergingSettingsAccessor::postprocessMerge(const QVariantMap &main,
|
||||
// Helper functions:
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
int versionFromMap(const QVariantMap &data)
|
||||
int versionFromMap(const Store &data)
|
||||
{
|
||||
return data.value(VERSION_KEY, -1).toInt();
|
||||
}
|
||||
|
||||
int originalVersionFromMap(const QVariantMap &data)
|
||||
int originalVersionFromMap(const Store &data)
|
||||
{
|
||||
return data.value(ORIGINAL_VERSION_KEY, versionFromMap(data)).toInt();
|
||||
}
|
||||
|
||||
QByteArray settingsIdFromMap(const QVariantMap &data)
|
||||
QByteArray settingsIdFromMap(const Store &data)
|
||||
{
|
||||
return data.value(SETTINGS_ID_KEY).toByteArray();
|
||||
}
|
||||
|
||||
void setOriginalVersionInMap(QVariantMap &data, int version)
|
||||
void setOriginalVersionInMap(Store &data, int version)
|
||||
{
|
||||
data.insert(ORIGINAL_VERSION_KEY, version);
|
||||
}
|
||||
|
||||
void setVersionInMap(QVariantMap &data, int version)
|
||||
void setVersionInMap(Store &data, int version)
|
||||
{
|
||||
data.insert(VERSION_KEY, version);
|
||||
}
|
||||
|
||||
void setSettingsIdInMap(QVariantMap &data, const QByteArray &id)
|
||||
void setSettingsIdInMap(Store &data, const QByteArray &id)
|
||||
{
|
||||
data.insert(SETTINGS_ID_KEY, id);
|
||||
}
|
||||
|
||||
static QVariant mergeQVariantMapsRecursion(const QVariantMap &mainTree, const QVariantMap &secondaryTree,
|
||||
static QVariant mergeQVariantMapsRecursion(const Store &mainTree, const Store &secondaryTree,
|
||||
const QString &keyPrefix,
|
||||
const QVariantMap &mainSubtree, const QVariantMap &secondarySubtree,
|
||||
const Store &mainSubtree, const Store &secondarySubtree,
|
||||
const SettingsMergeFunction &merge)
|
||||
{
|
||||
QVariantMap result;
|
||||
const QList<QString> allKeys = filteredUnique(mainSubtree.keys() + secondarySubtree.keys());
|
||||
Store result;
|
||||
const QList<Key> allKeys = filteredUnique(mainSubtree.keys() + secondarySubtree.keys());
|
||||
|
||||
MergingSettingsAccessor::SettingsMergeData global = {mainTree, secondaryTree, QString()};
|
||||
MergingSettingsAccessor::SettingsMergeData local = {mainSubtree, secondarySubtree, QString()};
|
||||
MergingSettingsAccessor::SettingsMergeData global = {mainTree, secondaryTree, Key()};
|
||||
MergingSettingsAccessor::SettingsMergeData local = {mainSubtree, secondarySubtree, Key()};
|
||||
|
||||
for (const QString &key : allKeys) {
|
||||
for (const Key &key : allKeys) {
|
||||
global.key = keyPrefix + key;
|
||||
local.key = key;
|
||||
|
||||
std::optional<QPair<QString, QVariant>> mergeResult = merge(global, local);
|
||||
std::optional<QPair<Key, QVariant>> mergeResult = merge(global, local);
|
||||
if (!mergeResult)
|
||||
continue;
|
||||
|
||||
QPair<QString, QVariant> kv = mergeResult.value();
|
||||
QPair<Key, QVariant> kv = mergeResult.value();
|
||||
|
||||
if (kv.second.type() == QVariant::Map) {
|
||||
const QString newKeyPrefix = keyPrefix + kv.first + '/';
|
||||
@@ -727,10 +727,10 @@ static QVariant mergeQVariantMapsRecursion(const QVariantMap &mainTree, const QV
|
||||
result.insert(kv.first, kv.second);
|
||||
}
|
||||
|
||||
return result;
|
||||
return QVariant::fromValue(result);
|
||||
}
|
||||
|
||||
QVariant mergeQVariantMaps(const QVariantMap &mainTree, const QVariantMap &secondaryTree,
|
||||
QVariant mergeQVariantMaps(const Store &mainTree, const Store &secondaryTree,
|
||||
const SettingsMergeFunction &merge)
|
||||
{
|
||||
return mergeQVariantMapsRecursion(mainTree, secondaryTree, QString(),
|
||||
|
@@ -6,10 +6,10 @@
|
||||
#include "utils_global.h"
|
||||
|
||||
#include "filepath.h"
|
||||
#include "store.h"
|
||||
|
||||
#include <QHash>
|
||||
#include <QMessageBox>
|
||||
#include <QVariantMap>
|
||||
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
@@ -20,25 +20,25 @@ namespace Utils {
|
||||
// Helper:
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
QTCREATOR_UTILS_EXPORT int versionFromMap(const QVariantMap &data);
|
||||
QTCREATOR_UTILS_EXPORT int originalVersionFromMap(const QVariantMap &data);
|
||||
QTCREATOR_UTILS_EXPORT QByteArray settingsIdFromMap(const QVariantMap &data);
|
||||
QTCREATOR_UTILS_EXPORT int versionFromMap(const Store &data);
|
||||
QTCREATOR_UTILS_EXPORT int originalVersionFromMap(const Store &data);
|
||||
QTCREATOR_UTILS_EXPORT QByteArray settingsIdFromMap(const Store &data);
|
||||
|
||||
QTCREATOR_UTILS_EXPORT void setVersionInMap(QVariantMap &data, int version);
|
||||
QTCREATOR_UTILS_EXPORT void setOriginalVersionInMap(QVariantMap &data, int version);
|
||||
QTCREATOR_UTILS_EXPORT void setSettingsIdInMap(QVariantMap &data, const QByteArray &id);
|
||||
QTCREATOR_UTILS_EXPORT void setVersionInMap(Store &data, int version);
|
||||
QTCREATOR_UTILS_EXPORT void setOriginalVersionInMap(Store &data, int version);
|
||||
QTCREATOR_UTILS_EXPORT void setSettingsIdInMap(Store &data, const QByteArray &id);
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// Helpers:
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
QTCREATOR_UTILS_EXPORT int versionFromMap(const QVariantMap &data);
|
||||
QTCREATOR_UTILS_EXPORT int originalVersionFromMap(const QVariantMap &data);
|
||||
QTCREATOR_UTILS_EXPORT QByteArray settingsIdFromMap(const QVariantMap &data);
|
||||
QTCREATOR_UTILS_EXPORT int versionFromMap(const Store &data);
|
||||
QTCREATOR_UTILS_EXPORT int originalVersionFromMap(const Store &data);
|
||||
QTCREATOR_UTILS_EXPORT QByteArray settingsIdFromMap(const Store &data);
|
||||
|
||||
QTCREATOR_UTILS_EXPORT void setVersionInMap(QVariantMap &data, int version);
|
||||
QTCREATOR_UTILS_EXPORT void setOriginalVersionInMap(QVariantMap &data, int version);
|
||||
QTCREATOR_UTILS_EXPORT void setSettingsIdInMap(QVariantMap &data, const QByteArray &id);
|
||||
QTCREATOR_UTILS_EXPORT void setVersionInMap(Store &data, int version);
|
||||
QTCREATOR_UTILS_EXPORT void setOriginalVersionInMap(Store &data, int version);
|
||||
QTCREATOR_UTILS_EXPORT void setSettingsIdInMap(Store &data, const QByteArray &id);
|
||||
|
||||
class PersistentSettingsWriter;
|
||||
using SettingsMergeResult = std::optional<QPair<QString, QVariant>>;
|
||||
@@ -76,7 +76,7 @@ public:
|
||||
class RestoreData {
|
||||
public:
|
||||
RestoreData() = default;
|
||||
RestoreData(const FilePath &path, const QVariantMap &data) : path{path}, data{data} { }
|
||||
RestoreData(const FilePath &path, const Store &data) : path{path}, data{data} { }
|
||||
RestoreData(const QString &title, const QString &message, const Issue::Type type) :
|
||||
RestoreData(Issue(title, message, type))
|
||||
{ }
|
||||
@@ -87,12 +87,12 @@ public:
|
||||
bool hasWarning() const { return hasIssue() && issue.value().type == Issue::Type::WARNING; }
|
||||
|
||||
FilePath path;
|
||||
QVariantMap data;
|
||||
Store data;
|
||||
std::optional<Issue> issue;
|
||||
};
|
||||
|
||||
QVariantMap restoreSettings(QWidget *parent) const;
|
||||
bool saveSettings(const QVariantMap &data, QWidget *parent) const;
|
||||
Store restoreSettings(QWidget *parent) const;
|
||||
bool saveSettings(const Store &data, QWidget *parent) const;
|
||||
|
||||
void setBaseFilePath(const FilePath &baseFilePath) { m_baseFilePath = baseFilePath; }
|
||||
void setReadOnly() { m_readOnly = true; }
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
|
||||
virtual RestoreData readData(const FilePath &path, QWidget *parent) const;
|
||||
virtual std::optional<Issue> writeData(const FilePath &path,
|
||||
const QVariantMap &data,
|
||||
const Store &data,
|
||||
QWidget *parent) const;
|
||||
|
||||
void setDocType(const QString &docType) { m_docType = docType; }
|
||||
@@ -108,14 +108,14 @@ public:
|
||||
|
||||
protected:
|
||||
// Report errors:
|
||||
QVariantMap restoreSettings(const FilePath &settingsPath, QWidget *parent) const;
|
||||
Store restoreSettings(const FilePath &settingsPath, QWidget *parent) const;
|
||||
static ProceedInfo reportIssues(const Issue &issue, const FilePath &path, QWidget *parent);
|
||||
|
||||
virtual QVariantMap preprocessReadSettings(const QVariantMap &data) const;
|
||||
virtual QVariantMap prepareToWriteSettings(const QVariantMap &data) const;
|
||||
virtual Store preprocessReadSettings(const Store &data) const;
|
||||
virtual Store prepareToWriteSettings(const Store &data) const;
|
||||
|
||||
virtual RestoreData readFile(const FilePath &path) const;
|
||||
virtual std::optional<Issue> writeFile(const FilePath &path, const QVariantMap &data) const;
|
||||
virtual std::optional<Issue> writeFile(const FilePath &path, const Store &data) const;
|
||||
|
||||
QString m_docType;
|
||||
QString m_applicationDisplayName;
|
||||
@@ -141,9 +141,9 @@ public:
|
||||
virtual int compare(const SettingsAccessor::RestoreData &data1,
|
||||
const SettingsAccessor::RestoreData &data2) const;
|
||||
|
||||
virtual std::optional<FilePath> backupName(const QVariantMap &oldData,
|
||||
virtual std::optional<FilePath> backupName(const Store &oldData,
|
||||
const FilePath &path,
|
||||
const QVariantMap &data) const;
|
||||
const Store &data) const;
|
||||
};
|
||||
|
||||
class QTCREATOR_UTILS_EXPORT BackingUpSettingsAccessor : public SettingsAccessor
|
||||
@@ -153,7 +153,7 @@ public:
|
||||
|
||||
RestoreData readData(const FilePath &path, QWidget *parent) const override;
|
||||
std::optional<Issue> writeData(const FilePath &path,
|
||||
const QVariantMap &data,
|
||||
const Store &data,
|
||||
QWidget *parent) const override;
|
||||
|
||||
BackUpStrategy *strategy() const { return m_strategy.get(); }
|
||||
@@ -162,7 +162,7 @@ public:
|
||||
private:
|
||||
FilePaths readFileCandidates(const FilePath &path) const;
|
||||
RestoreData bestReadFileData(const FilePaths &candidates, QWidget *parent) const;
|
||||
void backupFile(const FilePath &path, const QVariantMap &data, QWidget *parent) const;
|
||||
void backupFile(const FilePath &path, const Store &data, QWidget *parent) const;
|
||||
|
||||
std::unique_ptr<BackUpStrategy> m_strategy;
|
||||
};
|
||||
@@ -183,9 +183,9 @@ public:
|
||||
int compare(const SettingsAccessor::RestoreData &data1,
|
||||
const SettingsAccessor::RestoreData &data2) const override;
|
||||
|
||||
std::optional<FilePath> backupName(const QVariantMap &oldData,
|
||||
std::optional<FilePath> backupName(const Store &oldData,
|
||||
const FilePath &path,
|
||||
const QVariantMap &data) const override;
|
||||
const Store &data) const override;
|
||||
|
||||
const UpgradingSettingsAccessor *accessor() const { return m_accessor; }
|
||||
|
||||
@@ -193,7 +193,7 @@ protected:
|
||||
const UpgradingSettingsAccessor *m_accessor = nullptr;
|
||||
};
|
||||
|
||||
// Handles updating a QVariantMap from version() to version() + 1
|
||||
// Handles updating a Store from version() to version() + 1
|
||||
class QTCREATOR_UTILS_EXPORT VersionUpgrader
|
||||
{
|
||||
public:
|
||||
@@ -203,11 +203,11 @@ public:
|
||||
int version() const;
|
||||
QString backupExtension() const;
|
||||
|
||||
virtual QVariantMap upgrade(const QVariantMap &data) = 0;
|
||||
virtual Store upgrade(const Store &data) = 0;
|
||||
|
||||
protected:
|
||||
using Change = QPair<QLatin1String, QLatin1String>;
|
||||
QVariantMap renameKeys(const QList<Change> &changes, QVariantMap map) const;
|
||||
Store renameKeys(const QList<Change> &changes, Store map) const;
|
||||
|
||||
private:
|
||||
const int m_version;
|
||||
@@ -233,7 +233,7 @@ public:
|
||||
RestoreData readData(const FilePath &path, QWidget *parent) const override;
|
||||
|
||||
protected:
|
||||
QVariantMap prepareToWriteSettings(const QVariantMap &data) const override;
|
||||
Store prepareToWriteSettings(const Store &data) const override;
|
||||
|
||||
void setSettingsId(const QByteArray &id) { m_id = id; }
|
||||
|
||||
@@ -254,9 +254,9 @@ class QTCREATOR_UTILS_EXPORT MergingSettingsAccessor : public UpgradingSettingsA
|
||||
{
|
||||
public:
|
||||
struct SettingsMergeData {
|
||||
QVariantMap main;
|
||||
QVariantMap secondary;
|
||||
QString key;
|
||||
Store main;
|
||||
Store secondary;
|
||||
Key key;
|
||||
};
|
||||
|
||||
MergingSettingsAccessor();
|
||||
@@ -273,8 +273,8 @@ protected:
|
||||
const SettingsMergeData &local) const = 0;
|
||||
static bool isHouseKeepingKey(const QString &key);
|
||||
|
||||
virtual QVariantMap postprocessMerge(const QVariantMap &main, const QVariantMap &secondary,
|
||||
const QVariantMap &result) const;
|
||||
virtual Store postprocessMerge(const Store &main, const Store &secondary,
|
||||
const Store &result) const;
|
||||
|
||||
private:
|
||||
std::unique_ptr<SettingsAccessor> m_secondaryAccessor;
|
||||
@@ -282,7 +282,7 @@ private:
|
||||
|
||||
using SettingsMergeFunction = std::function<SettingsMergeResult(const MergingSettingsAccessor::SettingsMergeData &,
|
||||
const MergingSettingsAccessor::SettingsMergeData &)>;
|
||||
QTCREATOR_UTILS_EXPORT QVariant mergeQVariantMaps(const QVariantMap &mainTree, const QVariantMap &secondaryTree,
|
||||
QTCREATOR_UTILS_EXPORT QVariant mergeQVariantMaps(const Store &mainTree, const Store &secondaryTree,
|
||||
const SettingsMergeFunction &merge);
|
||||
|
||||
} // namespace Utils
|
||||
|
@@ -208,7 +208,7 @@ ICodeStylePreferences *CodeStylePool::loadCodeStyle(const FilePath &fileName)
|
||||
if (m.contains(QLatin1String(codeStyleDataKey))) {
|
||||
const QByteArray id = fileName.completeBaseName().toUtf8();
|
||||
const QString displayName = reader.restoreValue(QLatin1String(displayNameKey)).toString();
|
||||
const QVariantMap map = reader.restoreValue(QLatin1String(codeStyleDataKey)).toMap();
|
||||
const Store map = reader.restoreValue(codeStyleDataKey).value<Store>();
|
||||
if (d->m_factory) {
|
||||
codeStyle = d->m_factory->createCodeStyle();
|
||||
codeStyle->setId(id);
|
||||
@@ -242,10 +242,10 @@ void CodeStylePool::saveCodeStyle(ICodeStylePreferences *codeStyle) const
|
||||
|
||||
void CodeStylePool::exportCodeStyle(const FilePath &fileName, ICodeStylePreferences *codeStyle) const
|
||||
{
|
||||
const QVariantMap map = codeStyle->toMap();
|
||||
const QVariantMap tmp = {
|
||||
const Store map = codeStyle->toMap();
|
||||
const Store tmp = {
|
||||
{displayNameKey, codeStyle->displayName()},
|
||||
{codeStyleDataKey, map}
|
||||
{codeStyleDataKey, QVariant::fromValue(map)}
|
||||
};
|
||||
PersistentSettingsWriter writer(fileName, QLatin1String(codeStyleDocKey));
|
||||
writer.save(tmp, Core::ICore::dialogParent());
|
||||
|
@@ -38,7 +38,7 @@ void ExtraEncodingSettings::fromSettings(const Key &category)
|
||||
Utils::fromSettings(kGroupPostfix, Key(), Core::ICore::settings(), this);
|
||||
}
|
||||
|
||||
QVariantMap ExtraEncodingSettings::toMap() const
|
||||
Store ExtraEncodingSettings::toMap() const
|
||||
{
|
||||
return {
|
||||
{kUtf8BomBehaviorKey, m_utf8BomSetting}
|
||||
|
@@ -15,7 +15,7 @@ public:
|
||||
ExtraEncodingSettings();
|
||||
~ExtraEncodingSettings();
|
||||
|
||||
void toSettings(const QString &category) const;
|
||||
void toSettings(const Utils::Key &category) const;
|
||||
void fromSettings(const Utils::Key &category);
|
||||
|
||||
Utils::Store toMap() const;
|
||||
|
@@ -65,7 +65,7 @@ public:
|
||||
void setCurrentDelegate(const QByteArray &id);
|
||||
|
||||
void setSettingsSuffix(const Utils::Key &suffix);
|
||||
void toSettings(const QString &category) const;
|
||||
void toSettings(const Utils::Key &category) const;
|
||||
void fromSettings(const Utils::Key &category);
|
||||
|
||||
// make below 2 protected?
|
||||
|
Reference in New Issue
Block a user