Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickitemviewtransition.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <QtQuick/qquickitem.h>
6#include <QtQuick/private/qquicktransition_p.h>
7#include <QtQuick/private/qquicktransitionmanager_p_p.h>
8
10
11static QList<int> qquickitemviewtransition_emptyIndexes = QList<int>();
12static QList<QObject *> qquickitemviewtransition_emptyTargets = QList<QObject *>();
13
14
32
33
35 : m_transitioner(nullptr)
36 , m_item(nullptr)
37 , m_type(QQuickItemViewTransitioner::NoTransition)
38 , m_isTarget(false)
39{
40}
41
47
49{
51 return;
52 if (!item) {
53 qWarning("startTransition(): invalid item");
54 return;
55 }
56 if (!transitioner) {
57 qWarning("startTransition(): invalid transitioner");
58 return;
59 }
60
61 QQuickTransition *trans = transitioner->transitionObject(type, isTargetItem);
62 if (!trans) {
63 qWarning("QQuickItemView: invalid view transition!");
64 return;
65 }
66
67 m_item = item;
68 m_transitioner = transitioner;
69 m_toPos = to;
70 m_type = type;
71 m_isTarget = isTargetItem;
72
74 static_cast<QQuickViewTransitionAttached*>(qmlAttachedPropertiesObject<QQuickViewTransitionAttached>(trans));
75 if (attached) {
76 attached->m_index = index;
77 attached->m_item = item->item;
78 attached->m_destination = to;
79 attached->m_targetIndexes = m_transitioner->targetIndexes(type);
80 attached->m_targetItems = m_transitioner->targetItems(type);
81 emit attached->indexChanged();
82 emit attached->itemChanged();
83 emit attached->destinationChanged();
84 emit attached->targetIndexesChanged();
85 emit attached->targetItemsChanged();
86 }
87
89 actions << QQuickStateAction(item->item, QLatin1String("x"), QVariant(to.x()));
90 actions << QQuickStateAction(item->item, QLatin1String("y"), QVariant(to.y()));
91
92 actions[0].fromValue = item->itemX();
93 actions[1].fromValue = item->itemY();
95 QQuickTransitionManager::transition(actions, trans, item->item);
96}
97
99{
101
102 if (m_transitioner) {
103 RETURN_IF_DELETED(m_transitioner->finishedTransition(this, m_item));
104 m_transitioner = nullptr;
105 }
106
107 m_item = nullptr;
108 m_toPos.setX(0);
109 m_toPos.setY(0);
111 m_isTarget = false;
112}
113
114
116 : populateTransition(nullptr)
117 , addTransition(nullptr), addDisplacedTransition(nullptr)
118 , moveTransition(nullptr), moveDisplacedTransition(nullptr)
119 , removeTransition(nullptr), removeDisplacedTransition(nullptr)
120 , displacedTransition(nullptr)
121 , changeListener(nullptr)
122 , usePopulateTransition(false)
123{
124}
125
127{
129
130 for (JobIt it = runningJobs.begin(), end = runningJobs.end(); it != end; ++it)
131 (*it)->m_transitioner = nullptr;
132}
133
135{
136 if (!asTarget
139 return true;
140 }
141
142 switch (type) {
143 case NoTransition:
144 break;
146 return usePopulateTransition
148 case AddTransition:
149 if (asTarget)
151 else
153 case MoveTransition:
154 if (asTarget)
156 else
158 case RemoveTransition:
159 if (asTarget)
161 else
163 }
164 return false;
165}
166
171
192
204
206{
208 return nullptr;
209
211 asTarget = true; // no separate displaced transition
212
213 QQuickTransition *trans = nullptr;
214 switch (type) {
215 case NoTransition:
216 break;
218 trans = populateTransition;
219 break;
220 case AddTransition:
221 trans = asTarget ? addTransition : addDisplacedTransition;
222 break;
223 case MoveTransition:
224 trans = asTarget ? moveTransition : moveDisplacedTransition;
225 break;
226 case RemoveTransition:
227 trans = asTarget ? removeTransition : removeDisplacedTransition;
228 break;
229 }
230
231 if (!asTarget && (!trans || !trans->enabled()))
232 trans = displacedTransition;
233 if (trans && trans->enabled())
234 return trans;
235 return nullptr;
236}
237
239{
240 switch (type) {
241 case NoTransition:
242 break;
244 case AddTransition:
246 case MoveTransition:
248 case RemoveTransition:
250 }
251
253}
254
256{
257 switch (type) {
258 case NoTransition:
259 break;
261 case AddTransition:
263 case MoveTransition:
265 case RemoveTransition:
267 }
268
270}
271
272void QQuickItemViewTransitioner::finishedTransition(QQuickItemViewTransitionJob *job, QQuickItemViewTransitionableItem *item)
273{
274 if (!runningJobs.contains(job))
275 return;
276 runningJobs.remove(job);
277 if (item) {
278 item->finishedTransition();
279 if (changeListener)
280 changeListener->viewItemTransitionFinished(item);
281 }
282}
283
284
286 : item(i)
287 , transition(nullptr)
288 , nextTransitionType(QQuickItemViewTransitioner::NoTransition)
289 , isTransitionTarget(false)
290 , nextTransitionToSet(false)
291 , nextTransitionFromSet(false)
292 , lastMovedToSet(false)
293 , prepared(false)
294{
295}
296
301
311
313{
314 // If item is transitioning to some pos, return that dest pos.
315 // If item was redirected to some new pos before the current transition finished,
316 // return that new pos.
319 else if (transition && transition->isRunning())
320 return transition->m_toPos.y();
321 else
322 return item->y();
323}
324
326{
330 }
331
333 lastMovedToSet = true;
334
335 if (immediate || !transitionScheduledOrRunning()) {
336 if (immediate)
337 stopTransition();
339 } else {
341 nextTransitionToSet = true;
342 }
343}
344
350
355
364
366{
368 return false;
369
370 if (isTransitionTarget) {
371 // If item is not already moving somewhere, set it to not move anywhere.
372 // This ensures that removed targets don't transition to the default (0,0) and that
373 // items set for other transition types only transition if they actually move somewhere.
375 moveTo(item->position());
376 } else {
377 // don't start displaced transitions that don't move anywhere
379 clearCurrentScheduledTransition();
380 return false;
381 }
382 }
383
384 bool doTransition = false;
385
386 // For move transitions (both target and displaced) and displaced transitions of other
387 // types, only run the transition if the item is actually moving to another position.
388 switch (nextTransitionType) {
390 {
391 return false;
392 }
394 {
395 doTransition = viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height()));
396 break;
397 }
400 if (viewBounds.isNull()) {
402 doTransition = true;
403 else
404 doTransition = transitionWillChangePosition();
405 } else if (isTransitionTarget) {
406 // For Add targets, do transition if item is moving into visible area
407 // For Remove targets, do transition if item is currently in visible area
410 : viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height()));
411 } else {
412 // do transition if moving from or into visible area
413 if (viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height()))
414 || viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height()))) {
415 doTransition = transitionWillChangePosition();
416 }
417 }
418 break;
420 // do transition if moving from or into visible area
421 if (transitionWillChangePosition()) {
422 doTransition = viewBounds.isNull()
423 || viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height()))
425 }
426 break;
427 }
428
429 if (doTransition) {
430 // add item to target lists even if canTransition() is false for a target transition,
431 // since the target lists still need to be filled for displaced transitions
433 transitioner->addToTargetLists(nextTransitionType, this, index);
434 doTransition = transitioner->canTransition(nextTransitionType, isTransitionTarget);
435 }
436
437 if (!doTransition) {
438 // if transition type is not valid, the previous transition still has to be
439 // canceled so that the item can move immediately to the right position
441 ACTION_IF_DELETED(this, stopTransition(), return false);
442 }
443
444 prepared = true;
445 return doTransition;
446}
447
449{
451 return;
452
453 if (!prepared) {
454 qWarning("QQuickViewItem::prepareTransition() not called!");
455 return;
456 }
457
459 if (transition)
461 delete transition;
463 }
464
466 clearCurrentScheduledTransition();
467}
468
470{
472 return;
473
474 if (!prepared) {
475 qWarning("QQuickViewItem::prepareTransition() not called!");
476 return;
477 }
478
479 if (!item) {
480 qWarning("No target for transition!");
481 return;
482 }
483
485 if (transition)
487 delete transition;
489 }
490
491 QQuickStateOperation::ActionList actions; // not used
492 QList<QQmlProperty> after; // not used
493 QScopedPointer<QQuickTransitionInstance> instance(
494 quickTransition->prepare(actions, after, transition, item));
495 RETURN_IF_DELETED(instance->complete());
496
497 clearCurrentScheduledTransition();
498}
499
500void QQuickItemViewTransitionableItem::setNextTransition(QQuickItemViewTransitioner::TransitionType type, bool isTargetItem)
501{
502 // Don't reset nextTransitionToSet - once it is set, it cannot be changed
503 // until the animation finishes since the itemX() and itemY() may be used
504 // to calculate positions for transitions for other items in the view.
506 isTransitionTarget = isTargetItem;
507
511 }
512}
513
514bool QQuickItemViewTransitionableItem::transitionWillChangePosition() const
515{
517 return true;
519 return false;
521}
522
523void QQuickItemViewTransitionableItem::resetNextTransitionPos()
524{
525 nextTransitionToSet = false;
527}
528
529void QQuickItemViewTransitionableItem::finishedTransition()
530{
531 resetNextTransitionPos();
532}
533
534void QQuickItemViewTransitionableItem::clearCurrentScheduledTransition()
535{
536 // Just clear the current scheduled transition - don't touch the nextTransitionTo
537 // which may have already been set for a previously scheduled transition
538
540 isTransitionTarget = false;
541 prepared = false;
542 nextTransitionFromSet = false;
543}
544
545void QQuickItemViewTransitionableItem::stopTransition()
546{
547 if (transition)
549 delete transition;
550 transition = nullptr;
551 clearCurrentScheduledTransition();
552 resetNextTransitionPos();
553}
554
555
925QQmlListProperty<QObject> QQuickViewTransitionAttached::targetItems()
926{
927 return QQmlListProperty<QObject>(this, &m_targetItems);
928}
929
934
936
937#include "moc_qquickitemviewtransition_p.cpp"
void clear()
Definition qlist.h:434
\inmodule QtCore
Definition qobject.h:103
\inmodule QtCore\reentrant
Definition qpoint.h:217
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
Definition qpoint.h:343
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
Definition qpoint.h:348
constexpr void setY(qreal y) noexcept
Sets the y coordinate of this point to the given finite y coordinate.
Definition qpoint.h:358
constexpr void setX(qreal x) noexcept
Sets the x coordinate of this point to the given finite x coordinate.
Definition qpoint.h:353
virtual void viewItemTransitionFinished(QQuickItemViewTransitionableItem *item)=0
QQuickItemViewTransitioner * m_transitioner
QQuickItemViewTransitioner::TransitionType m_type
QQuickItemViewTransitionableItem * m_item
void startTransition(QQuickItemViewTransitionableItem *item, int index, QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, const QPointF &to, bool isTargetItem)
bool prepareTransition(QQuickItemViewTransitioner *transitioner, int index, const QRectF &viewBounds)
QQuickItemViewTransitionJob * transition
QQuickItemViewTransitioner::TransitionType nextTransitionType
void moveTo(const QPointF &pos, bool immediate=false)
void startTransition(QQuickItemViewTransitioner *transitioner, int index)
void completeTransition(QQuickTransition *quickTransition)
const QList< int > & targetIndexes(QQuickItemViewTransitioner::TransitionType type) const
QSet< QQuickItemViewTransitionJob * > runningJobs
QQuickTransition * transitionObject(QQuickItemViewTransitioner::TransitionType type, bool asTarget) const
const QList< QObject * > & targetItems(QQuickItemViewTransitioner::TransitionType type) const
QQmlGuard< QQuickTransition > displacedTransition
QQmlGuard< QQuickTransition > addTransition
void addToTargetLists(QQuickItemViewTransitioner::TransitionType type, QQuickItemViewTransitionableItem *item, int index)
QQmlGuard< QQuickTransition > removeTransition
bool canTransition(QQuickItemViewTransitioner::TransitionType type, bool asTarget) const
QQmlGuard< QQuickTransition > removeDisplacedTransition
QQmlGuard< QQuickTransition > moveTransition
QQmlGuard< QQuickTransition > addDisplacedTransition
QQmlGuard< QQuickTransition > moveDisplacedTransition
QQmlGuard< QQuickTransition > populateTransition
void transitionNextReposition(QQuickItemViewTransitionableItem *item, QQuickItemViewTransitioner::TransitionType type, bool isTarget)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
qreal x
\qmlproperty real QtQuick::Item::x \qmlproperty real QtQuick::Item::y \qmlproperty real QtQuick::Item...
Definition qquickitem.h:72
qreal y
Defines the item's y position relative to its parent.
Definition qquickitem.h:73
qreal width
This property holds the width of this item.
Definition qquickitem.h:75
QPointF position() const
qreal height
This property holds the height of this item.
Definition qquickitem.h:76
void setPosition(const QPointF &)
void transition(const QList< QQuickStateAction > &, QQuickTransition *transition, QObject *defaultTarget=nullptr)
QQmlListProperty< QObject > targetItems
\qmltype ViewTransition \instantiates QQuickViewTransitionAttached \inqmlmodule QtQuick
static QQuickViewTransitionAttached * qmlAttachedProperties(QObject *)
\inmodule QtCore\reentrant
Definition qrect.h:484
bool intersects(const QRectF &r) const noexcept
Returns true if this rectangle intersects with the given rectangle (i.e.
Definition qrect.cpp:2271
constexpr bool isNull() const noexcept
Returns true if the rectangle is a null rectangle, otherwise returns false.
Definition qrect.h:658
bool remove(const T &value)
Definition qset.h:63
iterator begin()
Definition qset.h:136
iterator end()
Definition qset.h:140
bool contains(const T &value) const
Definition qset.h:71
\inmodule QtCore
Definition qvariant.h:65
QSet< QString >::iterator it
Combined button and popup list for selecting options.
#define ACTION_IF_DELETED(p, func, action)
#define RETURN_IF_DELETED(func)
#define qWarning
Definition qlogging.h:166
GLuint index
[2]
GLuint GLuint end
GLenum type
GLhandleARB obj
[2]
static QT_BEGIN_NAMESPACE QList< int > qquickitemviewtransition_emptyIndexes
static QList< QObject * > qquickitemviewtransition_emptyTargets
#define emit
double qreal
Definition qtypes.h:187
QObject::connect nullptr
QGraphicsItem * item