From 73f1a307148f183863ac45a178db5c460daca9ef Mon Sep 17 00:00:00 2001
From: Lasse Holmstedt <lasse.holmstedt@nokia.com>
Date: Mon, 26 Apr 2010 13:51:46 +0200
Subject: [PATCH] Added weakpointers to Sidebar to make sure things aren't
 double-deleted

Reviewed-by: con
---
 src/plugins/coreplugin/sidebar.cpp | 17 +++++++++++------
 src/plugins/coreplugin/sidebar.h   |  9 +++++----
 2 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/src/plugins/coreplugin/sidebar.cpp b/src/plugins/coreplugin/sidebar.cpp
index e09941c7d38..27e9a81f8e7 100644
--- a/src/plugins/coreplugin/sidebar.cpp
+++ b/src/plugins/coreplugin/sidebar.cpp
@@ -69,7 +69,12 @@ SideBar::SideBar(QList<SideBarItem*> itemList,
 
 SideBar::~SideBar()
 {
-    qDeleteAll(m_itemMap);
+    QMutableMapIterator<QString, QWeakPointer<SideBarItem> > iter(m_itemMap);
+    while(iter.hasNext()) {
+        iter.next();
+        if (!iter.value().isNull())
+            delete iter.value().data();
+    }
 }
 
 QStringList SideBar::availableItems() const
@@ -93,9 +98,9 @@ void SideBar::setCloseWhenEmpty(bool value)
 
 void SideBar::makeItemAvailable(SideBarItem *item)
 {
-    QMap<QString, SideBarItem*>::const_iterator it = m_itemMap.constBegin();
+    QMap<QString, QWeakPointer<SideBarItem> >::const_iterator it = m_itemMap.constBegin();
     while (it != m_itemMap.constEnd()) {
-        if (it.value() == item) {
+        if (it.value().data() == item) {
             m_availableItems.append(it.key());
             m_unavailableItems.removeAll(it.key());
             qSort(m_availableItems);
@@ -135,7 +140,7 @@ SideBarItem *SideBar::item(const QString &title)
             m_unavailableItems.append(title);
 
         emit availableItemsChanged();
-        return m_itemMap.value(title);
+        return m_itemMap.value(title).data();
     }
     return 0;
 }
@@ -241,10 +246,10 @@ void SideBar::readSettings(QSettings *settings, const QString &name)
 
 void SideBar::activateItem(SideBarItem *item)
 {
-    QMap<QString, SideBarItem*>::const_iterator it = m_itemMap.constBegin();
+    QMap<QString, QWeakPointer<SideBarItem> >::const_iterator it = m_itemMap.constBegin();
     QString title;
     while (it != m_itemMap.constEnd()) {
-        if (it.value() == item) {
+        if (it.value().data() == item) {
             title = it.key();
             break;
         }
diff --git a/src/plugins/coreplugin/sidebar.h b/src/plugins/coreplugin/sidebar.h
index 88fab391d33..29383968e9e 100644
--- a/src/plugins/coreplugin/sidebar.h
+++ b/src/plugins/coreplugin/sidebar.h
@@ -60,8 +60,9 @@ class ComboBox;
  *
  * The SideBarItem takes ownership over the widget.
  */
-class CORE_EXPORT SideBarItem
+class CORE_EXPORT SideBarItem : public QObject
 {
+    Q_OBJECT
 public:
     SideBarItem(QWidget *widget)
         : m_widget(widget)
@@ -93,8 +94,8 @@ public:
     /*
      * The SideBar takes ownership of the SideBarItems.
      */
-    SideBar(QList<SideBarItem*> widgetList,
-            QList<SideBarItem*> defaultVisible);
+    SideBar(QList< SideBarItem*> widgetList,
+            QList< SideBarItem*> defaultVisible);
     ~SideBar();
 
     QStringList availableItems() const;
@@ -129,7 +130,7 @@ private:
     void removeSideBarWidget(Internal::SideBarWidget *widget);
 
     QList<Internal::SideBarWidget*> m_widgets;
-    QMap<QString, SideBarItem*> m_itemMap;
+    QMap<QString, QWeakPointer<SideBarItem> > m_itemMap;
     QStringList m_availableItems;
     QStringList m_unavailableItems;
     QStringList m_defaultVisible;
-- 
GitLab