From: Peter Penz Date: Sat, 22 Oct 2011 00:14:42 +0000 (+0200) Subject: Fix crash when grouping items X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/07b0bf462698cc36db886c555124269a4ad7741f?ds=inline Fix crash when grouping items Because of a wrong usage of parent() vs. parentItem() a crash could occur because the parent might be assigned to an already deleted instance. --- diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index a1012bfb2..e8d5243b6 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -857,13 +857,12 @@ void KItemListView::slotGroupedSortingChanged(bool current) } } else { // Clear all visible headers - QHashIterator it (m_visibleGroups); + QMutableHashIterator it (m_visibleGroups); while (it.hasNext()) { it.next(); - KItemListGroupHeader* header = it.value(); - m_groupHeaderCreator->recycle(header); + recycleGroupHeaderForWidget(it.key()); } - m_visibleGroups.clear(); + Q_ASSERT(m_visibleGroups.isEmpty()); } m_layouter->markAsDirty(); @@ -943,11 +942,7 @@ void KItemListView::slotAnimationFinished(QGraphicsWidget* widget, // All KItemListWidgets that are animated by the DeleteAnimation are not maintained // by m_visibleWidgets and must be deleted manually after the animation has // been finished. - KItemListGroupHeader* header = m_visibleGroups.value(itemListWidget); - if (header) { - m_groupHeaderCreator->recycle(header); - m_visibleGroups.remove(itemListWidget); - } + recycleGroupHeaderForWidget(itemListWidget); m_widgetCreator->recycle(itemListWidget); break; } @@ -1344,11 +1339,7 @@ KItemListWidget* KItemListView::createWidget(int index) void KItemListView::recycleWidget(KItemListWidget* widget) { if (m_grouped) { - KItemListGroupHeader* header = m_visibleGroups.value(widget); - if (header) { - m_groupHeaderCreator->recycle(header); - m_visibleGroups.remove(widget); - } + recycleGroupHeaderForWidget(widget); } m_visibleItems.remove(widget->index()); @@ -1441,21 +1432,20 @@ void KItemListView::updateWidgetProperties(KItemListWidget* widget, int index) void KItemListView::updateGroupHeaderForWidget(KItemListWidget* widget) { const int index = widget->index(); - KItemListGroupHeader* header = m_visibleGroups.value(widget); if (!m_layouter->isFirstGroupItem(index)) { // The widget does not represent the first item of a group // and hence requires no header - if (header) { - m_groupHeaderCreator->recycle(header); - m_visibleGroups.remove(widget); - } + recycleGroupHeaderForWidget(widget); return; } + KItemListGroupHeader* header = m_visibleGroups.value(widget); if (!header) { - header = m_groupHeaderCreator->create(widget); + header = m_groupHeaderCreator->create(this); + header->setParentItem(widget); m_visibleGroups.insert(widget, header); } + Q_ASSERT(header->parentItem() == widget); // TODO: header->show(); @@ -1480,6 +1470,16 @@ void KItemListView::updateGroupHeaderForWidget(KItemListWidget* widget) header->setData(groups.at(mid).second); } +void KItemListView::recycleGroupHeaderForWidget(KItemListWidget* widget) +{ + KItemListGroupHeader* header = m_visibleGroups.value(widget); + if (header) { + header->setParentItem(0); + m_groupHeaderCreator->recycle(header); + m_visibleGroups.remove(widget); + } +} + QHash KItemListView::headerRolesWidths() const { QHash rolesWidths; diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index ee84abe1c..985b7c278 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -331,10 +331,15 @@ private: /** * Helper method for createWidget() and setWidgetIndex() to create or update - * the itemlist groupheader. + * the itemlist group-header. */ void updateGroupHeaderForWidget(KItemListWidget* widget); + /** + * Recycles the group-header from the widget. + */ + void recycleGroupHeaderForWidget(KItemListWidget* widget); + /** * @return The widths of each visible role that is shown in the KItemListHeader. */ @@ -483,9 +488,7 @@ template KItemListWidget* KItemListWidgetCreator::create(KItemListView* view) { KItemListWidget* widget = static_cast(popRecycleableWidget()); - if (widget) { - widget->setParentItem(view); - } else { + if (!widget) { widget = new T(view); addCreatedWidget(widget); } @@ -504,7 +507,7 @@ class LIBDOLPHINPRIVATE_EXPORT KItemListGroupHeaderCreatorBase : public KItemLis { public: virtual ~KItemListGroupHeaderCreatorBase(); - virtual KItemListGroupHeader* create(QGraphicsWidget* parent) = 0; + virtual KItemListGroupHeader* create(KItemListView* view) = 0; virtual void recycle(KItemListGroupHeader* header); }; @@ -513,7 +516,7 @@ class LIBDOLPHINPRIVATE_EXPORT KItemListGroupHeaderCreator : public KItemListGro { public: virtual ~KItemListGroupHeaderCreator(); - virtual KItemListGroupHeader* create(QGraphicsWidget* parent); + virtual KItemListGroupHeader* create(KItemListView* view); }; template @@ -522,13 +525,11 @@ KItemListGroupHeaderCreator::~KItemListGroupHeaderCreator() } template -KItemListGroupHeader* KItemListGroupHeaderCreator::create(QGraphicsWidget* parent) +KItemListGroupHeader* KItemListGroupHeaderCreator::create(KItemListView* view) { KItemListGroupHeader* widget = static_cast(popRecycleableWidget()); - if (widget) { - widget->setParentItem(parent); - } else { - widget = new T(parent); + if (!widget) { + widget = new T(view); addCreatedWidget(widget); } return widget;