diff options
author | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2021-03-10 17:21:07 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-03-26 21:13:38 +0000 |
commit | de3dfe2411180c2a4754f22a1a61b19a25099a2c (patch) | |
tree | 075640b9250ebc44ad6ad78ebe1053690db2ac38 /src/quick/items | |
parent | dbf08f32cd06ebf5ef4eeeb53fa5bab69bab57b3 (diff) |
QQuickTableView: always update content size when rebuilding small tables
If you have a TableView with only a couple of rows, and you add
a third one, the contentHeight doesn't update. This is fine if
not all rows are loaded (some are outside the viewport), but when
they are all inside, it should update to reflect the exact height.
The same is also the case for the contentWidth. If you add a new
row that increases the with of a column (and all columns are
visible), the contentWidth should update.
This patch adds an extra check when we do a rebuild (which we do
when you add a new row), to see if all rows or columns are
loaded. And if that is the case, we update contentHeight or
contentWidth, respecitively.
Fixes: QTBUG-92099
Change-Id: I806bfb7c3606fca97c5d27cbb91856cc40df9fb8
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
(cherry picked from commit d6a5afd120838647e0dd2a420dacf06389f0a48e)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquicktableview.cpp | 26 | ||||
-rw-r--r-- | src/quick/items/qquicktableview_p_p.h | 2 |
2 files changed, 26 insertions, 2 deletions
diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp index ef386c3934..652050b5ec 100644 --- a/src/quick/items/qquicktableview.cpp +++ b/src/quick/items/qquicktableview.cpp @@ -642,6 +642,28 @@ int QQuickTableViewPrivate::nextVisibleEdgeIndex(Qt::Edge edge, int startIndex) return foundIndex; } +bool QQuickTableViewPrivate::allColumnsLoaded() +{ + // Returns true if all the columns in the model (that are not + // hidden by the columnWidthProvider) are currently loaded and visible. + const bool firstColumnLoaded = nextVisibleEdgeIndexAroundLoadedTable(Qt::LeftEdge) == kEdgeIndexAtEnd; + if (!firstColumnLoaded) + return false; + bool lastColumnLoaded = nextVisibleEdgeIndexAroundLoadedTable(Qt::RightEdge) == kEdgeIndexAtEnd; + return lastColumnLoaded; +} + +bool QQuickTableViewPrivate::allRowsLoaded() +{ + // Returns true if all the rows in the model (that are not hidden + // by the columnWidthProvider) are currently loaded and visible. + const bool firstColumnLoaded = nextVisibleEdgeIndexAroundLoadedTable(Qt::TopEdge) == kEdgeIndexAtEnd; + if (!firstColumnLoaded) + return false; + bool lastColumnLoaded = nextVisibleEdgeIndexAroundLoadedTable(Qt::BottomEdge) == kEdgeIndexAtEnd; + return lastColumnLoaded; +} + void QQuickTableViewPrivate::updateContentWidth() { // Note that we actually never really know what the content size / size of the full table will @@ -1929,12 +1951,12 @@ void QQuickTableViewPrivate::layoutAfterLoadingInitialTable() relayoutTableItems(); syncLoadedTableRectFromLoadedTable(); - if (rebuildOptions.testFlag(RebuildOption::CalculateNewContentWidth)) { + if (rebuildOptions.testFlag(RebuildOption::CalculateNewContentWidth) || allColumnsLoaded()) { updateAverageColumnWidth(); updateContentWidth(); } - if (rebuildOptions.testFlag(RebuildOption::CalculateNewContentHeight)) { + if (rebuildOptions.testFlag(RebuildOption::CalculateNewContentHeight) || allRowsLoaded()) { updateAverageRowHeight(); updateContentHeight(); } diff --git a/src/quick/items/qquicktableview_p_p.h b/src/quick/items/qquicktableview_p_p.h index 87f07abe8c..758c0308b8 100644 --- a/src/quick/items/qquicktableview_p_p.h +++ b/src/quick/items/qquicktableview_p_p.h @@ -368,6 +368,8 @@ public: int nextVisibleEdgeIndex(Qt::Edge edge, int startIndex); int nextVisibleEdgeIndexAroundLoadedTable(Qt::Edge edge); + bool allColumnsLoaded(); + bool allRowsLoaded(); inline int edgeToArrayIndex(Qt::Edge edge); void clearEdgeSizeCache(); |