diff options
author | Ulf Hermann <[email protected]> | 2019-11-25 16:10:04 +0100 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2020-02-07 09:37:53 +0100 |
commit | 6d0a453f41d304239285d64b06612c36922be701 (patch) | |
tree | 36a77a421948753d9512484f04efc7744941de88 /src/quick | |
parent | 053547fba7e83e894d8af3a63d022daa6a34ce99 (diff) |
Use the extended QQmlListProperty interface in a few places
Task-number: QTBUG-79263
Change-Id: If518f644b5b9eddbacfb1cb16fbb557127ffcfb2
Reviewed-by: Simon Hausmann <[email protected]>
Reviewed-by: Shawn Rutledge <[email protected]>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/items/qquickspriteengine_p.h | 12 | ||||
-rw-r--r-- | src/quick/items/qquickspritesequence.cpp | 4 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 25 | ||||
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 2 | ||||
-rw-r--r-- | src/quick/util/qquickstate.cpp | 10 | ||||
-rw-r--r-- | src/quick/util/qquickstate_p_p.h | 17 | ||||
-rw-r--r-- | src/quick/util/qquickstategroup.cpp | 36 |
7 files changed, 94 insertions, 12 deletions
diff --git a/src/quick/items/qquickspriteengine_p.h b/src/quick/items/qquickspriteengine_p.h index d76055c831..5ad33389de 100644 --- a/src/quick/items/qquickspriteengine_p.h +++ b/src/quick/items/qquickspriteengine_p.h @@ -330,6 +330,18 @@ inline int spriteCount(QQmlListProperty<QQuickSprite> *p) return reinterpret_cast<QList<QQuickSprite *> *>(p->data)->count(); } +inline void spriteReplace(QQmlListProperty<QQuickSprite> *p, int idx, QQuickSprite *s) +{ + reinterpret_cast<QList<QQuickSprite *> *>(p->data)->replace(idx, s); + p->object->metaObject()->invokeMethod(p->object, "createEngine"); +} + +inline void spriteRemoveLast(QQmlListProperty<QQuickSprite> *p) +{ + reinterpret_cast<QList<QQuickSprite *> *>(p->data)->removeLast(); + p->object->metaObject()->invokeMethod(p->object, "createEngine"); +} + QT_END_NAMESPACE #endif // QQUICKSPRITEENGINE_P_H diff --git a/src/quick/items/qquickspritesequence.cpp b/src/quick/items/qquickspritesequence.cpp index eb4b5335e7..c29938a1bb 100644 --- a/src/quick/items/qquickspritesequence.cpp +++ b/src/quick/items/qquickspritesequence.cpp @@ -162,7 +162,9 @@ void QQuickSpriteSequence::setInterpolate(bool arg) QQmlListProperty<QQuickSprite> QQuickSpriteSequence::sprites() { Q_D(QQuickSpriteSequence); - return QQmlListProperty<QQuickSprite>(this, &d->m_sprites, spriteAppend, spriteCount, spriteAt, spriteClear); + return QQmlListProperty<QQuickSprite>(this, &d->m_sprites, + spriteAppend, spriteCount, spriteAt, + spriteClear, spriteReplace, spriteRemoveLast); } bool QQuickSpriteSequence::running() const diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 9ab3f2d8c2..6c63b83511 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -682,10 +682,13 @@ void QQuickWindow::handleApplicationStateChanged(Qt::ApplicationState state) QQmlListProperty<QObject> QQuickWindowPrivate::data() { - return QQmlListProperty<QObject>(q_func(), nullptr, QQuickWindowPrivate::data_append, - QQuickWindowPrivate::data_count, - QQuickWindowPrivate::data_at, - QQuickWindowPrivate::data_clear); + return QQmlListProperty<QObject>(q_func(), nullptr, + QQuickWindowPrivate::data_append, + QQuickWindowPrivate::data_count, + QQuickWindowPrivate::data_at, + QQuickWindowPrivate::data_clear, + QQuickWindowPrivate::data_replace, + QQuickWindowPrivate::data_removeLast); } static QMouseEvent *touchToMouseEvent(QEvent::Type type, const QTouchEvent::TouchPoint &p, QTouchEvent *event, QQuickItem *item, bool transformNeeded = true) @@ -3257,6 +3260,20 @@ void QQuickWindowPrivate::data_clear(QQmlListProperty<QObject> *property) itemProperty.clear(&itemProperty); } +void QQuickWindowPrivate::data_replace(QQmlListProperty<QObject> *property, int i, QObject *o) +{ + QQuickWindow *win = static_cast<QQuickWindow*>(property->object); + QQmlListProperty<QObject> itemProperty = QQuickItemPrivate::get(win->contentItem())->data(); + itemProperty.replace(&itemProperty, i, o); +} + +void QQuickWindowPrivate::data_removeLast(QQmlListProperty<QObject> *property) +{ + QQuickWindow *win = static_cast<QQuickWindow*>(property->object); + QQmlListProperty<QObject> itemProperty = QQuickItemPrivate::get(win->contentItem())->data(); + itemProperty.removeLast(&itemProperty); +} + bool QQuickWindowPrivate::isRenderable() const { Q_Q(const QQuickWindow); diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index 6e6dc7a400..86bdaf6396 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -299,6 +299,8 @@ public: static int data_count(QQmlListProperty<QObject> *); static QObject *data_at(QQmlListProperty<QObject> *, int); static void data_clear(QQmlListProperty<QObject> *); + static void data_replace(QQmlListProperty<QObject> *, int, QObject *); + static void data_removeLast(QQmlListProperty<QObject> *); static void contextCreationFailureMessage(const QSurfaceFormat &format, QString *translatedMessage, diff --git a/src/quick/util/qquickstate.cpp b/src/quick/util/qquickstate.cpp index c106528f45..71ab1f4d62 100644 --- a/src/quick/util/qquickstate.cpp +++ b/src/quick/util/qquickstate.cpp @@ -267,9 +267,13 @@ void QQuickState::setExtends(const QString &extends) QQmlListProperty<QQuickStateOperation> QQuickState::changes() { Q_D(QQuickState); - return QQmlListProperty<QQuickStateOperation>(this, &d->operations, QQuickStatePrivate::operations_append, - QQuickStatePrivate::operations_count, QQuickStatePrivate::operations_at, - QQuickStatePrivate::operations_clear); + return QQmlListProperty<QQuickStateOperation>(this, &d->operations, + QQuickStatePrivate::operations_append, + QQuickStatePrivate::operations_count, + QQuickStatePrivate::operations_at, + QQuickStatePrivate::operations_clear, + QQuickStatePrivate::operations_replace, + QQuickStatePrivate::operations_removeLast); } int QQuickState::operationCount() const diff --git a/src/quick/util/qquickstate_p_p.h b/src/quick/util/qquickstate_p_p.h index 2fa5321165..ae4ed291b5 100644 --- a/src/quick/util/qquickstate_p_p.h +++ b/src/quick/util/qquickstate_p_p.h @@ -244,6 +244,23 @@ public: QList<OperationGuard> *list = static_cast<QList<OperationGuard> *>(prop->data); return list->at(index); } + static void operations_replace(QQmlListProperty<QQuickStateOperation> *prop, int index, + QQuickStateOperation *op) { + QList<OperationGuard> *list = static_cast<QList<OperationGuard> *>(prop->data); + auto &guard = list->at(index); + if (guard.object() == op) { + op->setState(qobject_cast<QQuickState*>(prop->object)); + } else { + list->at(index)->setState(nullptr); + op->setState(qobject_cast<QQuickState*>(prop->object)); + list->replace(index, OperationGuard(op, list)); + } + } + static void operations_removeLast(QQmlListProperty<QQuickStateOperation> *prop) { + QList<OperationGuard> *list = static_cast<QList<OperationGuard> *>(prop->data); + list->last()->setState(nullptr); + list->removeLast(); + } QQuickTransitionManager transitionManager; diff --git a/src/quick/util/qquickstategroup.cpp b/src/quick/util/qquickstategroup.cpp index 46e7d62fc1..2109aafc10 100644 --- a/src/quick/util/qquickstategroup.cpp +++ b/src/quick/util/qquickstategroup.cpp @@ -70,6 +70,8 @@ public: static int count_state(QQmlListProperty<QQuickState> *list); static QQuickState *at_state(QQmlListProperty<QQuickState> *list, int index); static void clear_states(QQmlListProperty<QQuickState> *list); + static void replace_states(QQmlListProperty<QQuickState> *list, int index, QQuickState *state); + static void removeLast_states(QQmlListProperty<QQuickState> *list); static void append_transition(QQmlListProperty<QQuickTransition> *list, QQuickTransition *state); static int count_transitions(QQmlListProperty<QQuickTransition> *list); @@ -163,10 +165,13 @@ QList<QQuickState *> QQuickStateGroup::states() const QQmlListProperty<QQuickState> QQuickStateGroup::statesProperty() { Q_D(QQuickStateGroup); - return QQmlListProperty<QQuickState>(this, &d->states, &QQuickStateGroupPrivate::append_state, - &QQuickStateGroupPrivate::count_state, - &QQuickStateGroupPrivate::at_state, - &QQuickStateGroupPrivate::clear_states); + return QQmlListProperty<QQuickState>(this, &d->states, + &QQuickStateGroupPrivate::append_state, + &QQuickStateGroupPrivate::count_state, + &QQuickStateGroupPrivate::at_state, + &QQuickStateGroupPrivate::clear_states, + &QQuickStateGroupPrivate::replace_states, + &QQuickStateGroupPrivate::removeLast_states); } void QQuickStateGroupPrivate::append_state(QQmlListProperty<QQuickState> *list, QQuickState *state) @@ -201,6 +206,29 @@ void QQuickStateGroupPrivate::clear_states(QQmlListProperty<QQuickState> *list) _this->d_func()->states.clear(); } +void QQuickStateGroupPrivate::replace_states(QQmlListProperty<QQuickState> *list, int index, QQuickState *state) +{ + auto *self = qobject_cast<QQuickStateGroup *>(list->object); + auto *d = self->d_func(); + auto *oldState = d->states.at(index); + if (oldState != state) { + oldState->setStateGroup(nullptr); + state->setStateGroup(self); + d->states.replace(index, state); + if (d->currentState == oldState->name()) + d->setCurrentStateInternal(state->name(), true); + } +} + +void QQuickStateGroupPrivate::removeLast_states(QQmlListProperty<QQuickState> *list) +{ + auto *d = qobject_cast<QQuickStateGroup *>(list->object)->d_func(); + if (d->currentState == d->states.last()->name()) + d->setCurrentStateInternal(d->states.length() > 1 ? d->states.first()->name() : QString(), true); + d->states.last()->setStateGroup(nullptr); + d->states.removeLast(); +} + /*! \qmlproperty list<Transition> QtQuick::StateGroup::transitions This property holds a list of transitions defined by the state group. |