From 0ddc5ba510938368a7368f2a5cfda6ea22217a96 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 9 Apr 2019 10:54:34 +0200 Subject: QQuickTableView: combine layouts and rebuilds into the same code path Rather than handle relayouts differenty than rebuilds, we can make it a part of the rebuild structure instead, since they overlap a lot. That way we can collect everything that needs to be updated into a single variable (rebuildOptions). This will simplify the upcoming work for synchronizing tableviews. Change-Id: I8bb2638612c86194a854e6fefc998eae22357a7a Reviewed-by: Mitch Curtis --- src/quick/items/qquicktableview.cpp | 49 ++++++++++++++++------------------- src/quick/items/qquicktableview_p_p.h | 11 ++++---- 2 files changed, 28 insertions(+), 32 deletions(-) (limited to 'src/quick/items') diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp index 12faac8127..9bc6723cbd 100644 --- a/src/quick/items/qquicktableview.cpp +++ b/src/quick/items/qquicktableview.cpp @@ -709,9 +709,8 @@ void QQuickTableViewPrivate::syncLoadedTableRectFromLoadedTable() void QQuickTableViewPrivate::forceLayout() { - columnRowPositionsInvalid = true; clearEdgeSizeCache(); - RebuildOptions rebuildOptions = RebuildOption::None; + RebuildOptions rebuildOptions = RebuildOption::LayoutOnly; // Go through all columns from first to last, find the columns that used // to be hidden and not loaded, and check if they should become visible @@ -750,8 +749,7 @@ void QQuickTableViewPrivate::forceLayout() break; } - if (rebuildOptions) - scheduleRebuildTable(rebuildOptions); + scheduleRebuildTable(rebuildOptions); if (polishing) { qWarning() << "TableView::forceLayout(): Cannot do an immediate re-layout during an ongoing layout!"; @@ -1195,7 +1193,6 @@ void QQuickTableViewPrivate::relayoutTable() void QQuickTableViewPrivate::relayoutTableItems() { qCDebug(lcTableViewDelegateLifecycle); - columnRowPositionsInvalid = false; qreal nextColumnX = loadedTableOuterRect.x(); qreal nextRowY = loadedTableOuterRect.y(); @@ -1465,7 +1462,13 @@ bool QQuickTableViewPrivate::moveToNextRebuildState() // that the current state is not yet done. return false; } - rebuildState = RebuildState(int(rebuildState) + 1); + + if (rebuildState == RebuildState::Begin + && rebuildOptions.testFlag(RebuildOption::LayoutOnly)) + rebuildState = RebuildState::LayoutTable; + else + rebuildState = RebuildState(int(rebuildState) + 1); + qCDebug(lcTableViewDelegateLifecycle()) << int(rebuildState); return true; } @@ -1527,7 +1530,6 @@ void QQuickTableViewPrivate::beginRebuildTable() loadedRows.clear(); loadedTableOuterRect = QRect(); loadedTableInnerRect = QRect(); - columnRowPositionsInvalid = false; clearEdgeSizeCache(); if (topLeft.x() == kEdgeIndexAtEnd || topLeft.y() == kEdgeIndexAtEnd) { @@ -1541,12 +1543,14 @@ void QQuickTableViewPrivate::beginRebuildTable() void QQuickTableViewPrivate::layoutAfterLoadingInitialTable() { - if (rowHeightProvider.isUndefined() || columnWidthProvider.isUndefined()) { + if (rebuildOptions.testFlag(RebuildOption::LayoutOnly) + || rowHeightProvider.isUndefined() || columnWidthProvider.isUndefined()) { // Since we don't have both 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 do it now. + // available yet for the calculation. So we do it now. The exception + // is if we specifically only requested a relayout. relayoutTable(); } @@ -1708,11 +1712,6 @@ void QQuickTableViewPrivate::scheduleRebuildTable(RebuildOptions options) { q_func()->polish(); } -void QQuickTableViewPrivate::invalidateColumnRowPositions() { - columnRowPositionsInvalid = true; - q_func()->polish(); -} - void QQuickTableViewPrivate::updatePolish() { // Whenever something changes, e.g viewport moves, spacing is set to a @@ -1745,13 +1744,6 @@ void QQuickTableViewPrivate::updatePolish() if (loadedItems.isEmpty()) return; - if (columnRowPositionsInvalid) { - relayoutTable(); - updateAverageEdgeSize(); - updateContentWidth(); - updateContentHeight(); - } - loadAndUnloadVisibleEdges(); } @@ -1856,10 +1848,15 @@ void QQuickTableViewPrivate::syncRebuildOptions() rebuildOptions = scheduledRebuildOptions; scheduledRebuildOptions = RebuildOption::None; - if (loadedItems.isEmpty()) { - // If we have no items from before, we cannot just rebuild the viewport, but need - // to rebuild everything, since we have no top-left loaded item to start from. + if (loadedItems.isEmpty()) rebuildOptions.setFlag(RebuildOption::All); + + // Some options are exclusive: + if (rebuildOptions.testFlag(RebuildOption::All)) { + rebuildOptions.setFlag(RebuildOption::ViewportOnly, false); + rebuildOptions.setFlag(RebuildOption::LayoutOnly, false); + } else if (rebuildOptions.testFlag(RebuildOption::ViewportOnly)) { + rebuildOptions.setFlag(RebuildOption::LayoutOnly, false); } } @@ -2073,7 +2070,7 @@ void QQuickTableView::setRowSpacing(qreal spacing) return; d->cellSpacing.setHeight(spacing); - d->invalidateColumnRowPositions(); + d->scheduleRebuildTable(QQuickTableViewPrivate::RebuildOption::LayoutOnly); emit rowSpacingChanged(); } @@ -2091,7 +2088,7 @@ void QQuickTableView::setColumnSpacing(qreal spacing) return; d->cellSpacing.setWidth(spacing); - d->invalidateColumnRowPositions(); + d->scheduleRebuildTable(QQuickTableViewPrivate::RebuildOption::LayoutOnly); emit columnSpacingChanged(); } diff --git a/src/quick/items/qquicktableview_p_p.h b/src/quick/items/qquicktableview_p_p.h index 53bd6ec973..acf537198b 100644 --- a/src/quick/items/qquicktableview_p_p.h +++ b/src/quick/items/qquicktableview_p_p.h @@ -188,10 +188,11 @@ public: enum class RebuildOption { None = 0, - ViewportOnly = 0x1, - CalculateNewTopLeftRow = 0x2, - CalculateNewTopLeftColumn = 0x4, - All = 0x8, + LayoutOnly = 0x1, + ViewportOnly = 0x2, + CalculateNewTopLeftRow = 0x4, + CalculateNewTopLeftColumn = 0x8, + All = 0x10, }; Q_DECLARE_FLAGS(RebuildOptions, RebuildOption) @@ -246,7 +247,6 @@ public: QQmlTableInstanceModel::ReusableFlag reusableFlag = QQmlTableInstanceModel::Reusable; bool blockItemCreatedCallback = false; - bool columnRowPositionsInvalid = false; bool layoutWarningIssued = false; bool polishing = false; @@ -356,7 +356,6 @@ public: void layoutAfterLoadingInitialTable(); void scheduleRebuildTable(QQuickTableViewPrivate::RebuildOptions options); - void invalidateColumnRowPositions(); int resolveImportVersion(); void createWrapperModel(); -- cgit v1.2.3