}
reverting.clear();
+ if (group)
+ group->stateAboutToComplete();
emit q->completed();
}
// Generate a list of actions for this state. This includes coelescing state
// actions that this state "extends"
QDeclarativeStateOperation::ActionList
-QDeclarativeStatePrivate::generateActionList(QDeclarativeStateGroup *group) const
+QDeclarativeStatePrivate::generateActionList() const
{
QDeclarativeStateOperation::ActionList applyList;
if (inState)
inState = true;
if (!extends.isEmpty()) {
- QList<QDeclarativeState *> states = group->states();
+ QList<QDeclarativeState *> states = group ? group->states() : QList<QDeclarativeState *>();
for (int ii = 0; ii < states.count(); ++ii)
if (states.at(ii)->name() == extends) {
qmlExecuteDeferred(states.at(ii));
- applyList = static_cast<QDeclarativeStatePrivate*>(states.at(ii)->d_func())->generateActionList(group);
+ applyList = static_cast<QDeclarativeStatePrivate*>(states.at(ii)->d_func())->generateActionList();
}
}
return stateGroup() && stateGroup()->state() == name();
}
-void QDeclarativeState::apply(QDeclarativeStateGroup *group, QDeclarativeTransition *trans, QDeclarativeState *revert)
+void QDeclarativeState::apply(QDeclarativeTransition *trans, QDeclarativeState *revert)
{
Q_D(QDeclarativeState);
}
// List of actions caused by this state
- QDeclarativeStateOperation::ActionList applyList = d->generateActionList(group);
+ QDeclarativeStateOperation::ActionList applyList = d->generateActionList();
// List of actions that need to be reverted to roll back (just) this state
QDeclarativeStatePrivate::SimpleActionList additionalReverts;
QDeclarativeState &operator<<(QDeclarativeStateOperation *);
- void apply(QDeclarativeStateGroup *, QDeclarativeTransition *, QDeclarativeState *revert);
+ void apply(QDeclarativeTransition *, QDeclarativeState *revert);
void cancel();
QDeclarativeStateGroup *stateGroup() const;
mutable bool inState;
QDeclarativeStateGroup *group;
- QDeclarativeStateOperation::ActionList generateActionList(QDeclarativeStateGroup *) const;
+ QDeclarativeStateOperation::ActionList generateActionList() const;
void complete();
};
}
if (oldState == 0 || newState == 0) {
- if (!nullState) { nullState = new QDeclarativeState; QDeclarative_setParent_noEvent(nullState, q); }
+ if (!nullState) {
+ nullState = new QDeclarativeState;
+ QDeclarative_setParent_noEvent(nullState, q);
+ nullState->setStateGroup(q);
+ }
if (!oldState) oldState = nullState;
if (!newState) newState = nullState;
}
- newState->apply(q, transition, oldState);
- applyingState = false;
- if (!transition)
- static_cast<QDeclarativeStatePrivate*>(QObjectPrivate::get(newState))->complete();
+ newState->apply(transition, oldState);
+ applyingState = false; //### consider removing this (don't allow state changes in transition)
}
QDeclarativeState *QDeclarativeStateGroup::findState(const QString &name) const
d->states.removeOne(state);
}
+void QDeclarativeStateGroup::stateAboutToComplete()
+{
+ Q_D(QDeclarativeStateGroup);
+ d->applyingState = false;
+}
+
QT_END_NAMESPACE
QDeclarativeListProperty<QDeclarativeTransition> transitionsProperty();
QDeclarativeState *findState(const QString &name) const;
+ void removeState(QDeclarativeState *state);
virtual void classBegin();
virtual void componentComplete();
private:
friend class QDeclarativeState;
+ friend class QDeclarativeStatePrivate;
bool updateAutoState();
- void removeState(QDeclarativeState *state);
+ void stateAboutToComplete();
};
QT_END_NAMESPACE
public:
QDeclarativeTransitionPrivate()
: fromState(QLatin1String("*")), toState(QLatin1String("*")),
- reversed(false), reversible(false), enabled(true), endState(0)
+ reversed(false), reversible(false), enabled(true), manager(0)
{
group.trans = this;
}
bool reversible;
bool enabled;
ParallelAnimationWrapper group;
- QDeclarativeTransitionManager *endState;
+ QDeclarativeTransitionManager *manager;
void complete()
{
- endState->complete();
+ manager->complete();
}
static void append_animation(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, QDeclarativeAbstractAnimation *a);
static int animation_count(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list);
void QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &actions,
QList<QDeclarativeProperty> &after,
- QDeclarativeTransitionManager *endState)
+ QDeclarativeTransitionManager *manager)
{
Q_D(QDeclarativeTransition);
}
}
- d->endState = endState;
+ d->manager = manager;
d->group.setDirection(d->reversed ? QAbstractAnimation::Backward : QAbstractAnimation::Forward);
d->group.start();
}
}
#endif
if (!transition)
- d->applyBindings();
+ complete();
}
void QDeclarativeTransitionManager::cancel()