Fix saving of XML configuration files

... when removing settings

Change-Id: If85061321082a8cd0e35752f71d2498fd4693dfd
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
This commit is contained in:
Tobias Hunger
2012-08-31 17:01:15 +02:00
parent 4e6bec0033
commit fb59a39a78
9 changed files with 49 additions and 50 deletions

View File

@@ -373,20 +373,12 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
} }
PersistentSettingsWriter::PersistentSettingsWriter(const FileName &fileName, const QString &docType) : PersistentSettingsWriter::PersistentSettingsWriter(const FileName &fileName, const QString &docType) :
m_fileName(fileName), m_docType(docType), m_mustSave(false) m_fileName(fileName), m_docType(docType)
{ } { }
void PersistentSettingsWriter::saveValue(const QString &variable, const QVariant &value) bool PersistentSettingsWriter::save(const QVariantMap &data, QWidget *parent) const
{ {
if (m_valueMap.contains(variable) && m_valueMap.value(variable) == value) if (data == m_savedData)
return;
m_mustSave = true;
m_valueMap.insert(variable, value);
}
bool PersistentSettingsWriter::save(QWidget *parent) const
{
if (!m_mustSave)
return true; return true;
QDir tmp; QDir tmp;
@@ -403,8 +395,8 @@ bool PersistentSettingsWriter::save(QWidget *parent) const
arg(QLatin1String(Core::Constants::IDE_VERSION_LONG), arg(QLatin1String(Core::Constants::IDE_VERSION_LONG),
QDateTime::currentDateTime().toString(Qt::ISODate))); QDateTime::currentDateTime().toString(Qt::ISODate)));
w.writeStartElement(ctx.qtCreatorElement); w.writeStartElement(ctx.qtCreatorElement);
const QVariantMap::const_iterator cend = m_valueMap.constEnd(); const QVariantMap::const_iterator cend = data.constEnd();
for (QVariantMap::const_iterator it = m_valueMap.constBegin(); it != cend; ++it) { for (QVariantMap::const_iterator it = data.constBegin(); it != cend; ++it) {
w.writeStartElement(ctx.dataElement); w.writeStartElement(ctx.dataElement);
w.writeTextElement(ctx.variableElement, it.key()); w.writeTextElement(ctx.variableElement, it.key());
writeVariantValue(w, ctx, it.value()); writeVariantValue(w, ctx, it.value());
@@ -416,7 +408,7 @@ bool PersistentSettingsWriter::save(QWidget *parent) const
} }
bool ok = saver.finalize(parent); bool ok = saver.finalize(parent);
if (ok) if (ok)
m_mustSave = false; m_savedData = data;
return ok; return ok;
} }

View File

@@ -60,16 +60,14 @@ class QTCREATOR_UTILS_EXPORT PersistentSettingsWriter
{ {
public: public:
PersistentSettingsWriter(const FileName &fileName, const QString &docType); PersistentSettingsWriter(const FileName &fileName, const QString &docType);
void saveValue(const QString &variable, const QVariant &value); bool save(const QVariantMap &data, QWidget *parent) const;
bool save(QWidget *parent) const;
Utils::FileName fileName() const; Utils::FileName fileName() const;
private: private:
QMap<QString, QVariant> m_valueMap;
const Utils::FileName m_fileName; const Utils::FileName m_fileName;
const QString m_docType; const QString m_docType;
mutable bool m_mustSave; mutable QMap<QString, QVariant> m_savedData;
}; };
} // namespace Utils } // namespace Utils

View File

@@ -136,8 +136,9 @@ void DeviceManager::copy(const DeviceManager *source, DeviceManager *target, boo
void DeviceManager::save() void DeviceManager::save()
{ {
d->writer->saveValue(QLatin1String(DeviceManagerKey), toMap()); QVariantMap data;
d->writer->save(Core::ICore::mainWindow()); data.insert(QLatin1String(DeviceManagerKey), toMap());
d->writer->save(data, Core::ICore::mainWindow());
} }
void DeviceManager::load() void DeviceManager::load()

View File

@@ -227,20 +227,21 @@ void ProfileManager::saveProfiles()
if (!d->m_initialized) // ignore save requests while we are not initialized. if (!d->m_initialized) // ignore save requests while we are not initialized.
return; return;
d->m_writer->saveValue(QLatin1String(PROFILE_FILE_VERSION_KEY), 1); QVariantMap data;
data.insert(QLatin1String(PROFILE_FILE_VERSION_KEY), 1);
int count = 0; int count = 0;
foreach (Profile *p, profiles()) { foreach (Profile *p, profiles()) {
QVariantMap tmp = p->toMap(); QVariantMap tmp = p->toMap();
if (tmp.isEmpty()) if (tmp.isEmpty())
continue; continue;
d->m_writer->saveValue(QString::fromLatin1(PROFILE_DATA_KEY) + QString::number(count), tmp); data.insert(QString::fromLatin1(PROFILE_DATA_KEY) + QString::number(count), tmp);
++count; ++count;
} }
d->m_writer->saveValue(QLatin1String(PROFILE_COUNT_KEY), count); data.insert(QLatin1String(PROFILE_COUNT_KEY), count);
d->m_writer->saveValue(QLatin1String(PROFILE_DEFAULT_KEY), data.insert(QLatin1String(PROFILE_DEFAULT_KEY),
d->m_defaultProfile ? QString::fromLatin1(d->m_defaultProfile->id().name()) : QString()); d->m_defaultProfile ? QString::fromLatin1(d->m_defaultProfile->id().name()) : QString());
d->m_writer->save(Core::ICore::mainWindow()); d->m_writer->save(data, Core::ICore::mainWindow());
} }
bool greaterPriority(ProfileInformation *a, ProfileInformation *b) bool greaterPriority(ProfileInformation *a, ProfileInformation *b)

View File

@@ -312,9 +312,10 @@ bool SessionManager::save()
QLatin1String("QtCreatorSession")); QLatin1String("QtCreatorSession"));
} }
QVariantMap data;
// save the startup project // save the startup project
if (m_startupProject) if (m_startupProject)
m_writer->saveValue(QLatin1String("StartupProject"), m_startupProject->document()->fileName()); data.insert(QLatin1String("StartupProject"), m_startupProject->document()->fileName());
QStringList projectFiles; QStringList projectFiles;
foreach (Project *pro, m_projects) foreach (Project *pro, m_projects)
@@ -326,7 +327,7 @@ bool SessionManager::save()
if (!projectFiles.contains(failed)) if (!projectFiles.contains(failed))
projectFiles << failed; projectFiles << failed;
m_writer->saveValue(QLatin1String("ProjectList"), projectFiles); data.insert(QLatin1String("ProjectList"), projectFiles);
QMap<QString, QVariant> depMap; QMap<QString, QVariant> depMap;
QMap<QString, QStringList>::const_iterator i = m_depMap.constBegin(); QMap<QString, QStringList>::const_iterator i = m_depMap.constBegin();
@@ -339,7 +340,7 @@ bool SessionManager::save()
depMap.insert(key, values); depMap.insert(key, values);
++i; ++i;
} }
m_writer->saveValue(QLatin1String("ProjectDependencies"), QVariant(depMap)); data.insert(QLatin1String("ProjectDependencies"), QVariant(depMap));
int editorCount = 0; int editorCount = 0;
QList<Core::IEditor *> editors = ICore::editorManager()->openedEditors(); QList<Core::IEditor *> editors = ICore::editorManager()->openedEditors();
@@ -348,21 +349,20 @@ bool SessionManager::save()
if (!editor->isTemporary()) if (!editor->isTemporary())
++editorCount; ++editorCount;
} }
m_writer->saveValue(QLatin1String("OpenEditors"), editorCount); data.insert(QLatin1String("OpenEditors"), editorCount);
m_writer->saveValue(QLatin1String("EditorSettings"), data.insert(QLatin1String("EditorSettings"), ICore::editorManager()->saveState().toBase64());
ICore::editorManager()->saveState().toBase64());
QMap<QString, QVariant>::const_iterator it, end; QMap<QString, QVariant>::const_iterator it, end;
end = m_values.constEnd(); end = m_values.constEnd();
QStringList keys; QStringList keys;
for (it = m_values.constBegin(); it != end; ++it) { for (it = m_values.constBegin(); it != end; ++it) {
m_writer->saveValue(QLatin1String("value-") + it.key(), it.value()); data.insert(QLatin1String("value-") + it.key(), it.value());
keys << it.key(); keys << it.key();
} }
m_writer->saveValue(QLatin1String("valueKeys"), keys); data.insert(QLatin1String("valueKeys"), keys);
bool result = m_writer->save(Core::ICore::mainWindow()); bool result = m_writer->save(data, Core::ICore::mainWindow());
if (!result) { if (!result) {
QMessageBox::warning(0, tr("Error while saving session"), QMessageBox::warning(0, tr("Error while saving session"),
tr("Could not save session to file %1").arg(m_writer->fileName().toUserOutput())); tr("Could not save session to file %1").arg(m_writer->fileName().toUserOutput()));

View File

@@ -936,18 +936,20 @@ bool SettingsAccessor::FileAccessor::writeFile(const SettingsData *settings) con
m_writer = new Utils::PersistentSettingsWriter(settings->m_fileName, QLatin1String("QtCreatorProject")); m_writer = new Utils::PersistentSettingsWriter(settings->m_fileName, QLatin1String("QtCreatorProject"));
} }
QVariantMap data;
for (QVariantMap::const_iterator i = settings->m_map.constBegin(); for (QVariantMap::const_iterator i = settings->m_map.constBegin();
i != settings->m_map.constEnd(); i != settings->m_map.constEnd();
++i) { ++i) {
m_writer->saveValue(i.key(), i.value()); data.insert(i.key(), i.value());
} }
m_writer->saveValue(QLatin1String(VERSION_KEY), m_accessor->m_lastVersion + 1); data.insert(QLatin1String(VERSION_KEY), m_accessor->m_lastVersion + 1);
if (m_environmentSpecific) if (m_environmentSpecific)
m_writer->saveValue(QLatin1String(ENVIRONMENT_ID_KEY), data.insert(QLatin1String(ENVIRONMENT_ID_KEY),
ProjectExplorerPlugin::instance()->projectExplorerSettings().environmentId.toString()); ProjectExplorerPlugin::instance()->projectExplorerSettings().environmentId.toString());
return m_writer->save(Core::ICore::mainWindow()); return m_writer->save(data, Core::ICore::mainWindow());
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------

View File

@@ -209,7 +209,8 @@ ToolChainManager::~ToolChainManager()
void ToolChainManager::saveToolChains() void ToolChainManager::saveToolChains()
{ {
d->m_writer->saveValue(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 1); QVariantMap data;
data.insert(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 1);
int count = 0; int count = 0;
foreach (ToolChain *tc, d->toolChains()) { foreach (ToolChain *tc, d->toolChains()) {
@@ -217,12 +218,12 @@ void ToolChainManager::saveToolChains()
QVariantMap tmp = tc->toMap(); QVariantMap tmp = tc->toMap();
if (tmp.isEmpty()) if (tmp.isEmpty())
continue; continue;
d->m_writer->saveValue(QString::fromLatin1(TOOLCHAIN_DATA_KEY) + QString::number(count), tmp); data.insert(QString::fromLatin1(TOOLCHAIN_DATA_KEY) + QString::number(count), tmp);
++count; ++count;
} }
} }
d->m_writer->saveValue(QLatin1String(TOOLCHAIN_COUNT_KEY), count); data.insert(QLatin1String(TOOLCHAIN_COUNT_KEY), count);
d->m_writer->save(Core::ICore::mainWindow()); d->m_writer->save(data, Core::ICore::mainWindow());
// Do not save default debuggers! Those are set by the SDK! // Do not save default debuggers! Those are set by the SDK!
} }

View File

@@ -364,7 +364,9 @@ void QtVersionManager::saveQtVersions()
if (!m_writer) if (!m_writer)
m_writer = new Utils::PersistentSettingsWriter(settingsFileName(QLatin1String(QTVERSION_FILENAME)), m_writer = new Utils::PersistentSettingsWriter(settingsFileName(QLatin1String(QTVERSION_FILENAME)),
QLatin1String("QtCreatorQtVersions")); QLatin1String("QtCreatorQtVersions"));
m_writer->saveValue(QLatin1String(QTVERSION_FILE_VERSION_KEY), 1);
QVariantMap data;
data.insert(QLatin1String(QTVERSION_FILE_VERSION_KEY), 1);
int count = 0; int count = 0;
foreach (BaseQtVersion *qtv, m_versions) { foreach (BaseQtVersion *qtv, m_versions) {
@@ -372,11 +374,11 @@ void QtVersionManager::saveQtVersions()
if (tmp.isEmpty()) if (tmp.isEmpty())
continue; continue;
tmp.insert(QLatin1String(QTVERSION_TYPE_KEY), qtv->type()); tmp.insert(QLatin1String(QTVERSION_TYPE_KEY), qtv->type());
m_writer->saveValue(QString::fromLatin1(QTVERSION_DATA_KEY) + QString::number(count), tmp); data.insert(QString::fromLatin1(QTVERSION_DATA_KEY) + QString::number(count), tmp);
++count; ++count;
} }
m_writer->save(Core::ICore::mainWindow()); m_writer->save(data, Core::ICore::mainWindow());
} }
void QtVersionManager::findSystemQt() void QtVersionManager::findSystemQt()

View File

@@ -286,9 +286,11 @@ void CodeStylePool::exportCodeStyle(const Utils::FileName &fileName, ICodeStyleP
{ {
QVariantMap map; QVariantMap map;
codeStyle->toMap(QString::null, &map); codeStyle->toMap(QString::null, &map);
QVariantMap tmp;
tmp.insert(QLatin1String(displayNameKey), codeStyle->displayName());
tmp.insert(QLatin1String(codeStyleDataKey), map);
Utils::PersistentSettingsWriter writer(fileName, QLatin1String(codeStyleDocKey)); Utils::PersistentSettingsWriter writer(fileName, QLatin1String(codeStyleDocKey));
writer.saveValue(QLatin1String(displayNameKey), codeStyle->displayName()); writer.save(map, 0);
writer.saveValue(QLatin1String(codeStyleDataKey), map);
writer.save(0);
} }