--- src/gui/itemviews/qtreeview.cpp.orig 2007-10-01 15:06:11.000000000 +0200 +++ src/gui/itemviews/qtreeview.cpp 2007-10-20 17:29:18.000000000 +0200 @@ -542,7 +542,6 @@ if (!index.isValid()) return; - d->executePostedLayout(); if (hide) { QPersistentModelIndex persistent(index); if (!d->hiddenIndexes.contains(persistent)) @@ -571,6 +570,7 @@ i += count; } } + d->executePostedLayout(); updateGeometries(); d->viewport->update(); } else { @@ -2102,14 +2102,19 @@ /*! \internal */ -static bool treeViewItemLessThan(const QTreeViewItem &i1, - const QTreeViewItem &i2) +static bool treeViewItemLessThan(const QTreeViewItem &left, + const QTreeViewItem &right) { - if (i1.level < i2.level) - return false; - else if (i2.level < i1.level) - return true; - return (i1.index.row() < i2.index.row()); + if (left.level != right.level) { + Q_ASSERT(left.level > right.level); + QModelIndex leftParent = left.index.parent(); + QModelIndex rightParent = right.index.parent(); + // computer parent, don't get + while (leftParent.parent() != rightParent) + leftParent = leftParent.parent(); + return (leftParent.row() < right.index.row()); + } + return (left.index.row() < right.index.row()); } /*! @@ -2164,6 +2169,15 @@ //Q_ASSERT(modelIndex.parent() == parent); d->viewItems[item].index = d->model->index( modelIndex.row() + delta, modelIndex.column(), parent); + + if(!d->viewItems[item].index.isValid()) { + // Something really bad is happening, a bad model is + // often the cause. We can't optimize in this case :( + // qWarning() << "QTreeView::rowsInserted internal representation of the model has been corrupted, resetting."; + doItemsLayout(); + return; + } + item += d->viewItems.at(item).total + 1; } } @@ -2175,7 +2189,6 @@ } d->updateChildCount(parentItem, delta); - d->doDelayedItemsLayout(); } else if ((parentItem != -1) && d->viewItems.at(parentItem).expanded) { d->doDelayedItemsLayout(); } @@ -3245,6 +3258,13 @@ int start, int end, bool after) { Q_Q(QTreeView); + + // if we are going to do a complete relayout anyway, there is no need to update + if (delayedLayout.isActive()) { + _q_rowsRemoved(parent, start, end); + return; + } + const int parentItem = viewIndex(parent); if ((parentItem != -1) || (parent == root)) {