diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-11-25 14:49:07 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-01-15 14:09:19 +0100 |
commit | 5a4ffa0de0ecc666a514ef60f0149a76d25b040d (patch) | |
tree | 5f9671c1c85b52bfdd051598e2c524ead98b0160 /src/quick/util | |
parent | d9a02d5c834b57f0da781c7dcf8d74e3b4ce1314 (diff) |
QQmlListProperty: Add replace and removeLast functions
This allows us to implement QmlListWrapper::virtualPut(). Also, the
additional functions make the list properties useful in other contexts.
Fixes: QTBUG-79263
Change-Id: I528bc69222ca7743f0fc3697c3aed2a3468b4d87
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/quick/util')
-rw-r--r-- | src/quick/util/qquickanimation.cpp | 61 | ||||
-rw-r--r-- | src/quick/util/qquickanimation_p.h | 2 | ||||
-rw-r--r-- | src/quick/util/qquickanimation_p_p.h | 5 |
3 files changed, 56 insertions, 12 deletions
diff --git a/src/quick/util/qquickanimation.cpp b/src/quick/util/qquickanimation.cpp index 5e9722e6b4..d6d6f1d8d4 100644 --- a/src/quick/util/qquickanimation.cpp +++ b/src/quick/util/qquickanimation.cpp @@ -490,7 +490,7 @@ QQuickAnimationGroup *QQuickAbstractAnimation::group() const return d->group; } -void QQuickAbstractAnimation::setGroup(QQuickAnimationGroup *g) +void QQuickAbstractAnimation::setGroup(QQuickAnimationGroup *g, int index) { Q_D(QQuickAbstractAnimation); if (d->group == g) @@ -500,8 +500,12 @@ void QQuickAbstractAnimation::setGroup(QQuickAnimationGroup *g) d->group = g; - if (d->group && !d->group->d_func()->animations.contains(this)) - d->group->d_func()->animations.append(this); + if (d->group && !d->group->d_func()->animations.contains(this)) { + if (index >= 0) + d->group->d_func()->animations.insert(index, this); + else + d->group->d_func()->animations.append(this); + } } /*! @@ -1170,7 +1174,7 @@ void QQuickPropertyAction::setProperties(const QString &p) QQmlListProperty<QObject> QQuickPropertyAction::targets() { Q_D(QQuickPropertyAction); - return QQmlListProperty<QObject>(this, d->targets); + return QQmlListProperty<QObject>(this, &(d->targets)); } /*! @@ -1182,7 +1186,7 @@ QQmlListProperty<QObject> QQuickPropertyAction::targets() QQmlListProperty<QObject> QQuickPropertyAction::exclude() { Q_D(QQuickPropertyAction); - return QQmlListProperty<QObject>(this, d->exclude); + return QQmlListProperty<QObject>(this, &(d->exclude)); } /*! @@ -1722,6 +1726,20 @@ void QQuickAnimationGroupPrivate::append_animation(QQmlListProperty<QQuickAbstra a->setGroup(q); } +QQuickAbstractAnimation *QQuickAnimationGroupPrivate::at_animation(QQmlListProperty<QQuickAbstractAnimation> *list, int index) +{ + if (auto q = qmlobject_cast<QQuickAnimationGroup *>(list->object)) + return q->d_func()->animations.at(index); + return nullptr; +} + +int QQuickAnimationGroupPrivate::count_animation(QQmlListProperty<QQuickAbstractAnimation> *list) +{ + if (auto q = qmlobject_cast<QQuickAnimationGroup *>(list->object)) + return q->d_func()->animations.count(); + return 0; +} + void QQuickAnimationGroupPrivate::clear_animation(QQmlListProperty<QQuickAbstractAnimation> *list) { QQuickAnimationGroup *q = qobject_cast<QQuickAnimationGroup *>(list->object); @@ -1733,6 +1751,23 @@ void QQuickAnimationGroupPrivate::clear_animation(QQmlListProperty<QQuickAbstrac } } +void QQuickAnimationGroupPrivate::replace_animation(QQmlListProperty<QQuickAbstractAnimation> *list, + int i, QQuickAbstractAnimation *a) +{ + if (auto *q = qmlobject_cast<QQuickAnimationGroup *>(list->object)) { + if (QQuickAbstractAnimation *anim = q->d_func()->animations.at(i)) + anim->setGroup(nullptr); + if (a) + a->setGroup(q, i); + } +} + +void QQuickAnimationGroupPrivate::removeLast_animation(QQmlListProperty<QQuickAbstractAnimation> *list) +{ + if (auto *q = qobject_cast<QQuickAnimationGroup *>(list->object)) + q->d_func()->animations.last()->setGroup(nullptr); +} + QQuickAnimationGroup::~QQuickAnimationGroup() { Q_D(QQuickAnimationGroup); @@ -1744,10 +1779,14 @@ QQuickAnimationGroup::~QQuickAnimationGroup() QQmlListProperty<QQuickAbstractAnimation> QQuickAnimationGroup::animations() { Q_D(QQuickAnimationGroup); - QQmlListProperty<QQuickAbstractAnimation> list(this, d->animations); - list.append = &QQuickAnimationGroupPrivate::append_animation; - list.clear = &QQuickAnimationGroupPrivate::clear_animation; - return list; + return QQmlListProperty<QQuickAbstractAnimation>( + this, &(d->animations), + &QQuickAnimationGroupPrivate::append_animation, + &QQuickAnimationGroupPrivate::count_animation, + &QQuickAnimationGroupPrivate::at_animation, + &QQuickAnimationGroupPrivate::clear_animation, + &QQuickAnimationGroupPrivate::replace_animation, + &QQuickAnimationGroupPrivate::removeLast_animation); } /*! @@ -2533,7 +2572,7 @@ void QQuickPropertyAnimation::setProperties(const QString &prop) QQmlListProperty<QObject> QQuickPropertyAnimation::targets() { Q_D(QQuickPropertyAnimation); - return QQmlListProperty<QObject>(this, d->targets); + return QQmlListProperty<QObject>(this, &(d->targets)); } /*! @@ -2544,7 +2583,7 @@ QQmlListProperty<QObject> QQuickPropertyAnimation::targets() QQmlListProperty<QObject> QQuickPropertyAnimation::exclude() { Q_D(QQuickPropertyAnimation); - return QQmlListProperty<QObject>(this, d->exclude); + return QQmlListProperty<QObject>(this, &(d->exclude)); } void QQuickAnimationPropertyUpdater::setValue(qreal v) diff --git a/src/quick/util/qquickanimation_p.h b/src/quick/util/qquickanimation_p.h index 45f1635c91..7bad9d50c4 100644 --- a/src/quick/util/qquickanimation_p.h +++ b/src/quick/util/qquickanimation_p.h @@ -111,7 +111,7 @@ public: void setCurrentTime(int); QQuickAnimationGroup *group() const; - void setGroup(QQuickAnimationGroup *); + void setGroup(QQuickAnimationGroup *, int index = -1); void setDefaultTarget(const QQmlProperty &); void setDisableUserControl(); diff --git a/src/quick/util/qquickanimation_p_p.h b/src/quick/util/qquickanimation_p_p.h index c20ec65c24..8d23242b68 100644 --- a/src/quick/util/qquickanimation_p_p.h +++ b/src/quick/util/qquickanimation_p_p.h @@ -256,7 +256,12 @@ public: : QQuickAbstractAnimationPrivate() {} static void append_animation(QQmlListProperty<QQuickAbstractAnimation> *list, QQuickAbstractAnimation *role); + static QQuickAbstractAnimation *at_animation(QQmlListProperty<QQuickAbstractAnimation> *list, int index); + static int count_animation(QQmlListProperty<QQuickAbstractAnimation> *list); static void clear_animation(QQmlListProperty<QQuickAbstractAnimation> *list); + static void replace_animation(QQmlListProperty<QQuickAbstractAnimation> *list, int index, + QQuickAbstractAnimation *role); + static void removeLast_animation(QQmlListProperty<QQuickAbstractAnimation> *list); QList<QQuickAbstractAnimation *> animations; }; |