QDeclarativeTransition *QDeclarativeStateGroupPrivate::findTransition(const QString &from, const QString &to) { QDeclarativeTransition *highest = 0; int score = 0; bool reversed = false; bool done = false; for (int ii = 0; !done && ii < transitions.count(); ++ii) { QDeclarativeTransition *t = transitions.at(ii); for (int ii = 0; ii < 2; ++ii) { if (ii && (!t->reversible() || (t->fromState() == QLatin1String("*") && t->toState() == QLatin1String("*")))) break; QStringList fromState; QStringList toState; fromState = t->fromState().split(QLatin1Char(',')); toState = t->toState().split(QLatin1Char(',')); if (ii == 1) qSwap(fromState, toState); int tScore = 0; if (fromState.contains(from)) tScore += 2; else if (fromState.contains(QLatin1String("*"))) tScore += 1; else continue; if (toState.contains(to)) tScore += 2; else if (toState.contains(QLatin1String("*"))) tScore += 1; else continue; if (ii == 1) reversed = true; else reversed = false; if (tScore == 4) { highest = t; done = true; break; } else if (tScore > score) { score = tScore; highest = t; } } } if (highest) highest->setReversed(reversed); return highest; }
void QDeclarativeStateGroupPrivate::setCurrentStateInternal(const QString &state, bool ignoreTrans) { Q_Q(QDeclarativeStateGroup); if (!componentComplete) { currentState = state; return; } if (applyingState) { qmlInfo(q) << "Can't apply a state change as part of a state definition."; return; } applyingState = true; QDeclarativeTransition *transition = (ignoreTrans || ignoreTrans) ? 0 : findTransition(currentState, state); if (stateChangeDebug()) { qWarning() << this << "Changing state. From" << currentState << ". To" << state; if (transition) qWarning() << " using transition" << transition->fromState() << transition->toState(); } QDeclarativeState *oldState = 0; if (!currentState.isEmpty()) { for (int ii = 0; ii < states.count(); ++ii) { if (states.at(ii)->name() == currentState) { oldState = states.at(ii); break; } } } currentState = state; emit q->stateChanged(currentState); QDeclarativeState *newState = 0; for (int ii = 0; ii < states.count(); ++ii) { if (states.at(ii)->name() == currentState) { newState = states.at(ii); break; } } if (oldState == 0 || newState == 0) { if (!nullState) { nullState = new QDeclarativeState; QDeclarative_setParent_noEvent(nullState, 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(); }