From fe313a9023a24ce264e9d64bf12df797ef0af0d8 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Mon, 28 Sep 2009 17:30:11 +0200
Subject: [PATCH] Configuration types for each Qt Version.

---
 .../projectexplorer/buildconfiguration.h      |  3 ++
 .../buildsettingspropertiespage.cpp           | 15 ++++---
 .../buildsettingspropertiespage.h             |  3 +-
 src/plugins/qt4projectmanager/qt4project.cpp  | 39 +++++++++++++++----
 src/plugins/qt4projectmanager/qt4project.h    | 12 ++++++
 5 files changed, 57 insertions(+), 15 deletions(-)

diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index a38664c49c6..9123398f6af 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -81,6 +81,9 @@ public:
 // restore
 // clone
     virtual QList<BuildConfiguration *> createDefaultConfigurations() const = 0;
+
+signals:
+    void availableCreationTypesChanged();
 };
 
 } // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
index 395685c293c..af8628e20c3 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
@@ -164,7 +164,9 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
     m_subWidgets = new BuildSettingsSubWidgets(this);
     vbox->addWidget(m_subWidgets);
 
-    createAddButtonMenu();
+    m_addButtonMenu = new QMenu(this);
+    m_addButton->setMenu(m_addButtonMenu);
+    updateAddButtonMenu();
 
     m_buildConfiguration = m_project->activeBuildConfiguration()->name();
 
@@ -176,23 +178,24 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
 
     connect(m_project, SIGNAL(buildConfigurationDisplayNameChanged(const QString &)),
             this, SLOT(buildConfigurationDisplayNameChanged(const QString &)));
+    if (m_project->buildConfigurationFactory())
+        connect(m_project->buildConfigurationFactory(), SIGNAL(availableCreationTypesChanged()), SLOT(updateAddButtonMenu()));
 
     updateBuildSettings();
 }
 
-void BuildSettingsWidget::createAddButtonMenu()
+void BuildSettingsWidget::updateAddButtonMenu()
 {
-    QMenu *addButtonMenu = new QMenu(this);
-    addButtonMenu->addAction(tr("&Clone Selected"),
+    m_addButtonMenu->clear();
+    m_addButtonMenu->addAction(tr("&Clone Selected"),
                              this, SLOT(cloneConfiguration()));
     IBuildConfigurationFactory *factory = m_project->buildConfigurationFactory();
     if (factory) {
         foreach (const QString &type, factory->availableCreationTypes()) {
-            QAction *action = addButtonMenu->addAction(factory->displayNameForType(type), this, SLOT(createConfiguration()));
+            QAction *action = m_addButtonMenu->addAction(factory->displayNameForType(type), this, SLOT(createConfiguration()));
             action->setData(type);
         }
     }
-    m_addButton->setMenu(addButtonMenu);
 }
 
 void BuildSettingsWidget::buildConfigurationDisplayNameChanged(const QString &buildConfiguration)
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.h b/src/plugins/projectexplorer/buildsettingspropertiespage.h
index 97d73494955..bb83c0c6ec7 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.h
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.h
@@ -98,11 +98,11 @@ private slots:
     void createConfiguration();
     void cloneConfiguration();
     void deleteConfiguration();
+    void updateAddButtonMenu();
 
 private:
     void cloneConfiguration(const QString &toClone);
     void deleteConfiguration(const QString &toDelete);
-    void createAddButtonMenu();
 
     Project *m_project;
     QPushButton *m_addButton;
@@ -110,6 +110,7 @@ private:
     QComboBox *m_buildConfigurationComboBox;
     BuildSettingsSubWidgets *m_subWidgets;
     QString m_buildConfiguration;
+    QMenu *m_addButtonMenu;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 8e29e22a40d..5ec2b528e7a 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -68,6 +68,10 @@ using namespace ProjectExplorer;
 
 enum { debug = 0 };
 
+namespace {
+    const char * const KEY_QT_VERSION_ID = "QtVersionId";
+}
+
 namespace Qt4ProjectManager {
 namespace Internal {
 
@@ -234,25 +238,42 @@ Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(Qt4Project *project)
     : IBuildConfigurationFactory(project),
     m_project(project)
 {
+    update();
 }
 
 Qt4BuildConfigurationFactory::~Qt4BuildConfigurationFactory()
 {
 }
 
+void Qt4BuildConfigurationFactory::update()
+{
+
+    m_versions.clear();
+    m_versions.insert(QLatin1String("DefaultQt"), VersionInfo(tr("Using Default Qt Version"), 0));
+    QtVersionManager *vm = QtVersionManager::instance();
+    foreach (const QtVersion *version, vm->versions()) {
+        m_versions.insert(QString::fromLatin1("Qt%1").arg(version->uniqueId()),
+                          VersionInfo(tr("Using Qt Version \"%1\"").arg(version->name()), version->uniqueId()));
+    }
+    emit availableCreationTypesChanged();
+}
+
 QStringList Qt4BuildConfigurationFactory::availableCreationTypes() const
 {
-    return QStringList() << "DefaultQt";
+    return m_versions.keys();
 }
 
 QString Qt4BuildConfigurationFactory::displayNameForType(const QString &type) const
 {
-    return tr("Using Default Qt Version");
+    if (m_versions.contains(type))
+        return m_versions.value(type).displayName;
+    return QString();
 }
 
 QList<BuildConfiguration *> Qt4BuildConfigurationFactory::create(const QString &type) const
 {
-    QTC_ASSERT(type == "DefaultQt", return QList<BuildConfiguration*>());
+    QTC_ASSERT(m_versions.contains(type), return QList<BuildConfiguration *>());
+    const VersionInfo &info = m_versions.value(type);
     bool ok;
     QString buildConfigurationName = QInputDialog::getText(0,
                           tr("New configuration"),
@@ -263,6 +284,7 @@ QList<BuildConfiguration *> Qt4BuildConfigurationFactory::create(const QString &
     if (!ok || buildConfigurationName.isEmpty())
         return QList<BuildConfiguration *>();
     BuildConfiguration *bc = new BuildConfiguration(buildConfigurationName);
+    bc->setValue(KEY_QT_VERSION_ID, info.versionId);
     return QList<BuildConfiguration *>() << bc;
 }
 
@@ -317,6 +339,7 @@ void Qt4Project::qtVersionsChanged()
                 m_rootProjectNode->update();
         }
     }
+    m_buildConfigurationFactory->update();
 }
 
 void Qt4Project::updateFileList()
@@ -891,13 +914,13 @@ int Qt4Project::qtVersionId(BuildConfiguration *configuration) const
     if (debug)
         qDebug()<<"Looking for qtVersion ID of "<<configuration->name();
     int id = 0;
-    QVariant vid = configuration->value("QtVersionId");
+    QVariant vid = configuration->value(KEY_QT_VERSION_ID);
     if (vid.isValid()) {
         id = vid.toInt();
         if (vm->version(id)->isValid()) {
             return id;
         } else {
-            configuration->setValue("QtVersionId", 0);
+            configuration->setValue(KEY_QT_VERSION_ID, 0);
             return 0;
         }
     } else {
@@ -911,7 +934,7 @@ int Qt4Project::qtVersionId(BuildConfiguration *configuration) const
                 if (version->name() == vname) {
                     if (debug)
                         qDebug()<<"found name in versions";
-                    configuration->setValue("QtVersionId", version->uniqueId());
+                    configuration->setValue(KEY_QT_VERSION_ID, version->uniqueId());
                     return version->uniqueId();
                 }
             }
@@ -920,13 +943,13 @@ int Qt4Project::qtVersionId(BuildConfiguration *configuration) const
     if (debug)
         qDebug()<<"  using qtversion with id ="<<id;
     // Nothing found, reset to default
-    configuration->setValue("QtVersionId", id);
+    configuration->setValue(KEY_QT_VERSION_ID, id);
     return id;
 }
 
 void Qt4Project::setQtVersion(BuildConfiguration *configuration, int id)
 {
-    configuration->setValue("QtVersionId", id);
+    configuration->setValue(KEY_QT_VERSION_ID, id);
     updateActiveRunConfiguration();
 }
 
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index 2d63fcc0371..fe88818fe13 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -46,6 +46,7 @@
 #include <QtCore/QList>
 #include <QtCore/QStringList>
 #include <QtCore/QPointer>
+#include <QtCore/QMap>
 #include <QtGui/QDirModel>
 #include "qtextended_integration.h"
 
@@ -131,8 +132,19 @@ public:
     QList<ProjectExplorer::BuildConfiguration *> create(const QString &type) const;
     QList<ProjectExplorer::BuildConfiguration *> createDefaultConfigurations() const;
 
+    void update();
+
 private:
+    struct VersionInfo {
+        VersionInfo() {}
+        VersionInfo(const QString &d, int v)
+            : displayName(d), versionId(v) { }
+        QString displayName;
+        int versionId;
+    };
+
     Qt4Project *m_project;
+    QMap<QString, VersionInfo> m_versions;
 };
 
 class Qt4Project : public ProjectExplorer::Project
-- 
GitLab