From 788b294a30c1066da01cda7b37b573ef28a2e50a Mon Sep 17 00:00:00 2001 From: Tobias Hunger <tobias.hunger@nokia.com> Date: Tue, 19 Jan 2010 16:33:44 +0100 Subject: [PATCH] Make project use toMap/fromMap to save state * That is what everybody else is using now. Reviewed-by: dt --- .../cmakeprojectmanager/cmakeproject.cpp | 9 +- .../cmakeprojectmanager/cmakeproject.h | 3 +- .../genericprojectmanager/genericproject.cpp | 47 ++--- .../genericprojectmanager/genericproject.h | 5 +- src/plugins/projectexplorer/project.cpp | 189 ++++++++++-------- src/plugins/projectexplorer/project.h | 33 ++- src/plugins/qmlprojectmanager/qmlproject.cpp | 9 +- src/plugins/qmlprojectmanager/qmlproject.h | 4 +- .../qt-s60/s60devicerunconfiguration.cpp | 4 +- .../qt4buildconfiguration.cpp | 5 +- src/plugins/qt4projectmanager/qt4project.cpp | 10 +- src/plugins/qt4projectmanager/qt4project.h | 3 +- 12 files changed, 155 insertions(+), 166 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 6c0cda7c800..1e6658fa51a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -490,14 +490,11 @@ QStringList CMakeProject::files(FilesMode fileMode) const return m_files; } -void CMakeProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer) +bool CMakeProject::fromMap(const QVariantMap &map) { - Project::saveSettingsImpl(writer); -} + if (!Project::fromMap(map)) + return false; -bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader) -{ - Project::restoreSettingsImpl(reader); bool hasUserFile = !buildConfigurations().isEmpty(); MakeStep *makeStep = 0; if (!hasUserFile) { diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index c13935a93f5..30be081c611 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -105,8 +105,7 @@ signals: void targetsChanged(); protected: - virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer); - virtual bool restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader); + virtual bool fromMap(const QVariantMap &map); // called by CMakeBuildSettingsWidget void changeBuildDirectory(CMakeBuildConfiguration *bc, const QString &newBuildDirectory); diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 52cf41a021d..6699e126d35 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -60,6 +60,7 @@ using namespace GenericProjectManager::Internal; using namespace ProjectExplorer; namespace { +const char * const TOOLCHAIN_KEY("GenericProjectManager.GenericProject.Toolchain"); /** * An editable string list model. New strings can be added by editing the entry @@ -431,10 +432,19 @@ QStringList GenericProject::targets() const return targets; } -bool GenericProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader) +QVariantMap GenericProject::toMap() const { - Project::restoreSettingsImpl(reader); + QVariantMap map(Project::toMap()); + map.insert(QLatin1String(TOOLCHAIN_KEY), static_cast<int>(m_toolChainType)); + return map; +} + +bool GenericProject::fromMap(const QVariantMap &map) +{ + if (!Project::fromMap(map)) + return false; + // Add default BC: if (buildConfigurations().isEmpty()) { GenericBuildConfiguration *bc = new GenericBuildConfiguration(this); bc->setDisplayName("all"); @@ -445,34 +455,17 @@ bool GenericProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsRead makeStep->setBuildTarget("all", /* on = */ true); - const QLatin1String buildDirectory("buildDirectory"); - const QFileInfo fileInfo(file()->fileName()); bc->setBuildDirectory(fileInfo.absolutePath()); setActiveBuildConfiguration(bc); } - using namespace ProjectExplorer; - QString toolChainName = reader.restoreValue(QLatin1String("toolChain")).toString(); - bool convertible = false; - ToolChain::ToolChainType type = ToolChain::ToolChainType(toolChainName.toInt(&convertible)); - if (!convertible) { - // legacy string values - if (toolChainName == QLatin1String("gcc")) - type = ToolChain::GCC; - else if (toolChainName == QLatin1String("mingw")) - type = ToolChain::MinGW; - else if (toolChainName == QLatin1String("msvc")) - type = ToolChain::MSVC; - else if (toolChainName == QLatin1String("wince")) - type = ToolChain::WINCE; - } - - setToolChainType(type); // ### move + ToolChain::ToolChainType type = + static_cast<ProjectExplorer::ToolChain::ToolChainType> + (map.value(QLatin1String(TOOLCHAIN_KEY), 0).toInt()); - const QStringList userIncludePaths = - reader.restoreValue(QLatin1String("includePaths")).toStringList(); + setToolChainType(type); setIncludePaths(allIncludePaths()); @@ -480,14 +473,6 @@ bool GenericProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsRead return true; } -void GenericProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer) -{ - Project::saveSettingsImpl(writer); - - writer.saveValue(QLatin1String("toolChain"), m_toolChainType); - writer.saveValue(QLatin1String("includePaths"), m_includePaths); -} - //////////////////////////////////////////////////////////////////////////////////// // GenericBuildSettingsWidget //////////////////////////////////////////////////////////////////////////////////// diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index 3d5aad2adaa..d54004511fd 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -111,9 +111,10 @@ public: ProjectExplorer::ToolChain::ToolChainType toolChainType() const; void setToolChainType(ProjectExplorer::ToolChain::ToolChainType type); + QVariantMap toMap() const; + protected: - virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer); - virtual bool restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader); + virtual bool fromMap(const QVariantMap &map); private: void parseProject(RefreshOptions options); diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 5608f5ee06b..afc2eba0b1e 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -50,6 +50,15 @@ using namespace ProjectExplorer::Internal; namespace { const char * const PROJECT_FILE_POSTFIX(".user"); + +const char * const ACTIVE_BC_KEY("ProjectExplorer.Project.ActiveBuildConfiguration"); +const char * const BC_KEY_PREFIX("ProjectExplorer.Project.BuildConfiguration."); +const char * const BC_COUNT_KEY("ProjectExplorer.Project.BuildConfigurationCount"); + +const char * const ACTIVE_RC_KEY("ProjectExplorer.Project.ActiveRunConfiguration"); +const char * const RC_KEY_PREFIX("ProjectExplorer.Project.RunConfiguration."); +const char * const RC_COUNT_KEY("ProjectExplorer.Project.RunConfigurationCount"); + const char * const EDITOR_SETTINGS_KEY("ProjectExplorer.Project.EditorSettings"); } // namespace @@ -117,6 +126,21 @@ QList<BuildConfiguration *> Project::buildConfigurations() const return m_buildConfigurations; } +BuildConfiguration *Project::activeBuildConfiguration() const +{ + return m_activeBuildConfiguration; +} + +void Project::setActiveBuildConfiguration(BuildConfiguration *configuration) +{ + if (!configuration || + m_activeBuildConfiguration == configuration || + !m_buildConfigurations.contains(configuration)) + return; + m_activeBuildConfiguration = configuration; + emit activeBuildConfigurationChanged(); +} + bool Project::hasBuildSettings() const { return true; @@ -125,7 +149,10 @@ bool Project::hasBuildSettings() const void Project::saveSettings() { PersistentSettingsWriter writer; - saveSettingsImpl(writer); + QVariantMap map(toMap()); + for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) + writer.saveValue(i.key(), i.value()); + writer.save(file()->fileName() + QLatin1String(PROJECT_FILE_POSTFIX), "QtCreatorProject"); } @@ -133,15 +160,10 @@ bool Project::restoreSettings() { PersistentSettingsReader reader; reader.load(file()->fileName() + QLatin1String(PROJECT_FILE_POSTFIX)); - if (!restoreSettingsImpl(reader)) - return false; - if (!m_activeBuildConfiguration && !m_buildConfigurations.isEmpty()) - setActiveBuildConfiguration(m_buildConfigurations.at(0)); + QVariantMap map(reader.restoreValues()); - if (!m_activeRunConfiguration && !m_runConfigurations.isEmpty()) - setActiveRunConfiguration(m_runConfigurations.at(0)); - return true; + return fromMap(map); } QList<BuildConfigWidget*> Project::subConfigWidgets() @@ -149,97 +171,102 @@ QList<BuildConfigWidget*> Project::subConfigWidgets() return QList<BuildConfigWidget*>(); } -void Project::saveSettingsImpl(PersistentSettingsWriter &writer) +QVariantMap Project::toMap() const { const QList<BuildConfiguration *> bcs = buildConfigurations(); - // For compatibility with older versions the "name" is saved as a string instead of a number - writer.saveValue("activebuildconfiguration", QString::number(bcs.indexOf(m_activeBuildConfiguration))); + QVariantMap map; + map.insert(QLatin1String(ACTIVE_BC_KEY), bcs.indexOf(m_activeBuildConfiguration)); + map.insert(QLatin1String(BC_COUNT_KEY), bcs.size()); + for (int i = 0; i < bcs.size(); ++i) + map.insert(QString::fromLatin1(BC_KEY_PREFIX) + QString::number(i), bcs.at(i)->toMap()); - //save buildsettings - QStringList buildConfigurationNames; - for(int i=0; i < bcs.size(); ++i) { - writer.saveValue("buildConfiguration-" + QString::number(i), bcs.at(i)->toMap()); - buildConfigurationNames << QString::number(i); - } - writer.saveValue("buildconfigurations", buildConfigurationNames); - - // Running - int i = 0; - int activeId = 0; - foreach (RunConfiguration* rc, m_runConfigurations) { - writer.saveValue("RunConfiguration" + QString().setNum(i), rc->toMap()); - if (rc == m_activeRunConfiguration) - activeId = i; - ++i; - } - writer.setPrefix(QString::null); - writer.saveValue("activeRunConfiguration", activeId); + const QList<RunConfiguration *> rcs = runConfigurations(); + map.insert(QLatin1String(ACTIVE_RC_KEY), rcs.indexOf(m_activeRunConfiguration)); + map.insert(QLatin1String(RC_COUNT_KEY), rcs.size()); + for (int i = 0; i < rcs.size(); ++i) + map.insert(QString::fromLatin1(RC_KEY_PREFIX) + QString::number(i), rcs.at(i)->toMap()); - writer.saveValue(QLatin1String(EDITOR_SETTINGS_KEY), m_editorConfiguration->toMap()); + map.insert(QLatin1String(EDITOR_SETTINGS_KEY), m_editorConfiguration->toMap()); + + return map; } -bool Project::restoreSettingsImpl(PersistentSettingsReader &reader) +bool Project::fromMap(const QVariantMap &map) { - // restoring BuldConfigurations from settings - const QStringList buildConfigurationNames = reader.restoreValue("buildconfigurations").toStringList(); - - foreach (const QString &buildConfigurationName, buildConfigurationNames) { - QVariantMap temp(reader.restoreValue("buildConfiguration-" + buildConfigurationName).toMap()); - BuildConfiguration *bc = buildConfigurationFactory()->restore(this, temp); - addBuildConfiguration(bc); + if (map.contains(QLatin1String(EDITOR_SETTINGS_KEY))) { + QVariantMap values(map.value(QLatin1String(EDITOR_SETTINGS_KEY)).toMap()); + if (!m_editorConfiguration->fromMap(values)) + return false; } - { // Try restoring the active configuration - QString activeConfigurationName = reader.restoreValue("activebuildconfiguration").toString(); - int index = buildConfigurationNames.indexOf(activeConfigurationName); - if (index != -1) - m_activeBuildConfiguration = buildConfigurations().at(index); - else if (!buildConfigurations().isEmpty()) - m_activeBuildConfiguration = buildConfigurations().at(0); - else - m_activeBuildConfiguration = 0; + bool ok; + int maxI(map.value(QLatin1String(BC_COUNT_KEY), 0).toInt(&ok)); + if (!ok || maxI < 0) + maxI = 0; + int activeConfiguration(map.value(QLatin1String(ACTIVE_BC_KEY), 0).toInt(&ok)); + if (!ok || activeConfiguration < 0) + activeConfiguration = 0; + if (0 > activeConfiguration || maxI < activeConfiguration) + activeConfiguration = 0; + + for (int i = 0; i < maxI; ++i) { + const QString key(QString::fromLatin1(BC_KEY_PREFIX) + QString::number(i)); + if (!map.contains(key)) + return false; + if (!buildConfigurationFactory()->canRestore(this, map.value(key).toMap())) + return false; + BuildConfiguration *bc(buildConfigurationFactory()->restore(this, map.value(key).toMap())); + if (!bc) + continue; + addBuildConfiguration(bc); + if (i == activeConfiguration) + setActiveBuildConfiguration(bc); } + if (!activeBuildConfiguration() && !m_buildConfigurations.isEmpty()) + setActiveBuildConfiguration(m_buildConfigurations.at(0)); - // Running - const int activeId = reader.restoreValue("activeRunConfiguration").toInt(); - int i = 0; - const QList<IRunConfigurationFactory *> factories = - ExtensionSystem::PluginManager::instance()->getObjects<IRunConfigurationFactory>(); - forever { - QVariantMap values(reader.restoreValue("RunConfiguration" + QString().setNum(i)).toMap()); - if (values.isEmpty()) + maxI = map.value(QLatin1String(RC_COUNT_KEY), 0).toInt(&ok); + if (!ok || maxI < 0) + maxI = 0; + activeConfiguration = map.value(QLatin1String(ACTIVE_RC_KEY), 0).toInt(&ok); + if (!ok || activeConfiguration < 0) + activeConfiguration = 0; + if (0 > activeConfiguration || maxI < activeConfiguration) + activeConfiguration = 0; + + QList<IRunConfigurationFactory *> + factories(ExtensionSystem::PluginManager::instance()-> + getObjects<IRunConfigurationFactory>()); + + for (int i = 0; i < maxI; ++i) { + const QString key(QString::fromLatin1(RC_KEY_PREFIX) + QString::number(i)); + if (!map.contains(key)) + return false; + + QVariantMap valueMap(map.value(key).toMap()); + IRunConfigurationFactory *factory(0); + foreach (IRunConfigurationFactory *f, factories) { + if (!f->canRestore(this, valueMap)) + continue; + factory = f; break; - foreach (IRunConfigurationFactory *factory, factories) { - if (factory->canRestore(this, values)) { - RunConfiguration* rc = factory->restore(this, values); - if (!rc) - continue; - addRunConfiguration(rc); - if (i == activeId) - setActiveRunConfiguration(rc); - } } - ++i; + if (!factory) + return false; + + RunConfiguration *rc(factory->restore(this, valueMap)); + if (!rc) + return false; + addRunConfiguration(rc); + if (i == activeConfiguration) + setActiveRunConfiguration(rc); } + if (!activeRunConfiguration() && !m_runConfigurations.isEmpty()) setActiveRunConfiguration(m_runConfigurations.at(0)); - QVariantMap tmp = reader.restoreValue(QLatin1String(EDITOR_SETTINGS_KEY)).toMap(); - return m_editorConfiguration->fromMap(tmp); -} - -BuildConfiguration *Project::activeBuildConfiguration() const -{ - return m_activeBuildConfiguration; -} - -void Project::setActiveBuildConfiguration(BuildConfiguration *configuration) -{ - if (m_activeBuildConfiguration != configuration && m_buildConfigurations.contains(configuration)) { - m_activeBuildConfiguration = configuration; - emit activeBuildConfigurationChanged(); - } + return true; } QList<RunConfiguration *> Project::runConfigurations() const diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index eb9d29520bb..3d163912b12 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -124,12 +124,22 @@ public: virtual QStringList frameworkPaths(const QString &fileName) const; static QString makeUnique(const QString &preferedName, const QStringList &usedNames); + + // Serialize all data into a QVariantMap. This map is then saved + // in the .user file of the project. + // + // Just put all your data into the map. + // + // Note: Do not forget to call your base class' toMap method. + // Note: Do not forget to call setActiveBuildConfiguration when + // creating new BuilConfigurations. + virtual QVariantMap toMap() const; + signals: void fileListChanged(); // TODO clean up signal names // might be better to also have aboutToRemove signals -// a runconfiguration display name changed is missing void activeBuildConfigurationChanged(); void activeRunConfigurationChanged(); void runConfigurationsEnabledStateChanged(); @@ -141,23 +151,10 @@ signals: void addedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); protected: - /* This method is called when the project .user file is saved. Simply call - * writer.saveValue() for each value you want to save. Make sure to always - * call your base class implementation. - * - * Note: All the values from the project/buildsteps and buildconfigurations - * are automatically stored. - */ - virtual void saveSettingsImpl(PersistentSettingsWriter &writer); - - /* This method is called when the project is opened. You can retrieve all - * the values you saved in saveSettingsImpl() in this method. - * - * Note: This function is also called if there is no .user file. You should - * probably add some default build and run settings to the project so that - * it can be build and run. - */ - virtual bool restoreSettingsImpl(PersistentSettingsReader &reader); + // restore all data from the map. + // + // Note: Do not forget to call your base class' fromMap method! + virtual bool fromMap(const QVariantMap &map); private: QList<BuildConfiguration *> m_buildConfigurations; diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index fd3d4d32e2b..40203453b3f 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -281,9 +281,9 @@ QStringList QmlProject::files(FilesMode) const return files(); } -bool QmlProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader) +bool QmlProject::fromMap(const QVariantMap &map) { - Project::restoreSettingsImpl(reader); + Project::fromMap(map); if (runConfigurations().isEmpty()) { QmlRunConfiguration *runConf = new QmlRunConfiguration(this); @@ -294,11 +294,6 @@ bool QmlProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader & return true; } -void QmlProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer) -{ - Project::saveSettingsImpl(writer); -} - //////////////////////////////////////////////////////////////////////////////////// // QmlProjectFile //////////////////////////////////////////////////////////////////////////////////// diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index f73993b601f..b1dd6852287 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -50,7 +50,6 @@ class QmlModelManagerInterface; } namespace QmlProjectManager { - class QmlProject; class QmlRunConfiguration; @@ -193,8 +192,7 @@ private slots: void refreshFiles(); protected: - virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer); - virtual bool restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader); + bool fromMap(const QVariantMap &map); private: // plain format diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 803800b8be4..48254a66cdc 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -77,9 +77,7 @@ const int PROGRESS_PACKAGEDEPLOYED = 300; const int PROGRESS_PACKAGEINSTALLED = 400; const int PROGRESS_MAX = 400; -enum { - debug = false -}; +enum { debug = 0 }; // Format information about a file QString lsFile(const QString &f) diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index fc150595e88..f175e05e0da 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -51,10 +51,7 @@ const char * const TOOLCHAIN_KEY("Qt4ProjectManager.Qt4BuildConfiguration.ToolCh const char * const BUILD_CONFIGURATION_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration"); const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId"); -enum { - debug = false -}; - +enum { debug = 0 }; } Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro) : diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 6ce3fe962ce..f071a37583e 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -271,9 +271,10 @@ void Qt4Project::updateFileList() } } -bool Qt4Project::restoreSettingsImpl(PersistentSettingsReader &settingsReader) +bool Qt4Project::fromMap(const QVariantMap &map) { - Project::restoreSettingsImpl(settingsReader); + if (!Project::fromMap(map)) + return false; if (buildConfigurations().isEmpty()) addDefaultBuild(); @@ -374,11 +375,6 @@ void Qt4Project::slotActiveBuildConfigurationChanged() emit targetInformationChanged(); } -void Qt4Project::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer) -{ - Project::saveSettingsImpl(writer); -} - ProjectExplorer::IBuildConfigurationFactory *Qt4Project::buildConfigurationFactory() const { return m_buildConfigurationFactory; diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index f7070fbffd3..ff299ce72d2 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -215,8 +215,7 @@ private slots: const Qt4ProjectManager::Internal::Qt4ProjectType newType); protected: - virtual bool restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &settingsReader); - virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer); + virtual bool fromMap(const QVariantMap &map); private: static void collectApplicationProFiles(QList<Internal::Qt4ProFileNode *> &list, Internal::Qt4ProFileNode *node); -- GitLab