diff options
Diffstat (limited to 'src/quick/items/qquickitemview.cpp')
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 115 |
1 files changed, 11 insertions, 104 deletions
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index f2e055e874..8dafc16cf4 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qquickitemview_p_p.h" +#include "qquickitemviewfxitem_p_p.h" #include <QtQuick/private/qquicktransition_p.h> #include <QtQml/QQmlInfo> #include "qplatformdefs.h" @@ -52,117 +53,14 @@ Q_LOGGING_CATEGORY(lcItemViewDelegateLifecycle, "qt.quick.itemview.lifecycle") #endif FxViewItem::FxViewItem(QQuickItem *i, QQuickItemView *v, bool own, QQuickItemViewAttached *attached) - : item(i) + : QQuickItemViewFxItem(i, own, QQuickItemViewPrivate::get(v)) , view(v) - , transitionableItem(nullptr) , attached(attached) - , ownItem(own) - , releaseAfterTransition(false) - , trackGeom(false) { if (attached) // can be null for default components (see createComponentItem) attached->setView(view); } -FxViewItem::~FxViewItem() -{ - delete transitionableItem; - if (ownItem && item) { - trackGeometry(false); - item->setParentItem(nullptr); - item->deleteLater(); - item = nullptr; - } -} - -qreal FxViewItem::itemX() const -{ - return transitionableItem ? transitionableItem->itemX() : (item ? item->x() : 0); -} - -qreal FxViewItem::itemY() const -{ - return transitionableItem ? transitionableItem->itemY() : (item ? item->y() : 0); -} - -void FxViewItem::moveTo(const QPointF &pos, bool immediate) -{ - if (transitionableItem) - transitionableItem->moveTo(pos, immediate); - else if (item) - item->setPosition(pos); -} - -void FxViewItem::setVisible(bool visible) -{ - if (!visible && transitionableItem && transitionableItem->transitionScheduledOrRunning()) - return; - if (item) - QQuickItemPrivate::get(item)->setCulled(!visible); -} - -void FxViewItem::trackGeometry(bool track) -{ - if (track) { - if (!trackGeom) { - if (item) { - QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); - itemPrivate->addItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); - } - trackGeom = true; - } - } else { - if (trackGeom) { - if (item) { - QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); - itemPrivate->removeItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); - } - trackGeom = false; - } - } -} - -QQuickItemViewTransitioner::TransitionType FxViewItem::scheduledTransitionType() const -{ - return transitionableItem ? transitionableItem->nextTransitionType : QQuickItemViewTransitioner::NoTransition; -} - -bool FxViewItem::transitionScheduledOrRunning() const -{ - return transitionableItem ? transitionableItem->transitionScheduledOrRunning() : false; -} - -bool FxViewItem::transitionRunning() const -{ - return transitionableItem ? transitionableItem->transitionRunning() : false; -} - -bool FxViewItem::isPendingRemoval() const -{ - return transitionableItem ? transitionableItem->isPendingRemoval() : false; -} - -void FxViewItem::transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget) -{ - if (!transitioner) - return; - if (!transitionableItem) - transitionableItem = new QQuickItemViewTransitionableItem(item); - transitioner->transitionNextReposition(transitionableItem, type, asTarget); -} - -bool FxViewItem::prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds) -{ - return transitionableItem ? transitionableItem->prepareTransition(transitioner, index, viewBounds) : false; -} - -void FxViewItem::startTransition(QQuickItemViewTransitioner *transitioner) -{ - if (transitionableItem) - transitionableItem->startTransition(transitioner, index); -} - - QQuickItemViewChangeSet::QQuickItemViewChangeSet() : active(false) { @@ -931,6 +829,8 @@ void QQuickItemViewPrivate::positionViewAtIndex(int index, int mode) if (mode < QQuickItemView::Beginning || mode > QQuickItemView::SnapPosition) return; + Q_Q(QQuickItemView); + q->cancelFlick(); applyPendingChanges(); const int modelCount = model->count(); int idx = qMax(qMin(index, modelCount - 1), 0); @@ -1285,6 +1185,7 @@ void QQuickItemView::modelUpdated(const QQmlChangeSet &changeSet, bool reset) { Q_D(QQuickItemView); if (reset) { + cancelFlick(); if (d->transitioner) d->transitioner->setPopulateTransitionEnabled(true); d->moveReason = QQuickItemViewPrivate::SetIndex; @@ -1329,6 +1230,12 @@ void QQuickItemView::trackedPositionChanged() Q_D(QQuickItemView); if (!d->trackedItem || !d->currentItem) return; + + if (d->inLayout) { + polish(); + return; + } + if (d->moveReason == QQuickItemViewPrivate::SetIndex) { qreal trackedPos = d->trackedItem->position(); qreal trackedSize = d->trackedItem->size(); |