From 713762e108ce8de88c8f5151d9bcf56e1e884879 Mon Sep 17 00:00:00 2001
From: Daniel Teske <daniel.teske@nokia.com>
Date: Fri, 24 Feb 2012 18:57:33 +0100
Subject: [PATCH] QtVersionManager::qtVersionsChanged() split list into
 add/remove/change

Makes it easier to do the right thing.

Change-Id: Id6c6754033b3310c6b8c68a4aacc22cbaef268ee
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
---
 src/plugins/madde/maemoqemumanager.cpp        | 12 ++++++-----
 src/plugins/madde/maemoqemumanager.h          |  2 +-
 src/plugins/madde/maemotoolchain.cpp          |  8 +++++---
 src/plugins/madde/maemotoolchain.h            |  4 ++--
 src/plugins/madde/qt4maemotargetfactory.cpp   |  2 +-
 .../qmlprojectrunconfiguration.cpp            |  2 +-
 .../qmlprojectrunconfigurationwidget.cpp      |  2 +-
 .../qt-desktop/qt4desktoptargetfactory.cpp    |  2 +-
 .../qt-desktop/qt4simulatortargetfactory.cpp  |  2 +-
 .../qt-s60/qt4symbiantargetfactory.cpp        |  2 +-
 .../qt4buildconfiguration.cpp                 | 14 ++++++-------
 .../qt4projectmanager/qt4buildconfiguration.h |  2 +-
 .../qt4projectconfigwidget.cpp                |  2 +-
 src/plugins/qtsupport/exampleslistmodel.cpp   |  2 +-
 src/plugins/qtsupport/qtversionmanager.cpp    | 20 ++++++++++---------
 src/plugins/qtsupport/qtversionmanager.h      |  2 +-
 16 files changed, 43 insertions(+), 37 deletions(-)

diff --git a/src/plugins/madde/maemoqemumanager.cpp b/src/plugins/madde/maemoqemumanager.cpp
index 78b18409f1e..10b3f2ac330 100644
--- a/src/plugins/madde/maemoqemumanager.cpp
+++ b/src/plugins/madde/maemoqemumanager.cpp
@@ -108,8 +108,8 @@ MaemoQemuManager::MaemoQemuManager(QObject *parent)
     m_qemuAction->setVisible(false);
 
     // listen to qt version changes to update the start button
-    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
-        this, SLOT(qtVersionsChanged(QList<int>)));
+    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
+        this, SLOT(qtVersionsChanged(QList<int>,QList<int>,QList<int>)));
 
     // listen to project add, remove and startup changes to udate start button
     SessionManager *session = ProjectExplorerPlugin::instance()->session();
@@ -178,8 +178,10 @@ bool MaemoQemuManager::qemuIsRunning() const
     return m_runningQtId != INT_MIN;
 }
 
-void MaemoQemuManager::qtVersionsChanged(const QList<int> &uniqueIds)
+void MaemoQemuManager::qtVersionsChanged(const QList<int> &added, const QList<int> &removed, const QList<int> &changed)
 {
+    QList<int> uniqueIds;
+    uniqueIds << added << removed << changed;
     QtSupport::QtVersionManager *manager = QtSupport::QtVersionManager::instance();
     foreach (int uniqueId, uniqueIds) {
         if (manager->isValidId(uniqueId)) {
@@ -539,7 +541,7 @@ void MaemoQemuManager::toggleStarterButton(Target *target)
     }
 
     if (uniqueId >= 0 && (m_runtimes.isEmpty() || !m_runtimes.contains(uniqueId)))
-        qtVersionsChanged(QList<int>() << uniqueId);
+        qtVersionsChanged(QList<int>(), QList<int>(), QList<int>() << uniqueId);
 
     bool isRunning = m_qemuProcess->state() != QProcess::NotRunning;
     if (m_runningQtId == uniqueId)
@@ -596,7 +598,7 @@ bool MaemoQemuManager::targetUsesMatchingRuntimeConfig(Target *target,
 
 void MaemoQemuManager::notify(const QList<int> uniqueIds)
 {
-    qtVersionsChanged(uniqueIds);
+    qtVersionsChanged(QList<int>(), QList<int>(), uniqueIds);
     environmentChanged();   // to toggle the start button
 }
 
diff --git a/src/plugins/madde/maemoqemumanager.h b/src/plugins/madde/maemoqemumanager.h
index 0fa3894ff6d..a5c61b78991 100644
--- a/src/plugins/madde/maemoqemumanager.h
+++ b/src/plugins/madde/maemoqemumanager.h
@@ -82,7 +82,7 @@ signals:
     void qemuProcessStatus(QemuStatus, const QString &error = QString());
 
 private slots:
-    void qtVersionsChanged(const QList<int> &uniqueIds);
+    void qtVersionsChanged(const QList<int> &addedIds, const QList<int> &removedIds, const QList<int> &changed);
 
     void projectAdded(ProjectExplorer::Project *project);
     void projectRemoved(ProjectExplorer::Project *project);
diff --git a/src/plugins/madde/maemotoolchain.cpp b/src/plugins/madde/maemotoolchain.cpp
index e4de7cc401c..848198199f0 100644
--- a/src/plugins/madde/maemotoolchain.cpp
+++ b/src/plugins/madde/maemotoolchain.cpp
@@ -241,8 +241,8 @@ QString MaemoToolChainFactory::id() const
 QList<ProjectExplorer::ToolChain *> MaemoToolChainFactory::autoDetect()
 {
     QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
-    connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
-            this, SLOT(handleQtVersionChanges(QList<int>)));
+    connect(vm, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
+            this, SLOT(handleQtVersionChanges(QList<int>,QList<int>,QList<int>)));
 
     QList<int> versionList;
     foreach (QtSupport::BaseQtVersion *v, vm->versions())
@@ -266,8 +266,10 @@ ProjectExplorer::ToolChain *MaemoToolChainFactory::restore(const QVariantMap &da
     return 0;
 }
 
-void MaemoToolChainFactory::handleQtVersionChanges(const QList<int> &changes)
+void MaemoToolChainFactory::handleQtVersionChanges(const QList<int> &added, const QList<int> &removed, const QList<int> &changed)
 {
+    QList<int> changes;
+    changes << added << removed << changed;
     ProjectExplorer::ToolChainManager *tcm = ProjectExplorer::ToolChainManager::instance();
     QList<ProjectExplorer::ToolChain *> tcList = createToolChainList(changes);
     foreach (ProjectExplorer::ToolChain *tc, tcList)
diff --git a/src/plugins/madde/maemotoolchain.h b/src/plugins/madde/maemotoolchain.h
index e585d35435c..845f1242940 100644
--- a/src/plugins/madde/maemotoolchain.h
+++ b/src/plugins/madde/maemotoolchain.h
@@ -117,8 +117,8 @@ public:
     ProjectExplorer::ToolChain *restore(const QVariantMap &data);
 
 private slots:
-    void handleQtVersionChanges(const QList<int> &);
-    QList<ProjectExplorer::ToolChain *> createToolChainList(const QList<int> &);
+    void handleQtVersionChanges(const QList<int> &added, const QList<int> &removed, const QList<int> &changed);
+    QList<ProjectExplorer::ToolChain *> createToolChainList(const QList<int> &changes);
 };
 
 } // namespace Internal
diff --git a/src/plugins/madde/qt4maemotargetfactory.cpp b/src/plugins/madde/qt4maemotargetfactory.cpp
index 44de7c3158d..4879165803f 100644
--- a/src/plugins/madde/qt4maemotargetfactory.cpp
+++ b/src/plugins/madde/qt4maemotargetfactory.cpp
@@ -58,7 +58,7 @@ namespace Internal {
 Qt4MaemoTargetFactory::Qt4MaemoTargetFactory(QObject *parent) :
     Qt4BaseTargetFactory(parent)
 {
-    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SIGNAL(canCreateTargetIdsChanged()));
 }
 
diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
index 9269d30fbbf..3899c87435a 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
@@ -108,7 +108,7 @@ void QmlProjectRunConfiguration::ctor()
             this, SLOT(changeCurrentFile(Core::IEditor*)));
 
     QtVersionManager *qtVersions = QtVersionManager::instance();
-    connect(qtVersions, SIGNAL(qtVersionsChanged(QList<int>)), this, SLOT(updateQtVersions()));
+    connect(qtVersions, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)), this, SLOT(updateQtVersions()));
 
     setDisplayName(tr("QML Viewer", "QMLRunConfiguration display name."));
 }
diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.cpp
index f3fe0c32764..0813e0868bf 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationwidget.cpp
@@ -114,7 +114,7 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun
     //
 
     QtVersionManager *qtVersions = QtVersionManager::instance();
-    connect(qtVersions, SIGNAL(qtVersionsChanged(QList<int>)),
+    connect(qtVersions, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SLOT(updateQtVersionComboBox()));
 
     //
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
index 3fe2d186f63..06df7004a09 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
@@ -56,7 +56,7 @@ using ProjectExplorer::idFromMap;
 Qt4DesktopTargetFactory::Qt4DesktopTargetFactory(QObject *parent) :
     Qt4BaseTargetFactory(parent)
 {
-    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SIGNAL(canCreateTargetIdsChanged()));
 }
 
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
index d9bb69e41b4..71ecce00e4a 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
@@ -56,7 +56,7 @@ using ProjectExplorer::idFromMap;
 Qt4SimulatorTargetFactory::Qt4SimulatorTargetFactory(QObject *parent) :
     Qt4BaseTargetFactory(parent)
 {
-    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SIGNAL(canCreateTargetIdsChanged()));
 }
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
index 003d242f2aa..228dc0a501c 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
@@ -60,7 +60,7 @@ using namespace Qt4ProjectManager::Internal;
 Qt4SymbianTargetFactory::Qt4SymbianTargetFactory(QObject *parent) :
     Qt4BaseTargetFactory(parent)
 {
-    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+    connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SIGNAL(canCreateTargetIdsChanged()));
 }
 
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index 9af64867fd6..7e73d48501b 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -185,8 +185,8 @@ void Qt4BuildConfiguration::ctor()
             this, SLOT(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
 
     QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
-    connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
-            this, SLOT(qtVersionsChanged(QList<int>)));
+    connect(vm, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
+            this, SLOT(qtVersionsChanged(QList<int>,QList<int>,QList<int>)));
 }
 
 void Qt4BuildConfiguration::emitBuildDirectoryChanged()
@@ -458,11 +458,11 @@ MakeStep *Qt4BuildConfiguration::makeStep() const
     return 0;
 }
 
-void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &changedVersions)
+void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &addedVersions, const QList<int> &removedVersions, const QList<int> &changedVersions)
 {
-    if (!changedVersions.contains(m_qtVersionId))
-        return;
-    emit environmentChanged(); // Our qt version changed, that might have changed the environment
+    Q_UNUSED(addedVersions);
+    if (removedVersions.contains(m_qtVersionId) || changedVersions.contains(m_qtVersionId))
+        emit environmentChanged(); // Our qt version changed, that might have changed the environment
 }
 
 // returns true if both are equal
@@ -663,7 +663,7 @@ Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(QObject *parent) :
     update();
 
     QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
-    connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
+    connect(vm, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SLOT(update()));
 }
 
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index 7b2dd5a696d..17b98abd0e7 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -144,7 +144,7 @@ signals:
     void buildDirectoryInitialized();
 
 private slots:
-    void qtVersionsChanged(const QList<int> &changedVersions);
+    void qtVersionsChanged(const QList<int> &addedVersions, const QList<int> &removedVersions, const QList<int> &changedVersions);
     void emitBuildDirectoryChanged();
     void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *, bool, bool parseInProgress);
 
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index 990d134d33d..9fa9de7bc4e 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -225,7 +225,7 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc)
 
     qtVersionsChanged();
     QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
-    connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
+    connect(vm, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SLOT(qtVersionsChanged()));
 
     bool shadowBuild = m_buildConfiguration->shadowBuild();
diff --git a/src/plugins/qtsupport/exampleslistmodel.cpp b/src/plugins/qtsupport/exampleslistmodel.cpp
index 27b63394589..c3ea5d3e7d2 100644
--- a/src/plugins/qtsupport/exampleslistmodel.cpp
+++ b/src/plugins/qtsupport/exampleslistmodel.cpp
@@ -77,7 +77,7 @@ ExamplesListModel::ExamplesListModel(QObject *parent) :
 
     connect(Core::HelpManager::instance(), SIGNAL(setupFinished()),
             SLOT(helpInitialized()));
-    connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+    connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SLOT(handleQtVersionsChanged()));
 }
 
diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp
index aa83869a284..185023e8515 100644
--- a/src/plugins/qtsupport/qtversionmanager.cpp
+++ b/src/plugins/qtsupport/qtversionmanager.cpp
@@ -449,7 +449,7 @@ void QtVersionManager::addVersion(BaseQtVersion *version)
     int uniqueId = version->uniqueId();
     m_versions.insert(uniqueId, version);
 
-    emit qtVersionsChanged(QList<int>() << uniqueId);
+    emit qtVersionsChanged(QList<int>() << uniqueId, QList<int>(), QList<int>());
     saveQtVersions();
 }
 
@@ -457,7 +457,7 @@ void QtVersionManager::removeVersion(BaseQtVersion *version)
 {
     QTC_ASSERT(version != 0, return);
     m_versions.remove(version->uniqueId());
-    emit qtVersionsChanged(QList<int>() << version->uniqueId());
+    emit qtVersionsChanged(QList<int>(), QList<int>() << version->uniqueId(), QList<int>());
     saveQtVersions();
     delete version;
 }
@@ -623,6 +623,8 @@ void QtVersionManager::setNewQtVersions(QList<BaseQtVersion *> newVersions)
     SortByUniqueId sortByUniqueId;
     qSort(sortedNewVersions.begin(), sortedNewVersions.end(), sortByUniqueId);
 
+    QList<int> addedVersions;
+    QList<int> removedVersions;
     QList<int> changedVersions;
     // So we trying to find the minimal set of changed versions,
     // iterate over both sorted list
@@ -639,10 +641,10 @@ void QtVersionManager::setNewQtVersions(QList<BaseQtVersion *> newVersions)
         int nid = (*nit)->uniqueId();
         int oid = (*oit)->uniqueId();
         if (nid < oid) {
-            changedVersions.push_back(nid);
+            addedVersions.push_back(nid);
             ++nit;
         } else if (oid < nid) {
-            changedVersions.push_back(oid);
+            removedVersions.push_back(oid);
             ++oit;
         } else {
             if (!equals(*oit, *nit))
@@ -653,12 +655,12 @@ void QtVersionManager::setNewQtVersions(QList<BaseQtVersion *> newVersions)
     }
 
     while (nit != nend) {
-        changedVersions.push_back((*nit)->uniqueId());
+        addedVersions.push_back((*nit)->uniqueId());
         ++nit;
     }
 
     while (oit != oend) {
-        changedVersions.push_back((*oit)->uniqueId());
+        removedVersions.push_back((*oit)->uniqueId());
         ++oit;
     }
 
@@ -667,13 +669,13 @@ void QtVersionManager::setNewQtVersions(QList<BaseQtVersion *> newVersions)
     foreach (BaseQtVersion *v, sortedNewVersions)
         m_versions.insert(v->uniqueId(), v);
 
-    if (!changedVersions.isEmpty())
+    if (!changedVersions.isEmpty() || !addedVersions.isEmpty() || !removedVersions.isEmpty())
         updateDocumentation();
 
     saveQtVersions();
 
-    if (!changedVersions.isEmpty())
-        emit qtVersionsChanged(changedVersions);
+    if (!changedVersions.isEmpty() || !addedVersions.isEmpty() || !removedVersions.isEmpty())
+        emit qtVersionsChanged(addedVersions, removedVersions, changedVersions);
 }
 
 // Returns the version that was used to build the project in that directory
diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h
index cccb8f3be67..d1922122561 100644
--- a/src/plugins/qtsupport/qtversionmanager.h
+++ b/src/plugins/qtsupport/qtversionmanager.h
@@ -108,7 +108,7 @@ public:
 signals:
     // content of BaseQtVersion objects with qmake path might have changed
     void dumpUpdatedFor(const Utils::FileName &qmakeCommand);
-    void qtVersionsChanged(const QList<int> &uniqueIds);
+    void qtVersionsChanged(const QList<int> &addedIds, const QList<int> &removedIds, const QList<int> &changedIds);
 
 public slots:
     void updateDumpFor(const Utils::FileName &qmakeCommand);
-- 
GitLab