Because of a wrong usage of parent() vs. parentItem() a crash
could occur because the parent might be assigned to an already
deleted instance.
}
} else {
// Clear all visible headers
}
} else {
// Clear all visible headers
- QHashIterator<KItemListWidget*, KItemListGroupHeader*> it (m_visibleGroups);
+ QMutableHashIterator<KItemListWidget*, KItemListGroupHeader*> it (m_visibleGroups);
while (it.hasNext()) {
it.next();
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();
}
m_layouter->markAsDirty();
// 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.
// 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;
}
m_widgetCreator->recycle(itemListWidget);
break;
}
void KItemListView::recycleWidget(KItemListWidget* widget)
{
if (m_grouped) {
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());
}
m_visibleItems.remove(widget->index());
void KItemListView::updateGroupHeaderForWidget(KItemListWidget* widget)
{
const int index = widget->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 (!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);
+ KItemListGroupHeader* header = m_visibleGroups.value(widget);
- header = m_groupHeaderCreator->create(widget);
+ header = m_groupHeaderCreator->create(this);
+ header->setParentItem(widget);
m_visibleGroups.insert(widget, header);
}
m_visibleGroups.insert(widget, header);
}
+ Q_ASSERT(header->parentItem() == widget);
header->setData(groups.at(mid).second);
}
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<QByteArray, qreal> KItemListView::headerRolesWidths() const
{
QHash<QByteArray, qreal> rolesWidths;
QHash<QByteArray, qreal> KItemListView::headerRolesWidths() const
{
QHash<QByteArray, qreal> rolesWidths;
/**
* Helper method for createWidget() and setWidgetIndex() to create or update
/**
* Helper method for createWidget() and setWidgetIndex() to create or update
- * the itemlist groupheader.
+ * the itemlist group-header.
*/
void updateGroupHeaderForWidget(KItemListWidget* widget);
*/
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.
*/
/**
* @return The widths of each visible role that is shown in the KItemListHeader.
*/
KItemListWidget* KItemListWidgetCreator<T>::create(KItemListView* view)
{
KItemListWidget* widget = static_cast<KItemListWidget*>(popRecycleableWidget());
KItemListWidget* KItemListWidgetCreator<T>::create(KItemListView* view)
{
KItemListWidget* widget = static_cast<KItemListWidget*>(popRecycleableWidget());
- if (widget) {
- widget->setParentItem(view);
- } else {
widget = new T(view);
addCreatedWidget(widget);
}
widget = new T(view);
addCreatedWidget(widget);
}
{
public:
virtual ~KItemListGroupHeaderCreatorBase();
{
public:
virtual ~KItemListGroupHeaderCreatorBase();
- virtual KItemListGroupHeader* create(QGraphicsWidget* parent) = 0;
+ virtual KItemListGroupHeader* create(KItemListView* view) = 0;
virtual void recycle(KItemListGroupHeader* header);
};
virtual void recycle(KItemListGroupHeader* header);
};
{
public:
virtual ~KItemListGroupHeaderCreator();
{
public:
virtual ~KItemListGroupHeaderCreator();
- virtual KItemListGroupHeader* create(QGraphicsWidget* parent);
+ virtual KItemListGroupHeader* create(KItemListView* view);
-KItemListGroupHeader* KItemListGroupHeaderCreator<T>::create(QGraphicsWidget* parent)
+KItemListGroupHeader* KItemListGroupHeaderCreator<T>::create(KItemListView* view)
{
KItemListGroupHeader* widget = static_cast<KItemListGroupHeader*>(popRecycleableWidget());
{
KItemListGroupHeader* widget = static_cast<KItemListGroupHeader*>(popRecycleableWidget());
- if (widget) {
- widget->setParentItem(parent);
- } else {
- widget = new T(parent);
+ if (!widget) {
+ widget = new T(view);
addCreatedWidget(widget);
}
return widget;
addCreatedWidget(widget);
}
return widget;