diff options
-rw-r--r-- | src/quick/items/qquicktableview.cpp | 26 | ||||
-rw-r--r-- | src/quick/items/qquicktableview_p.h | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquicktableview/data/forcelayout.qml | 78 | ||||
-rw-r--r-- | tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | 30 |
4 files changed, 131 insertions, 5 deletions
diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp index 367d99990d..d308621bc6 100644 --- a/src/quick/items/qquicktableview.cpp +++ b/src/quick/items/qquicktableview.cpp @@ -648,12 +648,14 @@ qreal QQuickTableViewPrivate::resolveRowHeight(int row) void QQuickTableViewPrivate::relayoutTable() { relayoutTableItems(); - columnRowPositionsInvalid = false; - syncLoadedTableRectFromLoadedTable(); + enforceTableAtOrigin(); contentSizeBenchMarkPoint = QPoint(-1, -1); updateContentWidth(); updateContentHeight(); + // Return back to updatePolish to loadAndUnloadVisibleEdges() + // since the re-layout might have caused some edges to be pushed + // out, while others might have been pushed in. } void QQuickTableViewPrivate::relayoutTableItems() @@ -884,10 +886,16 @@ void QQuickTableViewPrivate::endRebuildTable() { tableRebuilding = false; - if (loadedItems.isEmpty()) - return; + if (rowHeightProvider.isNull() && columnWidthProvider.isNull()) { + // Since we have no size providers, we need to calculate the size + // of each row and column based on the size of the delegate items. + // This couldn't be done while we were loading the initial rows and + // columns, since during the process, we didn't have all the items + // available yet for the calculation. So we mark that it needs to be + // done now, from within updatePolish(). + columnRowPositionsInvalid = true; + } - relayoutTable(); qCDebug(lcTableViewDelegateLifecycle()) << tableLayoutToString(); } @@ -1614,6 +1622,14 @@ void QQuickTableView::setExplicitContentHeight(qreal height) setContentHeight(height); } +void QQuickTableView::forceLayout() +{ + Q_D(QQuickTableView); + d->columnRowPositionsInvalid = true; + if (!d->updatePolishIfPossible()) + polish(); +} + QQuickTableViewAttached *QQuickTableView::qmlAttachedProperties(QObject *obj) { return new QQuickTableViewAttached(obj); diff --git a/src/quick/items/qquicktableview_p.h b/src/quick/items/qquicktableview_p.h index 513e644e43..ff9a22f9af 100644 --- a/src/quick/items/qquicktableview_p.h +++ b/src/quick/items/qquicktableview_p.h @@ -129,6 +129,8 @@ public: qreal explicitContentHeight() const; void setExplicitContentHeight(qreal height); + Q_INVOKABLE void forceLayout(); + static QQuickTableViewAttached *qmlAttachedProperties(QObject *); Q_SIGNALS: diff --git a/tests/auto/quick/qquicktableview/data/forcelayout.qml b/tests/auto/quick/qquicktableview/data/forcelayout.qml new file mode 100644 index 0000000000..118abf51ee --- /dev/null +++ b/tests/auto/quick/qquicktableview/data/forcelayout.qml @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.12 +import QtQuick.Window 2.3 +import Qt.labs.tableview 1.0 + +Item { + width: 640 + height: 450 + + property alias tableView: tableView + property real columnWidths: 80 + + TableView { + id: tableView + width: 600 + height: 400 + anchors.margins: 1 + delegate: tableViewDelegate + cacheBuffer: 0 + columnSpacing: 1 + rowSpacing: 1 + + columnWidthProvider: function(c) { return columnWidths; } + } + + Component { + id: tableViewDelegate + Rectangle { + color: "lightgray" + border.width: 1 + implicitHeight: 100 + + Text { + anchors.centerIn: parent + text: modelData + } + } + } + +} diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp index b2f4e412f1..982eed7fe2 100644 --- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp +++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp @@ -95,6 +95,7 @@ private slots: void checkRowHeightProvider(); void checkRowHeightProviderInvalidReturnValues(); void checkRowHeightProviderNotCallable(); + void checkForceLayoutFunction(); void checkContentWidthAndHeight(); void checkExplicitContentWidthAndHeight(); void noDelegate(); @@ -402,6 +403,35 @@ void tst_QQuickTableView::checkRowHeightProviderNotCallable() QCOMPARE(fxItem->item->height(), kDefaultRowHeight); } +void tst_QQuickTableView::checkForceLayoutFunction() +{ + // When we set the 'columnWidths' property in the test file, the + // columnWidthProvider should return other values than it did during + // start-up. Check that this takes effect after a call to the 'forceLayout()' function. + LOAD_TABLEVIEW("forcelayout.qml"); + + const char *propertyName = "columnWidths"; + auto model = TestModelAsVariant(10, 10); + + tableView->setModel(model); + + WAIT_UNTIL_POLISHED; + + // Check that the initial column widths are as specified in the QML file + const qreal initialColumnWidth = view->rootObject()->property(propertyName).toReal(); + for (auto fxItem : tableViewPrivate->loadedItems) + QCOMPARE(fxItem->item->width(), initialColumnWidth); + + // Change the return value from the columnWidthProvider to something else + const qreal newColumnWidth = 100; + view->rootObject()->setProperty(propertyName, newColumnWidth); + tableView->forceLayout(); + // We don't have to polish; The re-layout happens immediately + + for (auto fxItem : tableViewPrivate->loadedItems) + QCOMPARE(fxItem->item->width(), newColumnWidth); +} + void tst_QQuickTableView::checkContentWidthAndHeight() { // Check that contentWidth/Height reports the correct size of the the |