diff options
Diffstat (limited to 'src/qgraphicstreeview.cpp')
-rw-r--r-- | src/qgraphicstreeview.cpp | 75 |
1 files changed, 30 insertions, 45 deletions
diff --git a/src/qgraphicstreeview.cpp b/src/qgraphicstreeview.cpp index cc24969..85490cd 100644 --- a/src/qgraphicstreeview.cpp +++ b/src/qgraphicstreeview.cpp @@ -335,18 +335,17 @@ void QtGraphicsTreeViewPrivate::_q_reset() void QtGraphicsTreeViewPrivate::_q_selectionsChanged(const QtTreeSelection &selection) { //qDebug() << "QtGraphicsTreeViewPrivate::_q_selectionsChanged" << selection; - for (int i = 0; i < items.count(); ++i) - if (selection.contains(items.at(i)->iterator())) - items.at(i)->update(); + // ### FIXME: it might be more efficient to iterate over the items instead + QtTreeSelection::const_iterator it = selection.constBegin(); + for (; it != selection.constEnd(); ++it) + updateItem(*it); } void QtGraphicsTreeViewPrivate::_q_currentChanged(const QtTreeModelBase::iterator_base ¤t, const QtTreeModelBase::iterator_base &previous) { - //Q_Q(QtGraphicsTreeView); - Q_UNUSED(current); - Q_UNUSED(previous); //qDebug() << "QtGraphicsTreeViewPrivate::_q_currentChanged" << current << previous; - //q->update(); // ### FIXME: remove when converted to items + updateItem(current); + updateItem(previous); } /*! @@ -712,29 +711,10 @@ void QtGraphicsTreeViewPrivate::_q_mapIndexesToItems() /*! \internal */ -void QtGraphicsTreeViewPrivate::scrollItems(QtTreeModelBase::iterator_base it, QStack<QtTreeModelBase::iterator_base> stack, int index) -{ - // shift items around - Q_ASSERT(it.isValid()); - if (!items.isEmpty()) { - // scrolling down - move from first to last - while (items.first()->index() < index) { - const QtGraphicsTreeViewItem *last = items.last(); - QtTreeModelIterator iterator = last->iterator(); - next(iterator, stack); - Q_ASSERT(iterator.isValid()); - items.append(creator->reassign(iterator, last->index() + 1, items.takeFirst())); - } - // scrolling up - move from last to first - const int firstNonVisibleIndex = index + items.count(); - while (items.last()->index() >= firstNonVisibleIndex) { - const QtGraphicsTreeViewItem *first = items.first(); - QtTreeModelIterator iterator = first->iterator(); - previous(iterator, stack); - Q_ASSERT(iterator.isValid()); - items.prepend(creator->reassign(iterator, first->index() - 1, items.takeLast())); - } - } +void QtGraphicsTreeViewPrivate::updateItem(const QtTreeModelBase::iterator_base &it) const +{ + if (QtGraphicsTreeViewItem *item = items.value(it)) + item->update(); } // QtGraphicsTreeView @@ -1156,21 +1136,25 @@ void QtGraphicsTreeView::doLayout() if (!it.isValid()) return; + // collect unused items for reassignment + QHash<QtTreeModelBase::iterator_base, QtGraphicsTreeViewItem*> unused = d->items; + d->items.clear(); // ### FIXME: find a solution that updates in-place + // position the visible items - const int firstVisibleIndex = index; + const qreal x = -horizontalOffset; while (y < area.height() && it.isValid()) { - qreal x = -horizontalOffset; - - // ### FIXME: scroll the items properly - QtGraphicsTreeViewItem *item = 0; - const int i = index - firstVisibleIndex; - if (i >= d->items.count()) { - item = d->creator->create(it, index, this); - d->items.append(item); - } else { - item = d->creator->reassign(it, index, d->items.at(i)); + // update item geometry + QtGraphicsTreeViewItem *item = unused.take(it); + if (!item) { // if the item did not exist + if (unused.isEmpty()) { + item = d->creator->create(it, index, this); + } else { // take another random item (idealy we should take from the bottom, since this kicks in early when scolling up) + QHash<QtTreeModelBase::iterator_base, QtGraphicsTreeViewItem*>::iterator random = unused.begin(); + item = d->creator->reassign(it, index, random.value()); + unused.erase(random); + } } - + d->items.insert(it, item); QSizeF size = item->sizeHint(it, &option, Qt::PreferredSize, constraint); item->setGeometry(x, y, w, size.height()); // next item @@ -1179,9 +1163,10 @@ void QtGraphicsTreeView::doLayout() ++index; } // while - // clean up view items - while ((index - firstVisibleIndex) < d->items.count()) - d->creator->recycle(d->items.takeLast()); + // recycle any unused items left + QHash<QtTreeModelBase::iterator_base, QtGraphicsTreeViewItem*>::iterator it2 = unused.begin(); + for (; it2 != unused.end(); ++it2) + d->creator->recycle(it2.value()); } /*! |