forked from qt-creator/qt-creator
SettingsAccessor: Move code around
No change is intended but the moving of entire classes, methods or functions. Change-Id: I18d3462bb97c203aee1b81f3c0d7a429a9aa3e86 Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
@@ -50,6 +50,102 @@ static QString generateSuffix(const QString &alt1, const QString &alt2)
|
|||||||
return suffix;
|
return suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Operation {
|
||||||
|
public:
|
||||||
|
virtual ~Operation() { }
|
||||||
|
|
||||||
|
virtual void apply(QVariantMap &userMap, const QString &key, const QVariant &sharedValue) = 0;
|
||||||
|
|
||||||
|
void synchronize(QVariantMap &userMap, const QVariantMap &sharedMap)
|
||||||
|
{
|
||||||
|
QVariantMap::const_iterator it = sharedMap.begin();
|
||||||
|
QVariantMap::const_iterator eit = sharedMap.end();
|
||||||
|
|
||||||
|
for (; it != eit; ++it) {
|
||||||
|
const QString &key = it.key();
|
||||||
|
if (key == VERSION_KEY || key == SETTINGS_ID_KEY)
|
||||||
|
continue;
|
||||||
|
const QVariant &sharedValue = it.value();
|
||||||
|
const QVariant &userValue = userMap.value(key);
|
||||||
|
if (sharedValue.type() == QVariant::Map) {
|
||||||
|
if (userValue.type() != QVariant::Map) {
|
||||||
|
// This should happen only if the user manually changed the file in such a way.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
QVariantMap nestedUserMap = userValue.toMap();
|
||||||
|
synchronize(nestedUserMap, sharedValue.toMap());
|
||||||
|
userMap.insert(key, nestedUserMap);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (userMap.contains(key) && userValue != sharedValue) {
|
||||||
|
apply(userMap, key, sharedValue);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MergeSettingsOperation : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void apply(QVariantMap &userMap, const QString &key, const QVariant &sharedValue)
|
||||||
|
{
|
||||||
|
// Do not override bookkeeping settings:
|
||||||
|
if (key == ORIGINAL_VERSION_KEY || key == VERSION_KEY)
|
||||||
|
return;
|
||||||
|
if (!userMap.value(USER_STICKY_KEYS_KEY).toList().contains(key))
|
||||||
|
userMap.insert(key, sharedValue);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TrackStickyness : public Operation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void apply(QVariantMap &userMap, const QString &key, const QVariant &)
|
||||||
|
{
|
||||||
|
const QString stickyKey = USER_STICKY_KEYS_KEY;
|
||||||
|
QVariantList sticky = userMap.value(stickyKey).toList();
|
||||||
|
sticky.append(key);
|
||||||
|
userMap.insert(stickyKey, sticky);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// When restoring settings...
|
||||||
|
// We check whether a .shared file exists. If so, we compare the settings in this file with
|
||||||
|
// corresponding ones in the .user file. Whenever we identify a corresponding setting which
|
||||||
|
// has a different value and which is not marked as sticky, we merge the .shared value into
|
||||||
|
// the .user value.
|
||||||
|
QVariantMap mergeSharedSettings(const QVariantMap &userMap, const QVariantMap &sharedMap)
|
||||||
|
{
|
||||||
|
QVariantMap result = userMap;
|
||||||
|
if (sharedMap.isEmpty())
|
||||||
|
return result;
|
||||||
|
if (userMap.isEmpty())
|
||||||
|
return sharedMap;
|
||||||
|
|
||||||
|
MergeSettingsOperation op;
|
||||||
|
op.synchronize(result, sharedMap);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When saving settings...
|
||||||
|
// If a .shared file was considered in the previous restoring step, we check whether for
|
||||||
|
// any of the current .shared settings there's a .user one which is different. If so, this
|
||||||
|
// means the user explicitly changed it and we mark this setting as sticky.
|
||||||
|
// Note that settings are considered sticky only when they differ from the .shared ones.
|
||||||
|
// Although this approach is more flexible than permanent/forever sticky settings, it has
|
||||||
|
// the side-effect that if a particular value unintentionally becomes the same in both
|
||||||
|
// the .user and .shared files, this setting will "unstick".
|
||||||
|
void trackUserStickySettings(QVariantMap &userMap, const QVariantMap &sharedMap)
|
||||||
|
{
|
||||||
|
if (sharedMap.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
TrackStickyness op;
|
||||||
|
op.synchronize(userMap, sharedMap);
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace
|
} // end namespace
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
@@ -278,71 +374,6 @@ SettingsAccessor::~SettingsAccessor()
|
|||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
class Operation {
|
|
||||||
public:
|
|
||||||
virtual ~Operation() { }
|
|
||||||
|
|
||||||
virtual void apply(QVariantMap &userMap, const QString &key, const QVariant &sharedValue) = 0;
|
|
||||||
|
|
||||||
void synchronize(QVariantMap &userMap, const QVariantMap &sharedMap)
|
|
||||||
{
|
|
||||||
QVariantMap::const_iterator it = sharedMap.begin();
|
|
||||||
QVariantMap::const_iterator eit = sharedMap.end();
|
|
||||||
|
|
||||||
for (; it != eit; ++it) {
|
|
||||||
const QString &key = it.key();
|
|
||||||
if (key == VERSION_KEY || key == SETTINGS_ID_KEY)
|
|
||||||
continue;
|
|
||||||
const QVariant &sharedValue = it.value();
|
|
||||||
const QVariant &userValue = userMap.value(key);
|
|
||||||
if (sharedValue.type() == QVariant::Map) {
|
|
||||||
if (userValue.type() != QVariant::Map) {
|
|
||||||
// This should happen only if the user manually changed the file in such a way.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
QVariantMap nestedUserMap = userValue.toMap();
|
|
||||||
synchronize(nestedUserMap, sharedValue.toMap());
|
|
||||||
userMap.insert(key, nestedUserMap);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (userMap.contains(key) && userValue != sharedValue) {
|
|
||||||
apply(userMap, key, sharedValue);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class MergeSettingsOperation : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void apply(QVariantMap &userMap, const QString &key, const QVariant &sharedValue)
|
|
||||||
{
|
|
||||||
// Do not override bookkeeping settings:
|
|
||||||
if (key == ORIGINAL_VERSION_KEY || key == VERSION_KEY)
|
|
||||||
return;
|
|
||||||
if (!userMap.value(USER_STICKY_KEYS_KEY).toList().contains(key))
|
|
||||||
userMap.insert(key, sharedValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class TrackStickyness : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void apply(QVariantMap &userMap, const QString &key, const QVariant &)
|
|
||||||
{
|
|
||||||
const QString stickyKey = USER_STICKY_KEYS_KEY;
|
|
||||||
QVariantList sticky = userMap.value(stickyKey).toList();
|
|
||||||
sticky.append(key);
|
|
||||||
userMap.insert(stickyKey, sticky);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
int SettingsAccessor::versionFromMap(const QVariantMap &data)
|
int SettingsAccessor::versionFromMap(const QVariantMap &data)
|
||||||
{
|
{
|
||||||
return data.value(VERSION_KEY, -1).toInt();
|
return data.value(VERSION_KEY, -1).toInt();
|
||||||
@@ -570,45 +601,6 @@ QString SettingsAccessor::differentEnvironmentMsg(const QString &projectName)
|
|||||||
.arg(projectName);
|
.arg(projectName);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
// When restoring settings...
|
|
||||||
// We check whether a .shared file exists. If so, we compare the settings in this file with
|
|
||||||
// corresponding ones in the .user file. Whenever we identify a corresponding setting which
|
|
||||||
// has a different value and which is not marked as sticky, we merge the .shared value into
|
|
||||||
// the .user value.
|
|
||||||
QVariantMap mergeSharedSettings(const QVariantMap &userMap, const QVariantMap &sharedMap)
|
|
||||||
{
|
|
||||||
QVariantMap result = userMap;
|
|
||||||
if (sharedMap.isEmpty())
|
|
||||||
return result;
|
|
||||||
if (userMap.isEmpty())
|
|
||||||
return sharedMap;
|
|
||||||
|
|
||||||
MergeSettingsOperation op;
|
|
||||||
op.synchronize(result, sharedMap);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// When saving settings...
|
|
||||||
// If a .shared file was considered in the previous restoring step, we check whether for
|
|
||||||
// any of the current .shared settings there's a .user one which is different. If so, this
|
|
||||||
// means the user explicitly changed it and we mark this setting as sticky.
|
|
||||||
// Note that settings are considered sticky only when they differ from the .shared ones.
|
|
||||||
// Although this approach is more flexible than permanent/forever sticky settings, it has
|
|
||||||
// the side-effect that if a particular value unintentionally becomes the same in both
|
|
||||||
// the .user and .shared files, this setting will "unstick".
|
|
||||||
void trackUserStickySettings(QVariantMap &userMap, const QVariantMap &sharedMap)
|
|
||||||
{
|
|
||||||
if (sharedMap.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
TrackStickyness op;
|
|
||||||
op.synchronize(userMap, sharedMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // Anonymous
|
|
||||||
|
|
||||||
QByteArray SettingsAccessor::settingsIdFromMap(const QVariantMap &data)
|
QByteArray SettingsAccessor::settingsIdFromMap(const QVariantMap &data)
|
||||||
{
|
{
|
||||||
return data.value(SETTINGS_ID_KEY).toByteArray();
|
return data.value(SETTINGS_ID_KEY).toByteArray();
|
||||||
|
Reference in New Issue
Block a user