49void QQuickItemViewTransitionJob::
startTransition(QQuickItemViewTransitionableItem *item,
int index, QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type,
const QPointF &to,
bool isTargetItem)
51 if (type == QQuickItemViewTransitioner::NoTransition)
54 qWarning(
"startTransition(): invalid item");
58 qWarning(
"startTransition(): invalid transitioner");
62 QQuickTransition *trans = transitioner->transitionObject(type, isTargetItem);
64 qWarning(
"QQuickItemView: invalid view transition!");
69 m_transitioner = transitioner;
77 attached->m_index = index;
78 attached->m_item = item->item;
79 attached->m_destination = to;
80 attached->m_targetIndexes = m_transitioner->targetIndexes(type);
81 attached->m_targetItems = m_transitioner->targetItems(type);
82 emit attached->indexChanged();
83 emit attached->itemChanged();
84 emit attached->destinationChanged();
85 emit attached->targetIndexesChanged();
86 emit attached->targetItemsChanged();
89 QQuickStateOperation::ActionList actions;
90 actions << QQuickStateAction(item->item, QLatin1String(
"x"), QVariant(to.x()));
91 actions << QQuickStateAction(item->item, QLatin1String(
"y"), QVariant(to.y()));
93 actions[0].fromValue = item->itemX();
94 actions[1].fromValue = item->itemY();
95 m_transitioner->runningJobs <<
this;
96 QQuickTransitionManager::transition(actions, trans, item->item);
116QQuickItemViewTransitioner::QQuickItemViewTransitioner()
117 : populateTransition(
nullptr)
118 , addTransition(
nullptr), addDisplacedTransition(
nullptr)
119 , moveTransition(
nullptr), moveDisplacedTransition(
nullptr)
120 , removeTransition(
nullptr), removeDisplacedTransition(
nullptr)
121 , displacedTransition(
nullptr)
122 , changeListener(
nullptr)
123 , usePopulateTransition(
false)
135bool QQuickItemViewTransitioner::canTransition(QQuickItemViewTransitioner::TransitionType type,
bool asTarget)
const
138 && type != NoTransition && type != PopulateTransition
139 && displacedTransition && displacedTransition->enabled()) {
146 case PopulateTransition:
147 return usePopulateTransition
148 && populateTransition && populateTransition->enabled();
151 return addTransition && addTransition->enabled();
153 return addDisplacedTransition && addDisplacedTransition->enabled();
156 return moveTransition && moveTransition->enabled();
158 return moveDisplacedTransition && moveDisplacedTransition->enabled();
159 case RemoveTransition:
161 return removeTransition && removeTransition->enabled();
163 return removeDisplacedTransition && removeDisplacedTransition->enabled();
173void QQuickItemViewTransitioner::addToTargetLists(QQuickItemViewTransitioner::TransitionType type, QQuickItemViewTransitionableItem *item,
int index)
178 case PopulateTransition:
180 addTransitionIndexes << index;
181 addTransitionTargets << item->item;
184 moveTransitionIndexes << index;
185 moveTransitionTargets << item->item;
187 case RemoveTransition:
188 removeTransitionIndexes << index;
189 removeTransitionTargets << item->item;
194void QQuickItemViewTransitioner::resetTargetLists()
196 addTransitionIndexes.clear();
197 addTransitionTargets.clear();
199 removeTransitionIndexes.clear();
200 removeTransitionTargets.clear();
202 moveTransitionIndexes.clear();
203 moveTransitionTargets.clear();
206QQuickTransition *QQuickItemViewTransitioner::transitionObject(QQuickItemViewTransitioner::TransitionType type,
bool asTarget)
const
208 if (type == QQuickItemViewTransitioner::NoTransition)
211 if (type == PopulateTransition)
214 QQuickTransition *trans =
nullptr;
218 case PopulateTransition:
219 trans = populateTransition;
222 trans = asTarget ? addTransition : addDisplacedTransition;
225 trans = asTarget ? moveTransition : moveDisplacedTransition;
227 case RemoveTransition:
228 trans = asTarget ? removeTransition : removeDisplacedTransition;
232 if (!asTarget && (!trans || !trans->enabled()))
233 trans = displacedTransition;
234 if (trans && trans->enabled())
326void QQuickItemViewTransitionableItem::moveTo(
const QPointF &pos,
bool immediate)
328 if (!nextTransitionFromSet && nextTransitionType != QQuickItemViewTransitioner::NoTransition) {
329 nextTransitionFrom = item->position();
330 nextTransitionFromSet =
true;
334 lastMovedToSet =
true;
336 if (immediate || !transitionScheduledOrRunning()) {
339 item->setPosition(pos);
341 nextTransitionTo = pos;
342 nextTransitionToSet =
true;
366bool QQuickItemViewTransitionableItem::prepareTransition(QQuickItemViewTransitioner *transitioner,
int index,
const QRectF &viewBounds)
368 if (nextTransitionType == QQuickItemViewTransitioner::NoTransition)
371 if (isTransitionTarget) {
375 if (!nextTransitionToSet)
376 moveTo(item->position());
379 if (!nextTransitionToSet || (nextTransitionFromSet && nextTransitionFrom == nextTransitionTo)) {
380 clearCurrentScheduledTransition();
385 bool doTransition =
false;
389 switch (nextTransitionType) {
390 case QQuickItemViewTransitioner::NoTransition:
394 case QQuickItemViewTransitioner::PopulateTransition:
396 doTransition = viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height()));
399 case QQuickItemViewTransitioner::AddTransition:
400 case QQuickItemViewTransitioner::RemoveTransition:
401 if (viewBounds.isNull()) {
402 if (isTransitionTarget)
405 doTransition = transitionWillChangePosition();
406 }
else if (isTransitionTarget) {
409 doTransition = (nextTransitionType == QQuickItemViewTransitioner::AddTransition)
410 ? viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height()))
411 : viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height()));
414 if (viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height()))
415 || viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height()))) {
416 doTransition = transitionWillChangePosition();
420 case QQuickItemViewTransitioner::MoveTransition:
422 if (transitionWillChangePosition()) {
423 doTransition = viewBounds.isNull()
424 || viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height()))
425 || viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height()));
433 if (isTransitionTarget)
434 transitioner->addToTargetLists(nextTransitionType,
this, index);
435 doTransition = transitioner->canTransition(nextTransitionType, isTransitionTarget);
441 item->setPosition(nextTransitionTo);
442 ACTION_IF_DELETED(
this, stopTransition(),
return false);
449void QQuickItemViewTransitionableItem::startTransition(QQuickItemViewTransitioner *transitioner,
int index)
451 if (nextTransitionType == QQuickItemViewTransitioner::NoTransition)
455 qWarning(
"QQuickViewItem::prepareTransition() not called!");
459 if (!transition || transition->m_type != nextTransitionType || transition->m_isTarget != isTransitionTarget) {
461 RETURN_IF_DELETED(transition->cancel());
463 transition =
new QQuickItemViewTransitionJob;
466 RETURN_IF_DELETED(transition->startTransition(
this, index, transitioner, nextTransitionType, nextTransitionTo, isTransitionTarget));
467 clearCurrentScheduledTransition();
470void QQuickItemViewTransitionableItem::completeTransition(QQuickTransition *quickTransition)
472 if (nextTransitionType == QQuickItemViewTransitioner::NoTransition)
476 qWarning(
"QQuickViewItem::prepareTransition() not called!");
481 qWarning(
"No target for transition!");
485 if (!transition || transition->m_type != nextTransitionType || transition->m_isTarget != isTransitionTarget) {
487 RETURN_IF_DELETED(transition->cancel());
489 transition =
new QQuickItemViewTransitionJob;
492 QQuickStateOperation::ActionList actions;
493 QList<QQmlProperty> after;
494 QScopedPointer<QQuickTransitionInstance> instance(
495 quickTransition->prepare(actions, after, transition, item));
496 RETURN_IF_DELETED(instance->complete());
498 clearCurrentScheduledTransition();
void startTransition(QQuickItemViewTransitionableItem *item, int index, QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, const QPointF &to, bool isTargetItem)