diff options
author | Tasuku Suzuki <tasuku.suzuki@signal-slot.co.jp> | 2023-03-05 17:11:08 +0900 |
---|---|---|
committer | Tasuku Suzuki <tasuku.suzuki@signal-slot.co.jp> | 2023-03-07 18:24:50 +0900 |
commit | 562a1a46a0917be3f9bb8c24b81aa7ad5a46f010 (patch) | |
tree | 41450e64571c7424e99d29b9934857221d19cb0d | |
parent | e09d1a5694fa48332831521ec3851e5bffcf8ffe (diff) |
Fix build with -no-feature-quick-viewtransitions
Pick-to: 6.5
Change-Id: I609a843bddbd0776452d289b144dab803503a483
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r-- | src/quick/items/qquickgridview.cpp | 31 | ||||
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 55 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p.h | 6 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 22 | ||||
-rw-r--r-- | src/quick/items/qquickitemviewfxitem.cpp | 31 | ||||
-rw-r--r-- | src/quick/items/qquickitemviewfxitem_p_p.h | 6 | ||||
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 32 | ||||
-rw-r--r-- | src/quick/items/qquickpositioners.cpp | 44 | ||||
-rw-r--r-- | src/quick/items/qquickpositioners_p.h | 10 | ||||
-rw-r--r-- | src/quick/items/qquickpositioners_p_p.h | 7 | ||||
-rw-r--r-- | src/quicktemplates/CMakeLists.txt | 8 | ||||
-rw-r--r-- | src/quicktemplates/qquickstackelement.cpp | 28 | ||||
-rw-r--r-- | src/quicktemplates/qquickstackelement_p_p.h | 13 | ||||
-rw-r--r-- | src/quicktemplates/qquickstacktransition_p_p.h | 4 | ||||
-rw-r--r-- | src/quicktemplates/qquickstackview.cpp | 25 | ||||
-rw-r--r-- | src/quicktemplates/qquickstackview_p.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates/qquickstackview_p.h | 6 | ||||
-rw-r--r-- | src/quicktemplates/qquickstackview_p_p.h | 18 |
18 files changed, 330 insertions, 20 deletions
diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 7f45d45708..6b75c2ab05 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -162,7 +162,9 @@ public: void setPosition(qreal pos) override; void layoutVisibleItems(int fromModelIndex = 0) override; bool applyInsertionChange(const QQmlChangeSet::Change &insert, ChangeResult *changeResult, QList<FxViewItem *> *addedItems, QList<MovedItem> *movingIntoView) override; +#if QT_CONFIG(quick_viewtransitions) void translateAndTransitionItemsAfter(int afterModelIndex, const ChangeResult &insertionResult, const ChangeResult &removalResult) override; +#endif bool needsRefillForAddedOrRemovedIndex(int index) const override; qreal headerSize() const override; @@ -503,8 +505,10 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal qCDebug(lcItemViewDelegateLifecycle) << "refill: append item" << modelIndex << colPos << rowPos; if (!(item = static_cast<FxGridItemSG*>(createItem(modelIndex, incubationMode)))) break; +#if QT_CONFIG(quick_viewtransitions) if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() item->setPosition(colPos, rowPos, true); +#endif QQuickItemPrivate::get(item->item)->setCulled(doBuffer); visibleItems.append(item); if (++colNum >= columns) { @@ -538,8 +542,10 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal if (!(item = static_cast<FxGridItemSG*>(createItem(visibleIndex-1, incubationMode)))) break; --visibleIndex; +#if QT_CONFIG(quick_viewtransitions) if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() item->setPosition(colPos, rowPos, true); +#endif QQuickItemPrivate::get(item->item)->setCulled(doBuffer); visibleItems.prepend(item); if (--colNum < 0) { @@ -555,11 +561,14 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal void QQuickGridViewPrivate::removeItem(FxViewItem *item) { +#if QT_CONFIG(quick_viewtransitions) if (item->transitionScheduledOrRunning()) { qCDebug(lcItemViewDelegateLifecycle) << "\tnot releasing animating item:" << item->index << item->item->objectName(); item->releaseAfterTransition = true; releasePendingTransition.append(item); - } else { + } else +#endif + { releaseItem(item, QQmlDelegateModel::NotReusable); } } @@ -883,7 +892,11 @@ void QQuickGridViewPrivate::initializeCurrentItem() FxViewItem *actualItem = visibleItem(currentIndex); // don't reposition the item if it's about to be transitioned to another position - if ((!actualItem || !actualItem->transitionScheduledOrRunning())) + if ((!actualItem +#if QT_CONFIG(quick_viewtransitions) + || !actualItem->transitionScheduledOrRunning() +#endif + )) gridItem->setPosition(colPosAt(currentIndex), rowPosAt(currentIndex)); } } @@ -2404,6 +2417,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch } } +#if QT_CONFIG(quick_viewtransitions) // Update the indexes of the following visible items. for (FxViewItem *item : std::as_const(visibleItems)) { if (item->index != -1 && item->index >= modelIndex) { @@ -2414,6 +2428,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, false); } } +#endif int prevVisibleCount = visibleItems.size(); if (insertResult->visiblePos.isValid() && rowPos < insertResult->visiblePos) { @@ -2443,9 +2458,11 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch insertResult->changedFirstItem = true; if (!change.isMove()) { addedItems->append(item); +#if QT_CONFIG(quick_viewtransitions) if (transitioner) item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); else +#endif item->moveTo(QPointF(colPos, rowPos), true); } insertResult->sizeChangesBeforeVisiblePos += rowSize(); @@ -2497,13 +2514,19 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch if (change.isMove()) { // we know this is a move target, since move displaced items that are // shuffled into view due to a move would be added in refill() - if (newItem && transitioner && transitioner->canTransition(QQuickItemViewTransitioner::MoveTransition, true)) + if (newItem +#if QT_CONFIG(quick_viewtransitions) + && transitioner && transitioner->canTransition(QQuickItemViewTransitioner::MoveTransition, true) +#endif + ) movingIntoView->append(MovedItem(item, change.moveKey(item->index))); } else { addedItems->append(item); +#if QT_CONFIG(quick_viewtransitions) if (transitioner) item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); else +#endif item->moveTo(QPointF(colPos, rowPos), true); } insertResult->sizeChangesAfterVisiblePos += rowSize(); @@ -2523,6 +2546,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch return visibleItems.size() > prevVisibleCount; } +#if QT_CONFIG(quick_viewtransitions) void QQuickGridViewPrivate::translateAndTransitionItemsAfter(int afterModelIndex, const ChangeResult &insertionResult, const ChangeResult &removalResult) { if (!transitioner) @@ -2562,6 +2586,7 @@ void QQuickGridViewPrivate::translateAndTransitionItemsAfter(int afterModelIndex } } } +#endif bool QQuickGridViewPrivate::needsRefillForAddedOrRemovedIndex(int modelIndex) const { diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index a149f8d098..ba6c1534d3 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -211,10 +211,12 @@ void QQuickItemView::setModel(const QVariant &m) setCurrentIndex(d->model->count() > 0 ? 0 : -1); d->updateViewport(); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner && d->transitioner->populateTransition) { d->transitioner->setPopulateTransitionEnabled(true); d->forceLayoutPolish(); } +#endif } connect(d->model, SIGNAL(modelUpdated(QQmlChangeSet,bool)), @@ -684,6 +686,7 @@ void QQuickItemView::setReuseItems(bool reuse) emit reuseItemsChanged(); } +#if QT_CONFIG(quick_viewtransitions) QQuickTransition *QQuickItemView::populateTransition() const { Q_D(const QQuickItemView); @@ -811,6 +814,7 @@ void QQuickItemView::setDisplacedTransition(QQuickTransition *transition) emit displacedTransitionChanged(); } } +#endif void QQuickItemViewPrivate::positionViewAtIndex(int index, int mode) { @@ -1148,11 +1152,13 @@ void QQuickItemViewPrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometry // don't allow item movement transitions to trigger a re-layout and // start new transitions bool prevInLayout = inLayout; +#if QT_CONFIG(quick_viewtransitions) if (!inLayout) { FxViewItem *actualItem = transitioner ? visibleItem(currentIndex) : nullptr; if (actualItem && actualItem->transitionRunning()) inLayout = true; } +#endif updateHighlight(); inLayout = prevInLayout; } @@ -1165,17 +1171,20 @@ void QQuickItemView::destroyRemoved() { Q_D(QQuickItemView); +#if QT_CONFIG(quick_viewtransitions) bool hasRemoveTransition = false; bool hasRemoveTransitionAsTarget = false; if (d->transitioner) { hasRemoveTransition = d->transitioner->canTransition(QQuickItemViewTransitioner::RemoveTransition, false); hasRemoveTransitionAsTarget = d->transitioner->canTransition(QQuickItemViewTransitioner::RemoveTransition, true); } +#endif for (QList<FxViewItem*>::Iterator it = d->visibleItems.begin(); it != d->visibleItems.end();) { FxViewItem *item = *it; if (item->index == -1 && (!item->attached || item->attached->delayRemove() == false)) { +#if QT_CONFIG(quick_viewtransitions) if (hasRemoveTransitionAsTarget) { // don't remove from visibleItems until next layout() d->runDelayedRemoveTransition = true; @@ -1184,9 +1193,12 @@ void QQuickItemView::destroyRemoved() } else { if (hasRemoveTransition) d->runDelayedRemoveTransition = true; +#endif d->releaseItem(item, d->reusableFlag); it = d->visibleItems.erase(it); +#if QT_CONFIG(quick_viewtransitions) } +#endif } else { ++it; } @@ -1201,8 +1213,10 @@ void QQuickItemView::modelUpdated(const QQmlChangeSet &changeSet, bool reset) Q_D(QQuickItemView); if (reset) { cancelFlick(); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) d->transitioner->setPopulateTransitionEnabled(true); +#endif d->moveReason = QQuickItemViewPrivate::SetIndex; d->regenerate(); if (d->highlight && d->currentItem) { @@ -1212,8 +1226,10 @@ void QQuickItemView::modelUpdated(const QQmlChangeSet &changeSet, bool reset) } d->moveReason = QQuickItemViewPrivate::Other; emit countChanged(); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner && d->transitioner->populateTransition) d->forceLayoutPolish(); +#endif } else { if (d->inLayout) { d->bufferedChanges.prepare(d->currentIndex, d->itemCount); @@ -1449,8 +1465,10 @@ void QQuickItemView::componentComplete() d->updateFooter(); d->updateViewport(); d->setPosition(d->contentStartOffset()); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) d->transitioner->setPopulateTransitionEnabled(true); +#endif if (d->isValid()) { d->refill(); @@ -1487,7 +1505,9 @@ QQuickItemViewPrivate::QQuickItemViewPrivate() , highlightRangeStart(0), highlightRangeEnd(0) , highlightMoveDuration(150) , headerComponent(nullptr), header(nullptr), footerComponent(nullptr), footer(nullptr) +#if QT_CONFIG(quick_viewtransitions) , transitioner(nullptr) +#endif , minExtent(0), maxExtent(0) , ownModel(false), wrap(false) , keyNavigationEnabled(true) @@ -1495,7 +1515,10 @@ QQuickItemViewPrivate::QQuickItemViewPrivate() , inLayout(false), inViewportMoved(false), forceLayout(false), currentIndexCleared(false) , haveHighlightRange(false), autoHighlight(true), highlightRangeStartValid(false), highlightRangeEndValid(false) , fillCacheBuffer(false), inRequest(false) - , runDelayedRemoveTransition(false), delegateValidated(false), isClearing(false) +#if QT_CONFIG(quick_viewtransitions) + , runDelayedRemoveTransition(false) +#endif + , delegateValidated(false), isClearing(false) { bufferPause.addAnimationChangeListener(this, QAbstractAnimationJob::Completion); bufferPause.setLoopCount(1); @@ -1504,9 +1527,11 @@ QQuickItemViewPrivate::QQuickItemViewPrivate() QQuickItemViewPrivate::~QQuickItemViewPrivate() { +#if QT_CONFIG(quick_viewtransitions) if (transitioner) transitioner->setChangeListener(nullptr); delete transitioner; +#endif } bool QQuickItemViewPrivate::isValid() const @@ -1682,11 +1707,13 @@ void QQuickItemViewPrivate::clear(bool onDestruction) releaseVisibleItems(QQmlInstanceModel::NotReusable); visibleIndex = 0; +#if QT_CONFIG(quick_viewtransitions) for (FxViewItem *item : std::as_const(releasePendingTransition)) { item->releaseAfterTransition = false; releaseItem(item, QQmlInstanceModel::NotReusable); } releasePendingTransition.clear(); +#endif auto oldCurrentItem = currentItem; releaseItem(currentItem, QQmlDelegateModel::NotReusable); @@ -1836,12 +1863,15 @@ void QQuickItemViewPrivate::layout() clear(); setPosition(contentStartOffset()); updateViewport(); +#if QT_CONFIG(quick_viewtransitions) if (transitioner) transitioner->setPopulateTransitionEnabled(false); +#endif inLayout = false; return; } +#if QT_CONFIG(quick_viewtransitions) if (runDelayedRemoveTransition && transitioner && transitioner->canTransition(QQuickItemViewTransitioner::RemoveTransition, false)) { // assume that any items moving now are moving due to the remove - if they schedule @@ -1849,6 +1879,7 @@ void QQuickItemViewPrivate::layout() for (int i=0; i<visibleItems.size(); i++) visibleItems[i]->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, false); } +#endif ChangeResult insertionPosChanges; ChangeResult removalPosChanges; @@ -1862,6 +1893,7 @@ void QQuickItemViewPrivate::layout() } forceLayout = false; +#if QT_CONFIG(quick_viewtransitions) if (transitioner && transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) { // Give the view one more chance to refill itself, // in case its size is changed such that more delegates become visible after component completed @@ -1871,12 +1903,15 @@ void QQuickItemViewPrivate::layout() item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::PopulateTransition, true); } } +#endif updateSections(); layoutVisibleItems(); storeFirstVisibleItemPosition(); +#if QT_CONFIG(quick_viewtransitions) int lastIndexInView = findLastIndexInView(); +#endif refill(); markExtentsDirty(); updateHighlight(); @@ -1891,6 +1926,7 @@ void QQuickItemViewPrivate::layout() updateViewport(); updateUnrequestedPositions(); +#if QT_CONFIG(quick_viewtransitions) if (transitioner) { // items added in the last refill() may need to be transitioned in - e.g. a remove // causes items to slide up into view @@ -1931,11 +1967,14 @@ void QQuickItemViewPrivate::layout() transitioner->setPopulateTransitionEnabled(false); transitioner->resetTargetLists(); } +#endif if (!currentItem) updateCurrent(currentIndex); +#if QT_CONFIG(quick_viewtransitions) runDelayedRemoveTransition = false; +#endif inLayout = false; } @@ -1991,6 +2030,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult removalResult.countChangeBeforeVisible += (correctedFirstVisibleIndex - r.index); } } +#if QT_CONFIG(quick_viewtransitions) if (runDelayedRemoveTransition) { QQmlChangeSet::Change removal; for (QList<FxViewItem*>::Iterator it = visibleItems.begin(); it != visibleItems.end();) { @@ -2004,6 +2044,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult } } } +#endif *totalRemovalResult += removalResult; if (!removals.isEmpty()) { updateVisibleIndex(); @@ -2042,6 +2083,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult item->attached->emitAdd(); } +#if QT_CONFIG(quick_viewtransitions) // for each item that was moved directly into the view as a result of a move(), // find the index it was moved from in order to set its initial position, so that we // can transition it from this "original" position to its new position in the view @@ -2057,13 +2099,16 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult } } } +#endif // reposition visibleItems.first() correctly so that the content y doesn't jump if (removedCount != prevVisibleItemsCount) repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult); // Whatever removed/moved items remain are no longer visible items. +#if QT_CONFIG(quick_viewtransitions) prepareRemoveTransitions(¤tChanges.removedItems); +#endif for (auto it = currentChanges.removedItems.begin(); it != currentChanges.removedItems.end(); ++it) { releaseItem(it.value(), reusableFlag); @@ -2120,10 +2165,12 @@ bool QQuickItemViewPrivate::applyRemovalChange(const QQmlChangeSet::Change &remo } else if (item->index >= removal.index + removal.count) { // after removed items item->index -= removal.count; +#if QT_CONFIG(quick_viewtransitions) if (removal.isMove()) item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, false); else item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, false); +#endif ++it; } else { // removed item @@ -2157,7 +2204,9 @@ void QQuickItemViewPrivate::removeItem(FxViewItem *item, const QQmlChangeSet::Ch } if (removal.isMove()) { currentChanges.removedItems.replace(removal.moveKey(item->index), item); +#if QT_CONFIG(quick_viewtransitions) item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, true); +#endif } else { // track item so it is released later currentChanges.removedItems.insert(QQmlChangeSet::MoveKey(), item); @@ -2211,6 +2260,7 @@ void QQuickItemViewPrivate::repositionFirstItem(FxViewItem *prevVisibleItemsFirs } } +#if QT_CONFIG(quick_viewtransitions) void QQuickItemViewPrivate::createTransitioner() { if (!transitioner) { @@ -2286,6 +2336,7 @@ void QQuickItemViewPrivate::viewItemTransitionFinished(QQuickItemViewTransitiona } } } +#endif /* This may return 0 if the item is being created asynchronously. @@ -2299,6 +2350,7 @@ FxViewItem *QQuickItemViewPrivate::createItem(int modelIndex, QQmlIncubator::Inc if (requestedIndex == modelIndex && incubationMode == QQmlIncubator::Asynchronous) return nullptr; +#if QT_CONFIG(quick_viewtransitions) for (int i=0; i<releasePendingTransition.size(); i++) { if (releasePendingTransition.at(i)->index == modelIndex && !releasePendingTransition.at(i)->isPendingRemoval()) { @@ -2306,6 +2358,7 @@ FxViewItem *QQuickItemViewPrivate::createItem(int modelIndex, QQmlIncubator::Inc return releasePendingTransition.takeAt(i); } } +#endif inRequest = true; diff --git a/src/quick/items/qquickitemview_p.h b/src/quick/items/qquickitemview_p.h index f74ca5177b..60def4cef4 100644 --- a/src/quick/items/qquickitemview_p.h +++ b/src/quick/items/qquickitemview_p.h @@ -57,6 +57,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickItemView : public QQuickFlickable Q_PROPERTY(QQmlComponent *footer READ footer WRITE setFooter NOTIFY footerChanged) Q_PROPERTY(QQuickItem *footerItem READ footerItem NOTIFY footerItemChanged) +#if QT_CONFIG(quick_viewtransitions) Q_PROPERTY(QQuickTransition *populate READ populateTransition WRITE setPopulateTransition NOTIFY populateTransitionChanged) Q_PROPERTY(QQuickTransition *add READ addTransition WRITE setAddTransition NOTIFY addTransitionChanged) Q_PROPERTY(QQuickTransition *addDisplaced READ addDisplacedTransition WRITE setAddDisplacedTransition NOTIFY addDisplacedTransitionChanged) @@ -65,6 +66,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickItemView : public QQuickFlickable Q_PROPERTY(QQuickTransition *remove READ removeTransition WRITE setRemoveTransition NOTIFY removeTransitionChanged) Q_PROPERTY(QQuickTransition *removeDisplaced READ removeDisplacedTransition WRITE setRemoveDisplacedTransition NOTIFY removeDisplacedTransitionChanged) Q_PROPERTY(QQuickTransition *displaced READ displacedTransition WRITE setDisplacedTransition NOTIFY displacedTransitionChanged) +#endif Q_PROPERTY(QQmlComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged) Q_PROPERTY(QQuickItem *highlightItem READ highlightItem NOTIFY highlightItemChanged) @@ -144,6 +146,7 @@ public: void setHeader(QQmlComponent *); QQuickItem *headerItem() const; +#if QT_CONFIG(quick_viewtransitions) QQuickTransition *populateTransition() const; void setPopulateTransition(QQuickTransition *transition); @@ -167,6 +170,7 @@ public: QQuickTransition *displacedTransition() const; void setDisplacedTransition(QQuickTransition *transition); +#endif QQmlComponent *highlight() const; void setHighlight(QQmlComponent *); @@ -233,6 +237,7 @@ Q_SIGNALS: void headerItemChanged(); void footerItemChanged(); +#if QT_CONFIG(quick_viewtransitions) void populateTransitionChanged(); void addTransitionChanged(); void addDisplacedTransitionChanged(); @@ -241,6 +246,7 @@ Q_SIGNALS: void removeTransitionChanged(); void removeDisplacedTransitionChanged(); void displacedTransitionChanged(); +#endif void highlightChanged(); void highlightItemChanged(); diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index b978410bce..301ff6f326 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -21,7 +21,9 @@ QT_REQUIRE_CONFIG(quick_itemview); #include "qquickitemview_p.h" #include "qquickitemviewfxitem_p_p.h" +#if QT_CONFIG(quick_viewtransitions) #include "qquickitemviewtransition_p.h" +#endif #include "qquickflickable_p_p.h" #include <QtQmlModels/private/qqmlobjectmodel_p.h> #include <QtQmlModels/private/qqmldelegatemodel_p.h> @@ -64,7 +66,12 @@ public: }; -class Q_QUICK_AUTOTEST_EXPORT QQuickItemViewPrivate : public QQuickFlickablePrivate, public QQuickItemViewTransitionChangeListener, public QAnimationJobChangeListener +class Q_QUICK_AUTOTEST_EXPORT QQuickItemViewPrivate + : public QQuickFlickablePrivate +#if QT_CONFIG(quick_viewtransitions) + , public QQuickItemViewTransitionChangeListener +#endif + , public QAnimationJobChangeListener { public: Q_DECLARE_PUBLIC(QQuickItemView) @@ -166,11 +173,13 @@ public: void repositionFirstItem(FxViewItem *prevVisibleItemsFirst, qreal prevVisibleItemsFirstPos, FxViewItem *prevFirstVisible, ChangeResult *insertionResult, ChangeResult *removalResult); +#if QT_CONFIG(quick_viewtransitions) void createTransitioner(); void prepareVisibleItemTransitions(); void prepareRemoveTransitions(QMultiHash<QQmlChangeSet::MoveKey, FxViewItem *> *removedItems); bool prepareNonVisibleItemTransition(FxViewItem *item, const QRectF &viewBounds); void viewItemTransitionFinished(QQuickItemViewTransitionableItem *item) override; +#endif int findMoveKeyIndex(QQmlChangeSet::MoveKey key, const QVector<QQmlChangeSet::Change> &changes) const; @@ -187,7 +196,10 @@ public: bool hasPendingChanges() const { return currentChanges.hasPendingChanges() || bufferedChanges.hasPendingChanges() - ||runDelayedRemoveTransition; +#if QT_CONFIG(quick_viewtransitions) + ||runDelayedRemoveTransition +#endif + ; } void refillOrLayout() { @@ -266,8 +278,10 @@ public: MovedItem(FxViewItem *i, QQmlChangeSet::MoveKey k) : item(i), moveKey(k) {} }; +#if QT_CONFIG(quick_viewtransitions) QQuickItemViewTransitioner *transitioner; QVector<FxViewItem *> releasePendingTransition; +#endif mutable qreal minExtent; mutable qreal maxExtent; @@ -286,7 +300,9 @@ public: bool highlightRangeEndValid : 1; bool fillCacheBuffer : 1; bool inRequest : 1; +#if QT_CONFIG(quick_viewtransitions) bool runDelayedRemoveTransition : 1; +#endif bool delegateValidated : 1; bool isClearing : 1; @@ -333,7 +349,9 @@ protected: QList<FxViewItem *> *newItems, QList<MovedItem> *movingIntoView) = 0; virtual bool needsRefillForAddedOrRemovedIndex(int) const { return false; } +#if QT_CONFIG(quick_viewtransitions) virtual void translateAndTransitionItemsAfter(int afterIndex, const ChangeResult &insertionResult, const ChangeResult &removalResult) = 0; +#endif virtual void initializeViewItem(FxViewItem *) {} virtual void initializeCurrentItem() {} diff --git a/src/quick/items/qquickitemviewfxitem.cpp b/src/quick/items/qquickitemviewfxitem.cpp index 70e122ca60..aca790c5ad 100644 --- a/src/quick/items/qquickitemviewfxitem.cpp +++ b/src/quick/items/qquickitemviewfxitem.cpp @@ -10,7 +10,9 @@ QT_BEGIN_NAMESPACE QQuickItemViewFxItem::QQuickItemViewFxItem(QQuickItem *item, bool ownItem, QQuickItemChangeListener* changeListener) : item(item) , changeListener(changeListener) +#if QT_CONFIG(quick_viewtransitions) , transitionableItem(nullptr) +#endif , ownItem(ownItem) , releaseAfterTransition(false) , trackGeom(false) @@ -19,8 +21,10 @@ QQuickItemViewFxItem::QQuickItemViewFxItem(QQuickItem *item, bool ownItem, QQuic QQuickItemViewFxItem::~QQuickItemViewFxItem() { +#if QT_CONFIG(quick_viewtransitions) delete transitionableItem; transitionableItem = nullptr; +#endif if (ownItem && item) { trackGeometry(false); @@ -31,25 +35,42 @@ QQuickItemViewFxItem::~QQuickItemViewFxItem() qreal QQuickItemViewFxItem::itemX() const { - return transitionableItem ? transitionableItem->itemX() : (item ? item->x() : 0); + return +#if QT_CONFIG(quick_viewtransitions) + transitionableItem ? transitionableItem->itemX() : +#endif + (item ? item->x() : 0); } qreal QQuickItemViewFxItem::itemY() const { - return transitionableItem ? transitionableItem->itemY() : (item ? item->y() : 0); + return +#if QT_CONFIG(quick_viewtransitions) + transitionableItem ? transitionableItem->itemY() : +#endif + (item ? item->y() : 0); } void QQuickItemViewFxItem::moveTo(const QPointF &pos, bool immediate) { +#if QT_CONFIG(quick_viewtransitions) if (transitionableItem) transitionableItem->moveTo(pos, immediate); - else if (item) + else +#else + Q_UNUSED(immediate) +#endif + if (item) item->setPosition(pos); } void QQuickItemViewFxItem::setVisible(bool visible) { - if (!visible && transitionableItem && transitionableItem->transitionScheduledOrRunning()) + if (!visible +#if QT_CONFIG(quick_viewtransitions) + && transitionableItem && transitionableItem->transitionScheduledOrRunning() +#endif + ) return; if (item) QQuickItemPrivate::get(item)->setCulled(!visible); @@ -87,6 +108,7 @@ void QQuickItemViewFxItem::setGeometry(const QRectF &geometry) item->setSize(geometry.size()); } +#if QT_CONFIG(quick_viewtransitions) QQuickItemViewTransitioner::TransitionType QQuickItemViewFxItem::scheduledTransitionType() const { return transitionableItem ? transitionableItem->nextTransitionType : QQuickItemViewTransitioner::NoTransition; @@ -126,6 +148,7 @@ void QQuickItemViewFxItem::startTransition(QQuickItemViewTransitioner *transitio if (transitionableItem) transitionableItem->startTransition(transitioner, index); } +#endif QT_END_NAMESPACE diff --git a/src/quick/items/qquickitemviewfxitem_p_p.h b/src/quick/items/qquickitemviewfxitem_p_p.h index b453054a89..eec72fdcf3 100644 --- a/src/quick/items/qquickitemviewfxitem_p_p.h +++ b/src/quick/items/qquickitemviewfxitem_p_p.h @@ -17,7 +17,9 @@ #include <QtQuick/private/qtquickglobal_p.h> #include <QtQuick/private/qquickitem_p.h> +#if QT_CONFIG(quick_viewtransitions) #include <QtQuick/private/qquickitemviewtransition_p.h> +#endif #include <private/qanimationjobutil_p.h> QT_REQUIRE_CONFIG(quick_itemview); @@ -42,6 +44,7 @@ public: QRectF geometry() const; void setGeometry(const QRectF &geometry); +#if QT_CONFIG(quick_viewtransitions) QQuickItemViewTransitioner::TransitionType scheduledTransitionType() const; bool transitionScheduledOrRunning() const; bool transitionRunning() const; @@ -50,6 +53,7 @@ public: void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget); bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds); void startTransition(QQuickItemViewTransitioner *transitioner); +#endif // these are positions and sizes along the current direction of scrolling/flicking virtual qreal position() const = 0; @@ -62,7 +66,9 @@ public: SelfDeletable m_selfDeletable; QPointer<QQuickItem> item; QQuickItemChangeListener *changeListener; +#if QT_CONFIG(quick_viewtransitions) QQuickItemViewTransitionableItem *transitionableItem; +#endif int index = -1; bool ownItem : 1; bool releaseAfterTransition : 1; diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 564d86f386..0111d7d7b2 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -75,7 +75,9 @@ public: void layoutVisibleItems(int fromModelIndex = 0) override; bool applyInsertionChange(const QQmlChangeSet::Change &insert, ChangeResult *changeResult, QList<FxViewItem *> *addedItems, QList<MovedItem> *movingIntoView) override; +#if QT_CONFIG(quick_viewtransitions) void translateAndTransitionItemsAfter(int afterIndex, const ChangeResult &insertionResult, const ChangeResult &removalResult) override; +#endif void updateSectionCriteria() override; void updateSections() override; @@ -756,7 +758,9 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal if (!(item = static_cast<FxListItemSG*>(createItem(modelIndex, incubationMode)))) break; qCDebug(lcItemViewDelegateLifecycle) << "refill: append item" << modelIndex << "pos" << pos << "buffer" << doBuffer << "item" << (QObject *)(item->item); +#if QT_CONFIG(quick_viewtransitions) if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() +#endif item->setPosition(pos, true); if (item->item) QQuickItemPrivate::get(item->item)->setCulled(doBuffer); @@ -775,7 +779,9 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal qCDebug(lcItemViewDelegateLifecycle) << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos << "buffer" << doBuffer << "item" << (QObject *)(item->item); --visibleIndex; visiblePos -= item->size() + spacing; +#if QT_CONFIG(quick_viewtransitions) if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() +#endif item->setPosition(visiblePos, true); if (item->item) QQuickItemPrivate::get(item->item)->setCulled(doBuffer); @@ -788,11 +794,14 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal void QQuickListViewPrivate::removeItem(FxViewItem *item) { +#if QT_CONFIG(quick_viewtransitions) if (item->transitionScheduledOrRunning()) { qCDebug(lcItemViewDelegateLifecycle) << "\tnot releasing animating item" << item->index << (QObject *)(item->item); item->releaseAfterTransition = true; releasePendingTransition.append(item); - } else { + } else +#endif + { qCDebug(lcItemViewDelegateLifecycle) << "\treleasing stationary item" << item->index << (QObject *)(item->item); releaseItem(item, reusableFlag); } @@ -1590,8 +1599,10 @@ void QQuickListViewPrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometry // position all subsequent items if (visibleItems.size() && item == visibleItems.constFirst()->item) { FxListItemSG *listItem = static_cast<FxListItemSG*>(visibleItems.constFirst()); +#if QT_CONFIG(quick_viewtransitions) if (listItem->transitionScheduledOrRunning()) return; +#endif if (orient == QQuickListView::Vertical) { const qreal oldItemEndPosition = verticalLayoutDirection == QQuickItemView::BottomToTop ? -oldGeometry.y() : oldGeometry.y() + oldGeometry.height(); const qreal heightDiff = item->height() - oldGeometry.height(); @@ -3622,6 +3633,9 @@ void QQuickListViewPrivate::updateSectionCriteria() bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &change, ChangeResult *insertResult, QList<FxViewItem *> *addedItems, QList<MovedItem> *movingIntoView) { +#if QT_CONFIG(quick_viewtransitions) + Q_UNUSED(movingIntoView) +#endif int modelIndex = change.index; int count = change.count; @@ -3664,10 +3678,12 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch for (FxViewItem *item : std::as_const(visibleItems)) { if (item->index != -1 && item->index >= modelIndex) { item->index += count; +#if QT_CONFIG(quick_viewtransitions) if (change.isMove()) item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, false); else item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, false); +#endif } } @@ -3702,9 +3718,11 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch insertResult->changedFirstItem = true; if (!change.isMove()) { addedItems->append(item); +#if QT_CONFIG(quick_viewtransitions) if (transitioner) item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); else +#endif static_cast<FxListItemSG *>(item)->setPosition(pos, true); } insertResult->sizeChangesBeforeVisiblePos += item->size() + spacing; @@ -3733,7 +3751,9 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch FxViewItem *item = nullptr; if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(it.index)))) item->index = it.index; +#if QT_CONFIG(quick_viewtransitions) bool newItem = !item; +#endif it.removedAtIndex = false; if (!item) item = createItem(it.index, QQmlIncubator::Synchronous); @@ -3750,13 +3770,17 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch if (change.isMove()) { // we know this is a move target, since move displaced items that are // shuffled into view due to a move would be added in refill() +#if QT_CONFIG(quick_viewtransitions) if (newItem && transitioner && transitioner->canTransition(QQuickItemViewTransitioner::MoveTransition, true)) movingIntoView->append(MovedItem(item, change.moveKey(item->index))); +#endif } else { addedItems->append(item); +#if QT_CONFIG(quick_viewtransitions) if (transitioner) item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); else +#endif static_cast<FxListItemSG *>(item)->setPosition(pos, true); } insertResult->sizeChangesAfterVisiblePos += item->size() + spacing; @@ -3770,13 +3794,17 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch FxViewItem *item = visibleItems.at(index); if (prevItem->index != item->index - 1) { int i = index; +#if QT_CONFIG(quick_viewtransitions) qreal prevPos = prevItem->position(); +#endif while (i < visibleItems.size()) { FxListItemSG *nvItem = static_cast<FxListItemSG *>(visibleItems.takeLast()); insertResult->sizeChangesAfterVisiblePos -= nvItem->size() + spacing; addedItems->removeOne(nvItem); +#if QT_CONFIG(quick_viewtransitions) if (nvItem->transitionScheduledOrRunning()) nvItem->setPosition(prevPos + (nvItem->index - prevItem->index) * averageSize); +#endif removeItem(nvItem); } } @@ -3788,6 +3816,7 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch return visibleAffected; } +#if QT_CONFIG(quick_viewtransitions) void QQuickListViewPrivate::translateAndTransitionItemsAfter(int afterModelIndex, const ChangeResult &insertionResult, const ChangeResult &removalResult) { Q_UNUSED(insertionResult); @@ -3821,6 +3850,7 @@ void QQuickListViewPrivate::translateAndTransitionItemsAfter(int afterModelIndex } } } +#endif /*! \qmlmethod QtQuick::ListView::positionViewAtIndex(int index, PositionMode mode) diff --git a/src/quick/items/qquickpositioners.cpp b/src/quick/items/qquickpositioners.cpp index 5bb1f4f6d9..b1d50c72d4 100644 --- a/src/quick/items/qquickpositioners.cpp +++ b/src/quick/items/qquickpositioners.cpp @@ -33,7 +33,9 @@ void QQuickBasePositionerPrivate::unwatchChanges(QQuickItem* other) QQuickBasePositioner::PositionedItem::PositionedItem(QQuickItem *i) : item(i) +#if QT_CONFIG(quick_viewtransitions) , transitionableItem(nullptr) +#endif , index(-1) , isNew(false) , isVisible(true) @@ -46,27 +48,40 @@ QQuickBasePositioner::PositionedItem::PositionedItem(QQuickItem *i) QQuickBasePositioner::PositionedItem::~PositionedItem() { +#if QT_CONFIG(quick_viewtransitions) delete transitionableItem; +#endif } qreal QQuickBasePositioner::PositionedItem::itemX() const { - return transitionableItem ? transitionableItem->itemX() : item->x(); + return +#if QT_CONFIG(quick_viewtransitions) + transitionableItem ? transitionableItem->itemX() : +#endif + item->x(); } qreal QQuickBasePositioner::PositionedItem::itemY() const { - return transitionableItem ? transitionableItem->itemY() : item->y(); + return +#if QT_CONFIG(quick_viewtransitions) + transitionableItem ? transitionableItem->itemY() : +#endif + item->y(); } void QQuickBasePositioner::PositionedItem::moveTo(const QPointF &pos) { +#if QT_CONFIG(quick_viewtransitions) if (transitionableItem) transitionableItem->moveTo(pos); else +#endif item->setPosition(pos); } +#if QT_CONFIG(quick_viewtransitions) void QQuickBasePositioner::PositionedItem::transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget) { if (!transitioner) @@ -86,6 +101,7 @@ void QQuickBasePositioner::PositionedItem::startTransition(QQuickItemViewTransit if (transitionableItem) transitionableItem->startTransition(transitioner, index); } +#endif void QQuickBasePositioner::PositionedItem::updatePadding(qreal lp, qreal tp, qreal rp, qreal bp) { @@ -132,7 +148,9 @@ QQuickBasePositioner::QQuickBasePositioner(QQuickBasePositionerPrivate &dd, Posi QQuickBasePositioner::~QQuickBasePositioner() { Q_D(QQuickBasePositioner); +#if QT_CONFIG(quick_viewtransitions) delete d->transitioner; +#endif for (int i = 0; i < positionedItems.count(); ++i) d->unwatchChanges(positionedItems.at(i).item); for (int i = 0; i < unpositionedItems.count(); ++i) @@ -164,6 +182,7 @@ void QQuickBasePositioner::setSpacing(qreal s) emit spacingChanged(); } +#if QT_CONFIG(quick_viewtransitions) QQuickTransition *QQuickBasePositioner::populate() const { Q_D(const QQuickBasePositioner); @@ -216,17 +235,24 @@ void QQuickBasePositioner::setAdd(QQuickTransition *add) d->transitioner->addTransition = add; emit addChanged(); } +#endif void QQuickBasePositioner::componentComplete() { +#if QT_CONFIG(quick_viewtransitions) Q_D(QQuickBasePositioner); +#endif QQuickItem::componentComplete(); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) d->transitioner->setPopulateTransitionEnabled(true); +#endif positionedItems.reserve(childItems().size()); prePositioning(); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) d->transitioner->setPopulateTransitionEnabled(false); +#endif } void QQuickBasePositioner::itemChange(ItemChange change, const ItemChangeData &value) @@ -275,7 +301,9 @@ void QQuickBasePositioner::prePositioning() for (int ii = 0; ii < unpositionedItems.count(); ii++) oldItems.append(unpositionedItems[ii]); unpositionedItems.clear(); +#if QT_CONFIG(quick_viewtransitions) int addedIndex = -1; +#endif for (int ii = 0; ii < children.size(); ++ii) { QQuickItem *child = children.at(ii); @@ -295,6 +323,7 @@ void QQuickBasePositioner::prePositioning() posItem.index = positionedItems.count(); positionedItems.append(posItem); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) { if (addedIndex < 0) addedIndex = posItem.index; @@ -304,6 +333,7 @@ void QQuickBasePositioner::prePositioning() else if (!d->transitioner->populateTransitionEnabled()) theItem->transitionNextReposition(d->transitioner, QQuickItemViewTransitioner::AddTransition, true); } +#endif } } else { PositionedItem *item = &oldItems[wIdx]; @@ -320,11 +350,13 @@ void QQuickBasePositioner::prePositioning() item->index = positionedItems.count(); positionedItems.append(*item); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) { if (addedIndex < 0) addedIndex = item->index; positionedItems[positionedItems.count()-1].transitionNextReposition(d->transitioner, QQuickItemViewTransitioner::AddTransition, true); } +#endif } else { item->isNew = false; item->index = positionedItems.count(); @@ -333,6 +365,7 @@ void QQuickBasePositioner::prePositioning() } } +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) { for (int i=0; i<positionedItems.count(); i++) { if (!positionedItems[i].isNew) { @@ -346,6 +379,7 @@ void QQuickBasePositioner::prePositioning() } } } +#endif QSizeF contentSize(0,0); reportConflictingAnchors(); @@ -354,6 +388,7 @@ void QQuickBasePositioner::prePositioning() updateAttachedProperties(); } +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) { QRectF viewBounds(QPointF(), contentSize); for (int i=0; i<positionedItems.count(); i++) @@ -362,6 +397,7 @@ void QQuickBasePositioner::prePositioning() positionedItems[i].startTransition(d->transitioner); d->transitioner->resetTargetLists(); } +#endif d->doingPositioning = false; @@ -403,13 +439,17 @@ void QQuickBasePositioner::positionItemY(qreal y, PositionedItem *target) void QQuickBasePositioner::removePositionedItem(QPODVector<PositionedItem,8> *items, int index) { Q_ASSERT(index >= 0 && index < items->count()); +#if QT_CONFIG(quick_viewtransitions) delete items->at(index).transitionableItem; +#endif items->remove(index); } void QQuickBasePositioner::clearPositionedItems(QPODVector<PositionedItem,8> *items) { +#if QT_CONFIG(quick_viewtransitions) for (int i=0; i<items->count(); i++) delete items->at(i).transitionableItem; +#endif items->clear(); } diff --git a/src/quick/items/qquickpositioners_p.h b/src/quick/items/qquickpositioners_p.h index 42ab3bc6a7..326106a601 100644 --- a/src/quick/items/qquickpositioners_p.h +++ b/src/quick/items/qquickpositioners_p.h @@ -20,7 +20,9 @@ QT_REQUIRE_CONFIG(quick_positioners); #include "qquickimplicitsizeitem_p.h" +#if QT_CONFIG(quick_viewtransitions) #include "qquickitemviewtransition_p.h" +#endif #include <private/qpodvector_p.h> @@ -67,9 +69,11 @@ class Q_QUICK_PRIVATE_EXPORT QQuickBasePositioner : public QQuickImplicitSizeIte Q_OBJECT Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged) +#if QT_CONFIG(quick_viewtransitions) Q_PROPERTY(QQuickTransition *populate READ populate WRITE setPopulate NOTIFY populateChanged) Q_PROPERTY(QQuickTransition *move READ move WRITE setMove NOTIFY moveChanged) Q_PROPERTY(QQuickTransition *add READ add WRITE setAdd NOTIFY addChanged) +#endif Q_PROPERTY(qreal padding READ padding WRITE setPadding RESET resetPadding NOTIFY paddingChanged REVISION(2, 6)) Q_PROPERTY(qreal topPadding READ topPadding WRITE setTopPadding RESET resetTopPadding NOTIFY topPaddingChanged REVISION(2, 6)) @@ -91,6 +95,7 @@ public: qreal spacing() const; void setSpacing(qreal); +#if QT_CONFIG(quick_viewtransitions) QQuickTransition *populate() const; void setPopulate(QQuickTransition *); @@ -99,6 +104,7 @@ public: QQuickTransition *add() const; void setAdd(QQuickTransition *); +#endif static QQuickPositionerAttached *qmlAttachedProperties(QObject *obj); @@ -164,14 +170,18 @@ protected: void moveTo(const QPointF &pos); +#if QT_CONFIG(quick_viewtransitions) void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget); bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds); void startTransition(QQuickItemViewTransitioner *transitioner); +#endif void updatePadding(qreal lp, qreal tp, qreal rp, qreal bp); QQuickItem *item; +#if QT_CONFIG(quick_viewtransitions) QQuickItemViewTransitionableItem *transitionableItem; +#endif int index; bool isNew; bool isVisible; diff --git a/src/quick/items/qquickpositioners_p_p.h b/src/quick/items/qquickpositioners_p_p.h index f91b093684..004a0f5ed1 100644 --- a/src/quick/items/qquickpositioners_p_p.h +++ b/src/quick/items/qquickpositioners_p_p.h @@ -54,7 +54,10 @@ public: QQuickBasePositionerPrivate() : spacing(0), type(QQuickBasePositioner::None) - , transitioner(0), positioningDirty(false) +#if QT_CONFIG(quick_viewtransitions) + , transitioner(0) +#endif + , positioningDirty(false) , doingPositioning(false), anchorConflict(false), layoutDirection(Qt::LeftToRight) { @@ -68,7 +71,9 @@ public: qreal spacing; QQuickBasePositioner::PositionerType type; +#if QT_CONFIG(quick_viewtransitions) QQuickItemViewTransitioner *transitioner; +#endif void watchChanges(QQuickItem *other); void unwatchChanges(QQuickItem* other); diff --git a/src/quicktemplates/CMakeLists.txt b/src/quicktemplates/CMakeLists.txt index 57f4897b53..50f4842eee 100644 --- a/src/quicktemplates/CMakeLists.txt +++ b/src/quicktemplates/CMakeLists.txt @@ -94,8 +94,6 @@ qt_internal_add_qml_module(QuickTemplates2 qquicksplitview.cpp qquicksplitview_p.h qquickstackelement.cpp qquickstackelement_p_p.h - qquickstacktransition.cpp - qquickstacktransition_p_p.h qquickstackview.cpp qquickstackview_p.cpp qquickstackview_p.h qquickstackview_p_p.h qquickswipe_p.h @@ -182,6 +180,12 @@ qt_internal_extend_target(QuickTemplates2 CONDITION QT_FEATURE_quicktemplates2_c qquickweeknumbermodel.cpp qquickweeknumbermodel_p.h ) +qt_internal_extend_target(QuickTemplates2 CONDITION QT_FEATURE_quick_viewtransitions + SOURCES + qquickstacktransition.cpp + qquickstacktransition_p_p.h +) + qt_internal_extend_Target(qtquicktemplates2plugin SOURCES qtquicktemplates2plugin.cpp diff --git a/src/quicktemplates/qquickstackelement.cpp b/src/quicktemplates/qquickstackelement.cpp index f8001a2980..417aa41643 100644 --- a/src/quicktemplates/qquickstackelement.cpp +++ b/src/quicktemplates/qquickstackelement.cpp @@ -15,6 +15,7 @@ QT_BEGIN_NAMESPACE +#if QT_CONFIG(quick_viewtransitions) static QQuickStackViewAttached *attachedStackObject(QQuickStackElement *element) { QQuickStackViewAttached *attached = qobject_cast<QQuickStackViewAttached *>(qmlAttachedPropertiesObject<QQuickStackView>(element->item, false)); @@ -22,6 +23,7 @@ static QQuickStackViewAttached *attachedStackObject(QQuickStackElement *element) QQuickStackViewAttachedPrivate::get(attached)->element = element; return attached; } +#endif class QQuickStackIncubator : public QQmlIncubator { @@ -44,18 +46,23 @@ private: }; QQuickStackElement::QQuickStackElement() +#if QT_CONFIG(quick_viewtransitions) : QQuickItemViewTransitionableItem(nullptr) +#endif { } QQuickStackElement::~QQuickStackElement() { +#if QT_CONFIG(quick_viewtransitions) if (item) QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Destroyed); +#endif if (ownComponent) delete component; +#if QT_CONFIG(quick_viewtransitions) QQuickStackViewAttached *attached = attachedStackObject(this); if (item) { if (ownItem) { @@ -79,6 +86,7 @@ QQuickStackElement::~QQuickStackElement() if (attached) emit attached->removed(); +#endif } QQuickStackElement *QQuickStackElement::fromString(const QString &str, QQuickStackView *view, QString *error) @@ -110,9 +118,11 @@ QQuickStackElement *QQuickStackElement::fromObject(QObject *object, QQuickStackV QQuickStackElement *element = new QQuickStackElement; element->component = qobject_cast<QQmlComponent *>(object); +#if QT_CONFIG(quick_viewtransitions) element->item = qobject_cast<QQuickItem *>(object); if (element->item) element->originalParent = element->item->parentItem(); +#endif return element; } @@ -202,9 +212,11 @@ void QQuickStackElement::setIndex(int value) return; index = value; +#if QT_CONFIG(quick_viewtransitions) QQuickStackViewAttached *attached = attachedStackObject(this); if (attached) emit attached->indexChanged(); +#endif } void QQuickStackElement::setView(QQuickStackView *value) @@ -213,9 +225,11 @@ void QQuickStackElement::setView(QQuickStackView *value) return; view = value; +#if QT_CONFIG(quick_viewtransitions) QQuickStackViewAttached *attached = attachedStackObject(this); if (attached) emit attached->viewChanged(); +#endif } void QQuickStackElement::setStatus(QQuickStackView::Status value) @@ -224,6 +238,7 @@ void QQuickStackElement::setStatus(QQuickStackView::Status value) return; status = value; +#if QT_CONFIG(quick_viewtransitions) QQuickStackViewAttached *attached = attachedStackObject(this); if (!attached) return; @@ -247,17 +262,25 @@ void QQuickStackElement::setStatus(QQuickStackView::Status value) } emit attached->statusChanged(); +#endif } void QQuickStackElement::setVisible(bool visible) { +#if QT_CONFIG(quick_viewtransitions) QQuickStackViewAttached *attached = attachedStackObject(this); - if (!item || (attached && QQuickStackViewAttachedPrivate::get(attached)->explicitVisible)) +#endif + if (!item +#if QT_CONFIG(quick_viewtransitions) + || (attached && QQuickStackViewAttachedPrivate::get(attached)->explicitVisible) +#endif + ) return; item->setVisible(visible); } +#if QT_CONFIG(quick_viewtransitions) void QQuickStackElement::transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget) { if (transitioner) @@ -294,10 +317,13 @@ void QQuickStackElement::completeTransition(QQuickTransition *quickTransition) { QQuickItemViewTransitionableItem::completeTransition(quickTransition); } +#endif void QQuickStackElement::itemDestroyed(QQuickItem *) { +#if QT_CONFIG(quick_viewtransitions) item = nullptr; +#endif } QT_END_NAMESPACE diff --git a/src/quicktemplates/qquickstackelement_p_p.h b/src/quicktemplates/qquickstackelement_p_p.h index 00b150805d..b9228e951a 100644 --- a/src/quicktemplates/qquickstackelement_p_p.h +++ b/src/quicktemplates/qquickstackelement_p_p.h @@ -17,7 +17,9 @@ #include <QtQuickTemplates2/private/qquickstackview_p.h> #include <QtQuickTemplates2/private/qquickcontrol_p_p.h> +#if QT_CONFIG(quick_viewtransitions) #include <QtQuick/private/qquickitemviewtransition_p.h> +#endif #include <QtQuick/private/qquickitemchangelistener_p.h> #include <QtQml/private/qv4persistent_p.h> @@ -28,7 +30,11 @@ class QQmlComponent; struct QQuickStackTransition; class RequiredProperties; -class QQuickStackElement : public QQuickItemViewTransitionableItem, public QQuickItemChangeListener +class QQuickStackElement : +#if QT_CONFIG(quick_viewtransitions) + public QQuickItemViewTransitionableItem, +#endif + public QQuickItemChangeListener { QQuickStackElement(); @@ -47,10 +53,12 @@ public: void setStatus(QQuickStackView::Status status); void setVisible(bool visible); +#if QT_CONFIG(quick_viewtransitions) void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget); bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds); void startTransition(QQuickItemViewTransitioner *transitioner, QQuickStackView::Status status); void completeTransition(QQuickTransition *quickTransition); +#endif void itemDestroyed(QQuickItem *item) override; @@ -67,6 +75,9 @@ public: QQuickStackView::Status status = QQuickStackView::Inactive; QV4::PersistentValue properties; QV4::PersistentValue qmlCallingContext; +#if !QT_CONFIG(quick_viewtransitions) + QQuickItem *item; +#endif }; QT_END_NAMESPACE diff --git a/src/quicktemplates/qquickstacktransition_p_p.h b/src/quicktemplates/qquickstacktransition_p_p.h index e68f1bb7a1..d42e1981c0 100644 --- a/src/quicktemplates/qquickstacktransition_p_p.h +++ b/src/quicktemplates/qquickstacktransition_p_p.h @@ -15,6 +15,10 @@ // We mean it. // +#include <QtQuick/private/qtquickglobal_p.h> + +QT_REQUIRE_CONFIG(quick_viewtransitions); + #include <QtQuickTemplates2/private/qquickstackview_p.h> #include <QtQuick/private/qquickitemviewtransition_p.h> diff --git a/src/quicktemplates/qquickstackview.cpp b/src/quicktemplates/qquickstackview.cpp index c523fe6262..d232ae5b84 100644 --- a/src/quicktemplates/qquickstackview.cpp +++ b/src/quicktemplates/qquickstackview.cpp @@ -4,7 +4,9 @@ #include "qquickstackview_p.h" #include "qquickstackview_p_p.h" #include "qquickstackelement_p_p.h" +#if QT_CONFIG(quick_viewtransitions) #include "qquickstacktransition_p_p.h" +#endif #include <QtCore/qscopedvaluerollback.h> #include <QtQml/qjsvalue.h> @@ -354,10 +356,12 @@ QQuickStackView::QQuickStackView(QQuickItem *parent) QQuickStackView::~QQuickStackView() { Q_D(QQuickStackView); +#if QT_CONFIG(quick_viewtransitions) if (d->transitioner) { d->transitioner->setChangeListener(nullptr); delete d->transitioner; } +#endif qDeleteAll(d->removing); qDeleteAll(d->removed); qDeleteAll(d->elements); @@ -543,10 +547,12 @@ void QQuickStackView::push(QQmlV4Function *args) QV4::ExecutionEngine *v4 = args->v4engine(); QV4::Scope scope(v4); +#if QT_CONFIG(quick_viewtransitions) Operation operation = d->elements.isEmpty() ? Immediate : PushTransition; QV4::ScopedValue lastArg(scope, (*args)[args->length() - 1]); if (lastArg->isInt32()) operation = static_cast<Operation>(lastArg->toInt32()); +#endif QStringList errors; QList<QQuickStackElement *> elements = d->parseElements(0, args, &errors); @@ -570,17 +576,21 @@ void QQuickStackView::push(QQmlV4Function *args) return; } +#if QT_CONFIG(quick_viewtransitions) QQuickStackElement *exit = nullptr; if (!d->elements.isEmpty()) exit = d->elements.top(); +#endif int oldDepth = d->elements.size(); if (d->pushElements(elements)) { d->depthChange(d->elements.size(), oldDepth); QQuickStackElement *enter = d->elements.top(); +#if QT_CONFIG(quick_viewtransitions) d->startTransition(QQuickStackTransition::pushEnter(operation, enter, this), QQuickStackTransition::pushExit(operation, exit, this), operation == Immediate); +#endif d->setCurrentItem(enter); } @@ -671,12 +681,14 @@ void QQuickStackView::pop(QQmlV4Function *args) } } +#if QT_CONFIG(quick_viewtransitions) Operation operation = PopTransition; if (argc > 0) { QV4::ScopedValue lastArg(scope, (*args)[argc - 1]); if (lastArg->isInt32()) operation = static_cast<Operation>(lastArg->toInt32()); } +#endif QQuickItem *previousItem = nullptr; @@ -687,9 +699,11 @@ void QQuickStackView::pop(QQmlV4Function *args) previousItem = exit->item; } d->depthChange(d->elements.size(), oldDepth); +#if QT_CONFIG(quick_viewtransitions) d->startTransition(QQuickStackTransition::popExit(operation, exit, this), QQuickStackTransition::popEnter(operation, enter, this), operation == Immediate); +#endif d->setCurrentItem(enter); } @@ -812,10 +826,12 @@ void QQuickStackView::replace(QQmlV4Function *args) QV4::ExecutionEngine *v4 = args->v4engine(); QV4::Scope scope(v4); +#if QT_CONFIG(quick_viewtransitions) Operation operation = d->elements.isEmpty() ? Immediate : ReplaceTransition; QV4::ScopedValue lastArg(scope, (*args)[args->length() - 1]); if (lastArg->isInt32()) operation = static_cast<Operation>(lastArg->toInt32()); +#endif QQuickStackElement *target = nullptr; QV4::ScopedValue firstArg(scope, (*args)[0]); @@ -849,9 +865,11 @@ void QQuickStackView::replace(QQmlV4Function *args) d->removing.insert(exit); } QQuickStackElement *enter = d->elements.top(); +#if QT_CONFIG(quick_viewtransitions) d->startTransition(QQuickStackTransition::replaceExit(operation, exit, this), QQuickStackTransition::replaceEnter(operation, enter, this), operation == Immediate); +#endif d->setCurrentItem(enter); } @@ -894,6 +912,9 @@ bool QQuickStackView::isEmpty() const */ void QQuickStackView::clear(Operation operation) { +#if !QT_CONFIG(quick_viewtransitions) + Q_UNUSED(operation) +#endif Q_D(QQuickStackView); if (d->elements.isEmpty()) return; @@ -906,6 +927,7 @@ void QQuickStackView::clear(Operation operation) QScopedValueRollback<bool> modifyingElements(d->modifyingElements, true); QScopedValueRollback<QString> operationNameRollback(d->operation, operationName); +#if QT_CONFIG(quick_viewtransitions) if (operation != Immediate) { QQuickStackElement *exit = d->elements.pop(); exit->removal = true; @@ -913,6 +935,7 @@ void QQuickStackView::clear(Operation operation) d->startTransition(QQuickStackTransition::popExit(operation, exit, this), QQuickStackTransition::popEnter(operation, nullptr, this), false); } +#endif int oldDepth = d->elements.size(); d->setCurrentItem(nullptr); @@ -945,6 +968,7 @@ void QQuickStackView::setInitialItem(const QJSValue &item) d->initialItem = item; } +#if QT_CONFIG(quick_viewtransitions) /*! \qmlproperty Transition QtQuick.Controls::StackView::popEnter @@ -1106,6 +1130,7 @@ void QQuickStackView::setReplaceExit(QQuickTransition *exit) d->transitioner->moveDisplacedTransition = exit; emit replaceExitChanged(); } +#endif void QQuickStackView::componentComplete() { diff --git a/src/quicktemplates/qquickstackview_p.cpp b/src/quicktemplates/qquickstackview_p.cpp index 99127d84b6..e6fd77f9fa 100644 --- a/src/quicktemplates/qquickstackview_p.cpp +++ b/src/quicktemplates/qquickstackview_p.cpp @@ -3,7 +3,9 @@ #include "qquickstackview_p_p.h" #include "qquickstackelement_p_p.h" +#if QT_CONFIG(quick_viewtransitions) #include "qquickstacktransition_p_p.h" +#endif #include <QtQml/qqmlinfo.h> #include <QtQml/qqmllist.h> @@ -204,6 +206,7 @@ bool QQuickStackViewPrivate::replaceElements(QQuickStackElement *target, const Q return pushElements(elems); } +#if QT_CONFIG(quick_viewtransitions) void QQuickStackViewPrivate::ensureTransitioner() { if (!transitioner) { @@ -301,6 +304,7 @@ void QQuickStackViewPrivate::viewItemTransitionFinished(QQuickItemViewTransition removing.remove(element); } +#endif void QQuickStackViewPrivate::setBusy(bool b) { diff --git a/src/quicktemplates/qquickstackview_p.h b/src/quicktemplates/qquickstackview_p.h index b36976a395..ce53f3f13b 100644 --- a/src/quicktemplates/qquickstackview_p.h +++ b/src/quicktemplates/qquickstackview_p.h @@ -33,12 +33,14 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickStackView : public QQuickControl Q_PROPERTY(int depth READ depth NOTIFY depthChanged FINAL) Q_PROPERTY(QQuickItem *currentItem READ currentItem NOTIFY currentItemChanged FINAL) Q_PROPERTY(QJSValue initialItem READ initialItem WRITE setInitialItem FINAL) +#if QT_CONFIG(quick_viewtransitions) Q_PROPERTY(QQuickTransition *popEnter READ popEnter WRITE setPopEnter NOTIFY popEnterChanged FINAL) Q_PROPERTY(QQuickTransition *popExit READ popExit WRITE setPopExit NOTIFY popExitChanged FINAL) Q_PROPERTY(QQuickTransition *pushEnter READ pushEnter WRITE setPushEnter NOTIFY pushEnterChanged FINAL) Q_PROPERTY(QQuickTransition *pushExit READ pushExit WRITE setPushExit NOTIFY pushExitChanged FINAL) Q_PROPERTY(QQuickTransition *replaceEnter READ replaceEnter WRITE setReplaceEnter NOTIFY replaceEnterChanged FINAL) Q_PROPERTY(QQuickTransition *replaceExit READ replaceExit WRITE setReplaceExit NOTIFY replaceExitChanged FINAL) +#endif // 2.3 (Qt 5.10) Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged FINAL REVISION(2, 3)) QML_NAMED_ELEMENT(StackView) @@ -66,6 +68,7 @@ public: QJSValue initialItem() const; void setInitialItem(const QJSValue &item); +#if QT_CONFIG(quick_viewtransitions) QQuickTransition *popEnter() const; void setPopEnter(QQuickTransition *enter); @@ -83,6 +86,7 @@ public: QQuickTransition *replaceExit() const; void setReplaceExit(QQuickTransition *exit); +#endif enum LoadBehavior { DontLoad, @@ -116,12 +120,14 @@ Q_SIGNALS: void busyChanged(); void depthChanged(); void currentItemChanged(); +#if QT_CONFIG(quick_viewtransitions) void popEnterChanged(); void popExitChanged(); void pushEnterChanged(); void pushExitChanged(); void replaceEnterChanged(); void replaceExitChanged(); +#endif // 2.3 (Qt 5.10) Q_REVISION(2, 3) void emptyChanged(); diff --git a/src/quicktemplates/qquickstackview_p_p.h b/src/quicktemplates/qquickstackview_p_p.h index 2b86458edc..97f26c64e4 100644 --- a/src/quicktemplates/qquickstackview_p_p.h +++ b/src/quicktemplates/qquickstackview_p_p.h @@ -17,7 +17,9 @@ #include <QtQuickTemplates2/private/qquickstackview_p.h> #include <QtQuickTemplates2/private/qquickcontrol_p_p.h> +#if QT_CONFIG(quick_viewtransitions) #include <QtQuick/private/qquickitemviewtransition_p.h> +#endif #include <QtQuick/private/qquickitemchangelistener_p.h> #include <QtQml/private/qv4value_p.h> #include <QtQml/private/qqmlcontextdata_p.h> @@ -29,7 +31,10 @@ QT_BEGIN_NAMESPACE class QQuickStackElement; struct QQuickStackTransition; -class QQuickStackViewPrivate : public QQuickControlPrivate, public QQuickItemViewTransitionChangeListener +class QQuickStackViewPrivate : public QQuickControlPrivate +#if QT_CONFIG(quick_viewtransitions) + , public QQuickItemViewTransitionChangeListener +#endif { Q_DECLARE_PUBLIC(QQuickStackView) @@ -53,11 +58,13 @@ public: bool popElements(QQuickStackElement *element); bool replaceElements(QQuickStackElement *element, const QList<QQuickStackElement *> &elements); +#if QT_CONFIG(quick_viewtransitions) void ensureTransitioner(); void startTransition(const QQuickStackTransition &first, const QQuickStackTransition &second, bool immediate); void completeTransition(QQuickStackElement *element, QQuickTransition *transition, QQuickStackView::Status status); void viewItemTransitionFinished(QQuickItemViewTransitionableItem *item) override; +#endif void setBusy(bool busy); void depthChange(int newDepth, int oldDepth); @@ -69,10 +76,15 @@ public: QSet<QQuickStackElement*> removing; QList<QQuickStackElement*> removed; QStack<QQuickStackElement *> elements; +#if QT_CONFIG(quick_viewtransitions) QQuickItemViewTransitioner *transitioner = nullptr; +#endif }; -class QQuickStackViewAttachedPrivate : public QObjectPrivate, public QQuickItemChangeListener +class QQuickStackViewAttachedPrivate : public QObjectPrivate +//#if QT_CONFIG(quick_viewtransitions) + , public QQuickItemChangeListener +//#endif { Q_DECLARE_PUBLIC(QQuickStackViewAttached) @@ -82,7 +94,9 @@ public: return attached->d_func(); } +//#if QT_CONFIG(quick_viewtransitions) void itemParentChanged(QQuickItem *item, QQuickItem *parent) override; +//#endif bool explicitVisible = false; QQuickStackElement *element = nullptr; |