387bool QQuickState::removeEntryFromRevertList(QObject *target,
const QString &name)
391 if (isStateActive()) {
392 for (
auto it = d->revertList.begin(), end = d->revertList.end(); it != end; ++it) {
393 QQuickSimpleAction &simpleAction = *it;
394 if (simpleAction.property().object() == target && simpleAction.property().name() == name) {
395 QQmlPropertyPrivate::removeBinding(simpleAction.property());
397 simpleAction.property().write(simpleAction.value());
398 if (
auto binding = simpleAction.binding(); binding) {
399 QQmlProperty prop = simpleAction.property();
400 binding.installOn(prop);
403 d->revertList.erase(it);
421void QQuickState::removeAllEntriesFromRevertList(QObject *target)
425 if (isStateActive()) {
426 const auto actionMatchesTarget = [target](
const QQuickSimpleAction &simpleAction) {
427 if (simpleAction.property().object() == target) {
428 QQmlPropertyPrivate::removeBinding(simpleAction.property());
429 simpleAction.property().write(simpleAction.value());
430 if (
auto binding = simpleAction.binding()) {
431 QQmlProperty prop = simpleAction.property();
432 binding.installOn(prop);
440 d->revertList.removeIf(actionMatchesTarget);
444void QQuickState::addEntriesToRevertList(
const QList<QQuickStateAction> &actionList)
447 if (isStateActive()) {
448 QList<QQuickSimpleAction> simpleActionList;
449 simpleActionList.reserve(actionList.size());
451 for (
const QQuickStateAction &action : actionList) {
452 QQuickSimpleAction simpleAction(action);
453 action.property.write(action.toValue);
454 if (
auto binding = action.toBinding; binding)
455 binding.installOn(action.property);
457 simpleActionList.append(simpleAction);
460 d->revertList.append(simpleActionList);
497void QQuickState::apply(QQuickTransition *trans, QQuickState *revert)
501 qmlExecuteDeferred(
this);
506 d->revertList.clear();
507 d->reverting.clear();
510 QQuickStatePrivate *revertPrivate =
511 static_cast<QQuickStatePrivate*>(revert->d_func());
512 d->revertList = revertPrivate->revertList;
513 revertPrivate->revertList.clear();
517 QQuickStateOperation::ActionList applyList = d->generateActionList();
520 QQuickStatePrivate::SimpleActionList additionalReverts;
522 for (
int ii = 0; ii < applyList.size(); ++ii) {
523 QQuickStateAction &action = applyList[ii];
526 if (!action.event->isReversable())
529 for (
int jj = 0; jj < d->revertList.size(); ++jj) {
530 QQuickStateActionEvent *event = d->revertList.at(jj).event();
531 if (event && event->type() == action.event->type()) {
532 if (action.event->mayOverride(event)) {
535 if (action.event != d->revertList.at(jj).event() && action.event->needsCopy()) {
536 action.event->copyOriginals(d->revertList.at(jj).event());
538 QQuickSimpleAction r(action);
539 additionalReverts << r;
540 d->revertList.removeAt(jj);
542 }
else if (action.event->isRewindable())
543 action.event->saveCurrentValues();
550 action.event->saveOriginals();
553 QQuickSimpleAction r(action);
554 additionalReverts << r;
558 action.fromBinding = QQmlAnyBinding::ofProperty(action.property);
560 for (
int jj = 0; jj < d->revertList.size(); ++jj) {
561 if (d->revertList.at(jj).property() == action.property) {
563 if (d->revertList.at(jj).binding() != action.fromBinding) {
564 action.deleteFromBinding();
571 if (!action.restore) {
572 action.deleteFromBinding();;
576 QQuickSimpleAction r(action);
577 additionalReverts << r;
585 for (
int ii = 0; ii < d->revertList.size(); ++ii) {
587 if (d->revertList.at(ii).event()) {
588 QQuickStateActionEvent *event = d->revertList.at(ii).event();
589 if (!event->isReversable())
591 for (
int jj = 0; !found && jj < applyList.size(); ++jj) {
592 const QQuickStateAction &action = applyList.at(jj);
593 if (action.event && action.event->type() == event->type()) {
594 if (action.event->mayOverride(event))
599 for (
int jj = 0; !found && jj < applyList.size(); ++jj) {
600 const QQuickStateAction &action = applyList.at(jj);
601 if (action.property == d->revertList.at(ii).property())
608 if (d->revertList.at(ii).binding() && !d->revertList.at(ii).property().object()) {
611 QVariant cur = d->revertList.at(ii).property().read();
612 QQmlProperty prop = d->revertList.at(ii).property();
613 QQmlAnyBinding::removeBindingFrom(prop);
616 a.property = d->revertList.at(ii).property();
618 a.toValue = d->revertList.at(ii).value();
619 a.toBinding = d->revertList.at(ii).binding();
620 a.specifiedObject = d->revertList.at(ii).specifiedObject();
621 a.specifiedProperty = d->revertList.at(ii).specifiedProperty();
622 a.event = d->revertList.at(ii).event();
623 a.reverseEvent = d->revertList.at(ii).reverseEvent();
624 if (a.event && a.event->isRewindable())
625 a.event->saveCurrentValues();
629 d->reverting << a.event;
631 d->reverting << a.property;
635 d->revertList << additionalReverts;
637 if (lcStates().isDebugEnabled()) {
638 for (
const QQuickStateAction &action : std::as_const(applyList)) {
640 qCDebug(lcStates) <<
"QQuickStateAction event:" << action.event->type();
642 qCDebug(lcStates) <<
"QQuickStateAction on" << action.property.object()
643 << action.property.name() <<
"from:" << action.fromValue
644 <<
"to:" << action.toValue;
648 d->transitionManager.transition(applyList, trans);