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