From dfd0c9f91a45dfc1850f6e19f8a638d99b9bf4f3 Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Tue, 28 Apr 2009 17:23:33 +0200
Subject: [PATCH] Crash found by ErikV in the Dependencies Model with unloading
 projects

We didn't update the dependencies model in case a project gets loaded or
unloaded. (Or the session switched.) In that case we do a rather drastic
reset() now.
---
 .../projectexplorer/dependenciespanel.cpp     | 41 +++++++++----------
 .../projectexplorer/dependenciespanel.h       | 26 ++++++++++++
 2 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/src/plugins/projectexplorer/dependenciespanel.cpp b/src/plugins/projectexplorer/dependenciespanel.cpp
index 78598c4f3a0..83dacae6bbe 100644
--- a/src/plugins/projectexplorer/dependenciespanel.cpp
+++ b/src/plugins/projectexplorer/dependenciespanel.cpp
@@ -44,27 +44,6 @@
 namespace ProjectExplorer {
 namespace Internal {
 
-//
-// DependenciesModel
-//
-
-class DependenciesModel : public QAbstractListModel
-{
-public:
-    DependenciesModel(SessionManager *session, Project *project, QObject *parent = 0);
-
-    int rowCount(const QModelIndex &index) const;
-    int columnCount(const QModelIndex &index) const;
-    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
-    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
-    Qt::ItemFlags flags(const QModelIndex &index) const;
-
-private:
-    SessionManager *m_session;
-    Project *m_project;
-    QList<Project *> m_projects;
-};
-
 DependenciesModel::DependenciesModel(SessionManager *session,
                                      Project *project,
                                      QObject *parent)
@@ -75,6 +54,26 @@ DependenciesModel::DependenciesModel(SessionManager *session,
 {
     // We can't select ourselves as a dependency
     m_projects.removeAll(m_project);
+    connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
+            this, SLOT(resetModel()));
+    connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)),
+            this, SLOT(resetModel()));
+    connect(session, SIGNAL(sessionLoaded()),
+            this, SLOT(resetModel()));
+//    qDebug()<<"Dependencies Model"<<this<<"for project"<<project<<"("<<project->file()->fileName()<<")";
+}
+
+DependenciesModel::~DependenciesModel()
+{
+//    qDebug()<<"~DependenciesModel"<<this;
+}
+
+void DependenciesModel::resetModel()
+{
+    qDebug()<<"Resetting";
+    m_projects = m_session->projects();
+    m_projects.removeAll(m_project);
+    reset();
 }
 
 int DependenciesModel::rowCount(const QModelIndex &index) const
diff --git a/src/plugins/projectexplorer/dependenciespanel.h b/src/plugins/projectexplorer/dependenciespanel.h
index 5203efcc49e..f69c3b353c9 100644
--- a/src/plugins/projectexplorer/dependenciespanel.h
+++ b/src/plugins/projectexplorer/dependenciespanel.h
@@ -70,6 +70,32 @@ private:
     DependenciesWidget *m_widget;
 };
 
+//
+// DependenciesModel
+//
+
+class DependenciesModel : public QAbstractListModel
+{
+    Q_OBJECT
+public:
+    DependenciesModel(SessionManager *session, Project *project, QObject *parent = 0);
+    ~DependenciesModel();
+
+    int rowCount(const QModelIndex &index) const;
+    int columnCount(const QModelIndex &index) const;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
+    Qt::ItemFlags flags(const QModelIndex &index) const;
+
+public slots:
+    void resetModel();
+
+private:
+    SessionManager *m_session;
+    Project *m_project;
+    QList<Project *> m_projects;
+};
+
 } // namespace Internal
 } // namespace ProjectExplorer
 
-- 
GitLab