From 747b5dde9182770bc4ad9033a5536f38eb391f4f Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Wed, 19 Aug 2009 10:16:37 +1000 Subject: Complete ParentChangeAction. Make it useful as a non-transition; add the ability to select by target, and set an explicit "to-value". --- src/declarative/util/qmlanimation.cpp | 56 ++++++++++++++++++++++++++--------- src/declarative/util/qmlanimation.h | 11 +++++-- src/declarative/util/qmlanimation_p.h | 5 +++- 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/declarative/util/qmlanimation.cpp b/src/declarative/util/qmlanimation.cpp index 86eaa78..e381b47 100644 --- a/src/declarative/util/qmlanimation.cpp +++ b/src/declarative/util/qmlanimation.cpp @@ -866,6 +866,7 @@ void QmlRunScriptAction::transition(QmlStateActions &actions, if (action.event && action.event->typeName() == QLatin1String("RunScript") && static_cast(action.event)->name() == d->name) { + //### how should we handle reverse direction? d->runScriptScript = static_cast(action.event)->script(); action.actionDone = true; break; //assumes names are unique @@ -1116,21 +1117,36 @@ void QmlParentChangeActionPrivate::init() QFx_setParent_noEvent(cpa, q); } -void QmlParentChangeActionPrivate::doAction() +QFxItem *QmlParentChangeAction::object() const { - //### property.write(value); + Q_D(const QmlParentChangeAction); + return d->pcTarget; } -void QmlParentChangeAction::prepare(QmlMetaProperty &p) +void QmlParentChangeAction::setObject(QFxItem *target) { Q_D(QmlParentChangeAction); + d->pcTarget = target; +} - if (d->userProperty.isNull) - d->property = p; - else - d->property = d->userProperty; +QFxItem *QmlParentChangeAction::parent() const +{ + Q_D(const QmlParentChangeAction); + return d->pcParent; +} - //### +void QmlParentChangeAction::setParent(QFxItem *parent) +{ + Q_D(QmlParentChangeAction); + d->pcParent = parent; +} + +void QmlParentChangeActionPrivate::doAction() +{ + QmlParentChange pc; + pc.setObject(pcTarget); + pc.setParent(pcParent); + pc.execute(); } QAbstractAnimation *QmlParentChangeAction::qtAnimation() @@ -1149,8 +1165,12 @@ void QmlParentChangeAction::transition(QmlStateActions &actions, struct QmlParentChangeActionData : public QAbstractAnimationAction { + QmlParentChangeActionData(): pc(0) {} + ~QmlParentChangeActionData() { delete pc; } + QmlStateActions actions; bool reverse; + QmlParentChange *pc; virtual void doAction() { for (int ii = 0; ii < actions.count(); ++ii) { @@ -1168,14 +1188,22 @@ void QmlParentChangeAction::transition(QmlStateActions &actions, for (int ii = 0; ii < actions.count(); ++ii) { Action &action = actions[ii]; - //### should we still use target to filter? - //### still need type-specific matching - if (action.event - && action.event->typeName() == QLatin1String("ParentChange")) { + if (action.event && action.event->typeName() == QLatin1String("ParentChange") + && (!d->target || static_cast(action.event)->object() == d->target)) { Action myAction = action; data->reverse = action.reverseEvent; - data->actions << myAction; - action.actionDone = true; + if (d->pcParent) { + QmlParentChange *pc = new QmlParentChange; + pc->setObject(d->pcTarget); + pc->setParent(d->pcParent); + myAction.event = pc; + data->pc = pc; + data->actions << myAction; + break; //only match one + } else { + action.actionDone = true; + data->actions << myAction; + } } } diff --git a/src/declarative/util/qmlanimation.h b/src/declarative/util/qmlanimation.h index 93febb2..9b39c38c 100644 --- a/src/declarative/util/qmlanimation.h +++ b/src/declarative/util/qmlanimation.h @@ -221,24 +221,31 @@ protected: virtual void prepare(QmlMetaProperty &); }; +class QFxItem; class QmlParentChangeActionPrivate; class QmlParentChangeAction : public QmlAbstractAnimation { Q_OBJECT Q_DECLARE_PRIVATE(QmlParentChangeAction) - //XXX should have parent property as well for when it isn't part of a transition + Q_PROPERTY(QFxItem *target READ object WRITE setObject) + Q_PROPERTY(QFxItem *parent READ parent WRITE setParent) public: QmlParentChangeAction(QObject *parent=0); virtual ~QmlParentChangeAction(); + QFxItem *object() const; + void setObject(QFxItem *); + + QFxItem *parent() const; + void setParent(QFxItem *); + protected: virtual void transition(QmlStateActions &actions, QmlMetaProperties &modified, TransitionDirection direction); virtual QAbstractAnimation *qtAnimation(); - virtual void prepare(QmlMetaProperty &); }; class QmlPropertyAnimationPrivate; diff --git a/src/declarative/util/qmlanimation_p.h b/src/declarative/util/qmlanimation_p.h index 34ed520..fb4dae0 100644 --- a/src/declarative/util/qmlanimation_p.h +++ b/src/declarative/util/qmlanimation_p.h @@ -267,10 +267,13 @@ class QmlParentChangeActionPrivate : public QmlAbstractAnimationPrivate Q_DECLARE_PUBLIC(QmlParentChangeAction) public: QmlParentChangeActionPrivate() - : QmlAbstractAnimationPrivate() {} + : QmlAbstractAnimationPrivate(), pcTarget(0), pcParent(0) {} void init(); + QFxItem *pcTarget; + QFxItem *pcParent; + void doAction(); QActionAnimation *cpa; }; -- cgit v0.12