diff options
-rw-r--r-- | src/gui/itemmodels/qstandarditemmodel.cpp | 8 | ||||
-rw-r--r-- | src/gui/itemmodels/qstandarditemmodel_p.h | 28 |
2 files changed, 25 insertions, 11 deletions
diff --git a/src/gui/itemmodels/qstandarditemmodel.cpp b/src/gui/itemmodels/qstandarditemmodel.cpp index f55e90c153..235bc5bd7d 100644 --- a/src/gui/itemmodels/qstandarditemmodel.cpp +++ b/src/gui/itemmodels/qstandarditemmodel.cpp @@ -142,6 +142,8 @@ void QStandardItemPrivate::setChild(int row, int column, QStandardItem *item, oldItem->d_func()->setModel(0); delete oldItem; children.replace(index, item); + if (item) + item->d_func()->lastKnownIndex = index; if (model && emitChanged) emit model->layoutChanged(); @@ -475,6 +477,8 @@ bool QStandardItemPrivate::insertRows(int row, const QList<QStandardItem*> &item item->d_func()->parent = q; int index = childIndex(i + row, 0); children.replace(index, item); + if (item) + item->d_func()->lastKnownIndex = index; } if (model) model->d_func()->rowsInserted(q, row, count); @@ -512,6 +516,8 @@ bool QStandardItemPrivate::insertRows(int row, int count, const QList<QStandardI } } children.replace(index, item); + if (item) + item->d_func()->lastKnownIndex = index; ++index; } } @@ -558,6 +564,8 @@ bool QStandardItemPrivate::insertColumns(int column, int count, const QList<QSta int c = column + (i % count); int index = childIndex(r, c); children.replace(index, item); + if (item) + item->d_func()->lastKnownIndex = index; } } if (model) diff --git a/src/gui/itemmodels/qstandarditemmodel_p.h b/src/gui/itemmodels/qstandarditemmodel_p.h index 4589a62223..00e83f7b08 100644 --- a/src/gui/itemmodels/qstandarditemmodel_p.h +++ b/src/gui/itemmodels/qstandarditemmodel_p.h @@ -114,7 +114,7 @@ public: rows(0), columns(0), q_ptr(0), - lastIndexOf(-1) + lastKnownIndex(-1) { } inline int childIndex(int row, int column) const { @@ -126,32 +126,38 @@ public: } inline int childIndex(const QStandardItem *child) const { const int lastChild = children.size() - 1; - if (lastIndexOf == -1) - lastIndexOf = lastChild / 2; - // assuming the item is in the vicinity of the last search, iterate forwards and + int &childsLastIndexInParent = child->d_func()->lastKnownIndex; + if (childsLastIndexInParent != -1 && childsLastIndexInParent <= lastChild) { + if (children.at(childsLastIndexInParent) == child) + return childsLastIndexInParent; + } else { + childsLastIndexInParent = lastChild / 2; + } + + // assuming the item is in the vicinity of the previous index, iterate forwards and // backwards through the children - int backwardIter = lastIndexOf - 1; - int forwardIter = lastIndexOf; + int backwardIter = childsLastIndexInParent - 1; + int forwardIter = childsLastIndexInParent; Q_FOREVER { if (forwardIter <= lastChild) { if (children.at(forwardIter) == child) { - lastIndexOf = forwardIter; + childsLastIndexInParent = forwardIter; break; } ++forwardIter; } else if (backwardIter < 0) { - lastIndexOf = -1; + childsLastIndexInParent = -1; break; } if (backwardIter >= 0) { if (children.at(backwardIter) == child) { - lastIndexOf = backwardIter; + childsLastIndexInParent = backwardIter; break; } --backwardIter; } } - return lastIndexOf; + return childsLastIndexInParent; } QPair<int, int> position() const; void setChild(int row, int column, QStandardItem *item, @@ -192,7 +198,7 @@ public: QStandardItem *q_ptr; - mutable int lastIndexOf; + mutable int lastKnownIndex; // this is a cached value }; class QStandardItemModelPrivate : public QAbstractItemModelPrivate |