From 61e5ce374c039fd0f2361072d4e456adf0abc97b Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Wed, 14 Apr 2010 13:37:08 +0200
Subject: [PATCH] Make Q4ProjecConfigWidget more robust

Task-Nr: QTCREATORBUG-1108
Task-Nr: TOOLS-339
---
 .../qt4buildconfiguration.cpp                 |  8 +-
 src/plugins/qt4projectmanager/qt4nodes.cpp    |  1 -
 .../qt4projectconfigwidget.cpp                | 86 ++++++++++++++-----
 .../qt4projectconfigwidget.h                  |  3 +
 4 files changed, 72 insertions(+), 26 deletions(-)

diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index a6c3083501c..c1e91a2cdd2 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -307,11 +307,12 @@ void Qt4BuildConfiguration::setQtVersion(QtVersion *version)
         return;
 
     m_qtVersionId = version->uniqueId();
+
     if (!version->possibleToolChainTypes().contains(ProjectExplorer::ToolChain::ToolChainType(m_toolChainType))) {
         QList<ToolChain::ToolChainType> candidates =
                 qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes());
         if (candidates.isEmpty())
-            m_toolChainType = -1;
+            m_toolChainType = ToolChain::INVALID;
         else
             m_toolChainType = candidates.first();
     }
@@ -323,9 +324,10 @@ void Qt4BuildConfiguration::setQtVersion(QtVersion *version)
 
 void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolChainType type)
 {
-    if (!qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes()).contains(type) ||
-        m_toolChainType == type)
+    if (!qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes()).contains(type)
+        || m_toolChainType == type)
         return;
+
     m_toolChainType = type;
 
     emit proFileEvaluateNeeded(this);
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index d0c4c8ce010..5cc67a80085 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -1359,7 +1359,6 @@ QStringList Qt4ProFileNode::includePaths(ProFileReader *reader) const
     // except if those directories don't exist at the time of parsing
     // thus we add those directories manually (without checking for existance)
     paths << mocDirPath(reader) << uiDirPath(reader);
-
     paths.removeDuplicates();
     return paths;
 }
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index 06b35815711..e4eb88e1dc4 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -142,12 +142,23 @@ void Qt4ProjectConfigWidget::updateDetails()
     }
 }
 
+void Qt4ProjectConfigWidget::updateShadowBuildUi()
+{
+    m_ui->shadowBuildCheckBox->setEnabled(m_buildConfiguration->qtVersion()->supportsShadowBuilds());
+    m_ui->shadowBuildDirEdit->setEnabled(m_buildConfiguration->qtVersion()->supportsShadowBuilds());
+}
+
 void Qt4ProjectConfigWidget::manageQtVersions()
 {
     Core::ICore *core = Core::ICore::instance();
     core->showOptionsDialog(Constants::QT_SETTINGS_CATEGORY, Constants::QTVERSION_SETTINGS_PAGE_ID);
 }
 
+void Qt4ProjectConfigWidget::updateInvalidQtVersion()
+{
+    m_ui->invalidQtWarningLabel->setVisible(!m_buildConfiguration->qtVersion()->isValid());
+}
+
 
 QString Qt4ProjectConfigWidget::displayName() const
 {
@@ -162,10 +173,14 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc)
         qDebug() << "Qt4ProjectConfigWidget::init() for"<<bc->displayName();
 
     if (m_buildConfiguration) {
+        disconnect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()),
+                this, SLOT(buildDirectoryChanged()));
         disconnect(m_buildConfiguration, SIGNAL(qtVersionChanged()),
                    this, SLOT(qtVersionChanged()));
         disconnect(m_buildConfiguration, SIGNAL(qmakeBuildConfigurationChanged()),
                    this, SLOT(updateImportLabel()));
+        disconnect(m_buildConfiguration, SIGNAL(toolChainTypeChanged()),
+                   this, SLOT(toolChainTypeChanged()));
     }
     m_buildConfiguration = static_cast<Qt4BuildConfiguration *>(bc);
 
@@ -175,6 +190,8 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc)
             this, SLOT(qtVersionChanged()));
     connect(m_buildConfiguration, SIGNAL(qmakeBuildConfigurationChanged()),
             this, SLOT(updateImportLabel()));
+    connect(m_buildConfiguration, SIGNAL(toolChainTypeChanged()),
+            this, SLOT(toolChainTypeChanged()));
 
     m_ui->nameLineEdit->setText(m_buildConfiguration->displayName());
 
@@ -196,9 +213,10 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc)
 
 void Qt4ProjectConfigWidget::qtVersionChanged()
 {
-    m_ui->shadowBuildCheckBox->setEnabled(m_buildConfiguration->qtVersion()->supportsShadowBuilds());
-    m_ui->shadowBuildDirEdit->setEnabled(m_buildConfiguration->qtVersion()->supportsShadowBuilds());
+    if (m_ignoreChange)
+        return;
 
+    updateShadowBuildUi();
     updateImportLabel();
     updateToolChainCombo();
     updateDetails();
@@ -214,19 +232,14 @@ void Qt4ProjectConfigWidget::qtVersionsChanged()
     if (!m_buildConfiguration) // not yet initialized
         return;
 
-    disconnect(m_ui->qtVersionComboBox, SIGNAL(currentIndexChanged(QString)),
-        this, SLOT(qtVersionSelected(QString)));
-
+    m_ignoreChange = true;
     QtVersionManager *vm = QtVersionManager::instance();
 
     m_ui->qtVersionComboBox->clear();
     QtVersion * qtVersion = m_buildConfiguration->qtVersion();
 
     const QList<QtVersion *> validVersions(vm->versionsForTargetId(m_buildConfiguration->target()->id()));
-    if (validVersions.isEmpty()) {
-        m_ui->invalidQtWarningLabel->setVisible(true);
-    } else {
-        m_ui->invalidQtWarningLabel->setVisible(false);
+    if (!validVersions.isEmpty()) {
         for (int i = 0; i < validVersions.size(); ++i) {
             m_ui->qtVersionComboBox->addItem(validVersions.at(i)->displayName(),
                                              validVersions.at(i)->uniqueId());
@@ -238,10 +251,13 @@ void Qt4ProjectConfigWidget::qtVersionsChanged()
         }
         m_ui->qtVersionComboBox->setEnabled(validVersions.count() > 1);
     }
+    m_ignoreChange = false;
 
-    // And connect again
-    connect(m_ui->qtVersionComboBox, SIGNAL(currentIndexChanged(QString)),
-        this, SLOT(qtVersionSelected(QString)));
+    updateInvalidQtVersion();
+    updateToolChainCombo();
+    updateShadowBuildUi();
+    updateDetails();
+    updateImportLabel();
 }
 
 void Qt4ProjectConfigWidget::buildDirectoryChanged()
@@ -412,35 +428,61 @@ void Qt4ProjectConfigWidget::importLabelClicked()
 
 void Qt4ProjectConfigWidget::qtVersionSelected(const QString &)
 {
+    if (m_ignoreChange)
+        return;
     //Qt Version
     int newQtVersionId = m_ui->qtVersionComboBox->itemData(m_ui->qtVersionComboBox->currentIndex()).toInt();
+
     QtVersionManager *vm = QtVersionManager::instance();
     QtVersion *newQtVersion = vm->version(newQtVersionId);
-    bool isValid = newQtVersion->isValid();
-    m_ui->invalidQtWarningLabel->setVisible(!isValid);
-    if (newQtVersion != m_buildConfiguration->qtVersion()) {
-        m_ignoreChange = true;
-        m_buildConfiguration->setQtVersion(newQtVersion);
-        m_ignoreChange = false;
-        updateToolChainCombo();
-    }
+
+    m_ignoreChange = true;
+    m_buildConfiguration->setQtVersion(newQtVersion);
+    m_ignoreChange = false;
+
+    updateInvalidQtVersion();
+    updateShadowBuildUi();
+    updateToolChainCombo();
+    updateImportLabel();
     updateDetails();
 }
 
+void Qt4ProjectConfigWidget::toolChainTypeChanged()
+{
+    if (m_ignoreChange)
+        return;
+    for (int i=0; i < m_ui->toolChainComboBox->count(); ++i) {
+        ProjectExplorer::ToolChain::ToolChainType tt =
+                m_ui->toolChainComboBox->itemData(i, Qt::UserRole).value<ProjectExplorer::ToolChain::ToolChainType>();
+        if (tt == m_buildConfiguration->toolChainType()) {
+            m_ignoreChange = true;
+            m_ui->toolChainComboBox->setCurrentIndex(i);
+            m_ignoreChange = false;
+        }
+    }
+}
+
 void Qt4ProjectConfigWidget::updateToolChainCombo()
 {
     m_ui->toolChainComboBox->clear();
-    QList<ProjectExplorer::ToolChain::ToolChainType> toolchains(m_buildConfiguration->qtVersion()->possibleToolChainTypes());
+    QList<ProjectExplorer::ToolChain::ToolChainType> toolchains =
+            m_buildConfiguration->qtVersion()->possibleToolChainTypes();
+
     toolchains = m_buildConfiguration->qt4Target()->filterToolChainTypes(toolchains);
+
     foreach (ToolChain::ToolChainType toolchain, toolchains)
         m_ui->toolChainComboBox->addItem(ToolChain::toolChainName(toolchain), qVariantFromValue(toolchain));
     m_ui->toolChainComboBox->setEnabled(toolchains.size() > 1);
+
+    m_ignoreChange = true;
     m_ui->toolChainComboBox->setCurrentIndex(toolchains.indexOf(m_buildConfiguration->toolChainType()));
-    updateDetails();
+    m_ignoreChange = false;
 }
 
 void Qt4ProjectConfigWidget::toolChainSelected(int index)
 {
+    if (m_ignoreChange)
+        return;
     ProjectExplorer::ToolChain::ToolChainType selectedToolChainType =
         m_ui->toolChainComboBox->itemData(index,
             Qt::UserRole).value<ProjectExplorer::ToolChain::ToolChainType>();
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
index 37a0560fc92..c524f5f577b 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
@@ -76,10 +76,13 @@ private slots:
     void qtVersionsChanged();
     void qtVersionChanged();
     void buildDirectoryChanged();
+    void toolChainTypeChanged();
     void updateImportLabel();
 private:
     void updateDetails();
     void updateToolChainCombo();
+    void updateShadowBuildUi();
+    void updateInvalidQtVersion();
     Ui::Qt4ProjectConfigWidget *m_ui;
     QAbstractButton *m_browseButton;
     Qt4BuildConfiguration *m_buildConfiguration;
-- 
GitLab