Call canFetchMore/fetchMore when scrolled to the bottom of the view
When scrolling to the bottom of the view, if there are expanded items then it should call canFetchMore/fetchMore up the chain until it finds one with more items that can possibly be retrieved. This brings it in line with the QAbstractItemView implementation which would call canFetchMore on the root index, therefore we go up the chain to the root to see if anything before that can be fetched. [ChangeLog][QtWidgets][QTreeView] QTreeView now calls canFetchMore and fetchMore when the bottom of the QTreeView is scrolled to. Task-number: QTBUG-48725 Change-Id: I2b2145684bb34c8c317bfce4a0ef14f243a64719 Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
This commit is contained in:
parent
5a64696264
commit
764854dc47
@ -3992,6 +3992,27 @@ int QTreeView::visualIndex(const QModelIndex &index) const
|
||||
return d->viewIndex(index);
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
|
||||
void QTreeView::verticalScrollbarValueChanged(int value)
|
||||
{
|
||||
Q_D(QTreeView);
|
||||
if (!d->viewItems.isEmpty() && value == verticalScrollBar()->maximum()) {
|
||||
QModelIndex ret = d->viewItems.last().index;
|
||||
// Root index will be handled by base class implementation
|
||||
while (ret.isValid()) {
|
||||
if (isExpanded(ret) && d->model->canFetchMore(ret)) {
|
||||
d->model->fetchMore(ret);
|
||||
break;
|
||||
}
|
||||
ret = ret.parent();
|
||||
}
|
||||
}
|
||||
QAbstractItemView::verticalScrollbarValueChanged(value);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include "moc_qtreeview.cpp"
|
||||
|
@ -169,6 +169,7 @@ protected Q_SLOTS:
|
||||
void columnMoved();
|
||||
void reexpand();
|
||||
void rowsRemoved(const QModelIndex &parent, int first, int last);
|
||||
void verticalScrollbarValueChanged(int value) Q_DECL_OVERRIDE;
|
||||
|
||||
protected:
|
||||
QTreeView(QTreeViewPrivate &dd, QWidget *parent = Q_NULLPTR);
|
||||
|
@ -171,6 +171,7 @@ private slots:
|
||||
|
||||
void statusTip_data();
|
||||
void statusTip();
|
||||
void fetchMoreOnScroll();
|
||||
|
||||
// task-specific tests:
|
||||
void task174627_moveLeftToRoot();
|
||||
@ -4470,5 +4471,49 @@ void tst_QTreeView::statusTip()
|
||||
QTest::mouseMove(mw.windowHandle(), centerPoint);
|
||||
QTRY_COMPARE(mw.statusBar()->currentMessage(), QLatin1String("Header 0 -- Status"));
|
||||
}
|
||||
|
||||
class FetchMoreModel : public QStandardItemModel
|
||||
{
|
||||
public:
|
||||
FetchMoreModel() : QStandardItemModel(), canFetchReady(false)
|
||||
{
|
||||
for (int i = 0; i < 20; ++i) {
|
||||
QStandardItem *item = new QStandardItem("Row");
|
||||
item->appendRow(new QStandardItem("Child"));
|
||||
appendRow(item);
|
||||
}
|
||||
}
|
||||
bool canFetchMore(const QModelIndex &parent) const override
|
||||
{
|
||||
if (!canFetchReady || !parent.isValid())
|
||||
return false;
|
||||
if (!parent.parent().isValid())
|
||||
return rowCount(parent) < 20;
|
||||
return false;
|
||||
}
|
||||
void fetchMore(const QModelIndex &parent) override
|
||||
{
|
||||
QStandardItem *item = itemFromIndex(parent);
|
||||
for (int i = 0; i < 19; ++i)
|
||||
item->appendRow(new QStandardItem(QString("New Child %1").arg(i)));
|
||||
}
|
||||
bool canFetchReady;
|
||||
};
|
||||
|
||||
void tst_QTreeView::fetchMoreOnScroll()
|
||||
{
|
||||
QTreeView tw;
|
||||
FetchMoreModel im;
|
||||
tw.setModel(&im);
|
||||
tw.show();
|
||||
tw.expandAll();
|
||||
QTest::qWaitForWindowActive(&tw);
|
||||
// Now we can allow the fetch to happen
|
||||
im.canFetchReady = true;
|
||||
tw.verticalScrollBar()->setValue(tw.verticalScrollBar()->maximum());
|
||||
// The item should have now fetched the other children, thus bringing the count to 20
|
||||
QCOMPARE(im.item(19)->rowCount(), 20);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QTreeView)
|
||||
#include "tst_qtreeview.moc"
|
||||
|
Loading…
x
Reference in New Issue
Block a user