aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Moe Gustavsen <richard.gustavsen@qt.io>2018-08-09 14:03:14 +0200
committerRichard Moe Gustavsen <richard.gustavsen@qt.io>2018-08-10 14:58:51 +0000
commit481ea25bc8aa64e7131edd85a6c871b2a3193f58 (patch)
tree3c52abef78a2321e8baf47c339a53bb2c740f648
parent886d463061ba34802bf844133396e3706d6912a4 (diff)
QQuickTableView: add a 'forceLayout()' function to the public API
This function needs to be called from the application whenever it needs to change column widths (or row heights) for the currently visible columns. Changing column widths is done by changing what values the columnWidthProvider returns. But TableView doesn't know that the assigned function has new values to return for the current columns. Calling 'forceLayout()' will inform about this, and trigger a re-layout. Change-Id: I3cf15bbfb522baf93c7e01a34841e54455a098b9 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io> Reviewed-by: J-P Nurmi <jpnurmi@gmail.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r--src/quick/items/qquicktableview.cpp26
-rw-r--r--src/quick/items/qquicktableview_p.h2
-rw-r--r--tests/auto/quick/qquicktableview/data/forcelayout.qml78
-rw-r--r--tests/auto/quick/qquicktableview/tst_qquicktableview.cpp30
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