summaryrefslogtreecommitdiffstats
path: root/src/declarative/util/qmlstate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/util/qmlstate.cpp')
-rw-r--r--src/declarative/util/qmlstate.cpp483
1 files changed, 0 insertions, 483 deletions
diff --git a/src/declarative/util/qmlstate.cpp b/src/declarative/util/qmlstate.cpp
deleted file mode 100644
index c743e0b..0000000
--- a/src/declarative/util/qmlstate.cpp
+++ /dev/null
@@ -1,483 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qmlstate_p_p.h"
-#include "qmlstate_p.h"
-
-#include "qmltransition_p.h"
-#include "qmlstategroup_p.h"
-#include "qmlstateoperations_p.h"
-#include "qmlanimation_p.h"
-#include "qmlanimation_p_p.h"
-
-#include <qmlbinding.h>
-#include <qmlglobal_p.h>
-
-#include <QtCore/qdebug.h>
-
-QT_BEGIN_NAMESPACE
-
-DEFINE_BOOL_CONFIG_OPTION(stateChangeDebug, STATECHANGE_DEBUG);
-
-QmlAction::QmlAction()
-: restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false), fromBinding(0), toBinding(0), event(0),
- specifiedObject(0)
-{
-}
-
-QmlAction::QmlAction(QObject *target, const QString &propertyName,
- const QVariant &value)
-: restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false), toValue(value), fromBinding(0),
- toBinding(0), event(0), specifiedObject(target),
- specifiedProperty(propertyName)
-{
- property = QmlMetaProperty::createProperty(target, propertyName);
- if (property.isValid())
- fromValue = property.read();
-}
-
-QmlActionEvent::~QmlActionEvent()
-{
-}
-
-QString QmlActionEvent::typeName() const
-{
- return QString();
-}
-
-void QmlActionEvent::execute()
-{
-}
-
-bool QmlActionEvent::isReversable()
-{
- return false;
-}
-
-void QmlActionEvent::reverse()
-{
-}
-
-QList<QmlAction> QmlActionEvent::extraActions()
-{
- return QList<QmlAction>();
-}
-
-bool QmlActionEvent::changesBindings()
-{
- return false;
-}
-
-void QmlActionEvent::clearForwardBindings()
-{
-}
-
-void QmlActionEvent::clearReverseBindings()
-{
-}
-
-bool QmlActionEvent::override(QmlActionEvent *other)
-{
- Q_UNUSED(other);
- return false;
-}
-
-/*!
- \internal
-*/
-QmlStateOperation::QmlStateOperation(QObjectPrivate &dd, QObject *parent)
- : QObject(dd, parent)
-{
-}
-
-/*!
- \qmlclass State QmlState
- \since 4.7
- \brief The State element defines configurations of objects and properties.
-
- A state is specified as a set of batched changes from the default configuration.
-
- Note that setting the state of an object from within another state of the same object is
- inadvisible. Not only would this have the same effect as going directly to the second state
- it may cause the program to crash.
-
- \sa {qmlstates}{States}, {state-transitions}{Transitions}
-*/
-
-/*!
- \internal
- \class QmlState
- \brief The QmlState class allows you to define configurations of objects and properties.
-
- \ingroup group_states
-
- QmlState allows you to specify a state as a set of batched changes from the default
- configuration.
-
- \sa {states-transitions}{States and Transitions}
-*/
-
-QML_DEFINE_TYPE(Qt,4,6,State,QmlState)
-QmlState::QmlState(QObject *parent)
-: QObject(*(new QmlStatePrivate), parent)
-{
- Q_D(QmlState);
- d->transitionManager.setState(this);
-}
-
-QmlState::~QmlState()
-{
- Q_D(QmlState);
- if (d->group)
- d->group->removeState(this);
-}
-
-/*!
- \qmlproperty string State::name
- This property holds the name of the state
-
- Each state should have a unique name.
-*/
-QString QmlState::name() const
-{
- Q_D(const QmlState);
- return d->name;
-}
-
-void QmlState::setName(const QString &n)
-{
- Q_D(QmlState);
- d->name = n;
-}
-
-bool QmlState::isWhenKnown() const
-{
- Q_D(const QmlState);
- return d->when != 0;
-}
-
-/*!
- \qmlproperty bool State::when
- This property holds when the state should be applied
-
- This should be set to an expression that evaluates to true when you want the state to
- be applied.
-*/
-QmlBinding *QmlState::when() const
-{
- Q_D(const QmlState);
- return d->when;
-}
-
-void QmlState::setWhen(QmlBinding *when)
-{
- Q_D(QmlState);
- d->when = when;
- if (d->group)
- d->group->updateAutoState();
-}
-
-/*!
- \qmlproperty string State::extend
- This property holds the state that this state extends
-
- The state being extended is treated as the base state in regards to
- the changes specified by the extending state.
-*/
-QString QmlState::extends() const
-{
- Q_D(const QmlState);
- return d->extends;
-}
-
-void QmlState::setExtends(const QString &extends)
-{
- Q_D(QmlState);
- d->extends = extends;
-}
-
-/*!
- \qmlproperty list<Change> State::changes
- This property holds the changes to apply for this state
- \default
-
- By default these changes are applied against the default state. If the state
- extends another state, then the changes are applied against the state being
- extended.
-*/
-QmlListProperty<QmlStateOperation> QmlState::changes()
-{
- Q_D(QmlState);
- return QmlListProperty<QmlStateOperation>(this, &d->operations, QmlStatePrivate::operations_append,
- QmlStatePrivate::operations_count, QmlStatePrivate::operations_at,
- QmlStatePrivate::operations_clear);
-}
-
-int QmlState::operationCount() const
-{
- Q_D(const QmlState);
- return d->operations.count();
-}
-
-QmlStateOperation *QmlState::operationAt(int index) const
-{
- Q_D(const QmlState);
- return d->operations.at(index);
-}
-
-QmlState &QmlState::operator<<(QmlStateOperation *op)
-{
- Q_D(QmlState);
- d->operations.append(QmlStatePrivate::OperationGuard(op, &d->operations));
- return *this;
-}
-
-void QmlStatePrivate::complete()
-{
- Q_Q(QmlState);
-
- for (int ii = 0; ii < reverting.count(); ++ii) {
- for (int jj = 0; jj < revertList.count(); ++jj) {
- if (revertList.at(jj).property == reverting.at(ii)) {
- revertList.removeAt(jj);
- break;
- }
- }
- }
- reverting.clear();
-
- emit q->completed();
-}
-
-// Generate a list of actions for this state. This includes coelescing state
-// actions that this state "extends"
-QmlStateOperation::ActionList
-QmlStatePrivate::generateActionList(QmlStateGroup *group) const
-{
- QmlStateOperation::ActionList applyList;
- if (inState)
- return applyList;
-
- // Prevent "extends" recursion
- inState = true;
-
- if (!extends.isEmpty()) {
- QList<QmlState *> states = group->states();
- for (int ii = 0; ii < states.count(); ++ii)
- if (states.at(ii)->name() == extends)
- applyList = static_cast<QmlStatePrivate*>(states.at(ii)->d_func())->generateActionList(group);
- }
-
- foreach(QmlStateOperation *op, operations)
- applyList << op->actions();
-
- inState = false;
- return applyList;
-}
-
-QmlStateGroup *QmlState::stateGroup() const
-{
- Q_D(const QmlState);
- return d->group;
-}
-
-void QmlState::setStateGroup(QmlStateGroup *group)
-{
- Q_D(QmlState);
- d->group = group;
-}
-
-void QmlState::cancel()
-{
- Q_D(QmlState);
- d->transitionManager.cancel();
-}
-
-void QmlAction::deleteFromBinding()
-{
- if (fromBinding) {
- property.setBinding(0);
- fromBinding->destroy();
- fromBinding = 0;
- }
-}
-
-void QmlState::apply(QmlStateGroup *group, QmlTransition *trans, QmlState *revert)
-{
- Q_D(QmlState);
-
- qmlExecuteDeferred(this);
-
- cancel();
- if (revert)
- revert->cancel();
- d->revertList.clear();
- d->reverting.clear();
-
- if (revert) {
- QmlStatePrivate *revertPrivate =
- static_cast<QmlStatePrivate*>(revert->d_func());
- d->revertList = revertPrivate->revertList;
- revertPrivate->revertList.clear();
- }
-
- // List of actions caused by this state
- QmlStateOperation::ActionList applyList = d->generateActionList(group);
-
- // List of actions that need to be reverted to roll back (just) this state
- QmlStatePrivate::SimpleActionList additionalReverts;
- // First add the reverse of all the applyList actions
- for (int ii = 0; ii < applyList.count(); ++ii) {
- QmlAction &action = applyList[ii];
-
- bool found = false;
-
- int jj;
- if (action.event) {
- if (!action.event->isReversable())
- continue;
- for (jj = 0; jj < d->revertList.count(); ++jj) {
- QmlActionEvent *event = d->revertList.at(jj).event;
- if (event && event->typeName() == action.event->typeName()) {
- if (action.event->override(event)) {
- found = true;
- break;
- }
- }
- }
- if (!found || action.event != d->revertList.at(jj).event)
- action.event->saveOriginals();
- else if (action.event->isRewindable())
- action.event->saveCurrentValues();
- } else {
- action.fromBinding = action.property.binding();
-
- for (jj = 0; jj < d->revertList.count(); ++jj) {
- if (d->revertList.at(jj).property == action.property) {
- found = true;
- break;
- }
- }
- }
-
- if (!found) {
- if (!action.restore) {
- action.deleteFromBinding();
- } else {
- // Only need to revert the applyList action if the previous
- // state doesn't have a higher priority revert already
- QmlSimpleAction r(action);
- additionalReverts << r;
- }
- } else if (d->revertList.at(jj).binding != action.fromBinding) {
- action.deleteFromBinding();
- }
- }
-
- // Any reverts from a previous state that aren't carried forth
- // into this state need to be translated into apply actions
- for (int ii = 0; ii < d->revertList.count(); ++ii) {
- bool found = false;
- if (d->revertList.at(ii).event) {
- QmlActionEvent *event = d->revertList.at(ii).event;
- if (!event->isReversable())
- continue;
- for (int jj = 0; !found && jj < applyList.count(); ++jj) {
- const QmlAction &action = applyList.at(jj);
- if (action.event && action.event->typeName() == event->typeName()) {
- if (action.event->override(event))
- found = true;
- }
- }
- } else {
- for (int jj = 0; !found && jj < applyList.count(); ++jj) {
- const QmlAction &action = applyList.at(jj);
- if (action.property == d->revertList.at(ii).property)
- found = true;
- }
- }
- if (!found) {
- QVariant cur = d->revertList.at(ii).property.read();
- QmlAbstractBinding *delBinding = d->revertList.at(ii).property.setBinding(0);
- if (delBinding)
- delBinding->destroy();
-
- QmlAction a;
- a.property = d->revertList.at(ii).property;
- a.fromValue = cur;
- a.toValue = d->revertList.at(ii).value;
- a.toBinding = d->revertList.at(ii).binding;
- a.specifiedObject = d->revertList.at(ii).specifiedObject;
- a.specifiedProperty = d->revertList.at(ii).specifiedProperty;
- a.event = d->revertList.at(ii).event;
- a.reverseEvent = d->revertList.at(ii).reverseEvent;
- if (a.event && a.event->isRewindable())
- a.event->saveCurrentValues();
- applyList << a;
- // Store these special reverts in the reverting list
- d->reverting << d->revertList.at(ii).property;
- }
- }
- // All the local reverts now become part of the ongoing revertList
- d->revertList << additionalReverts;
-
- // Output for debugging
- if (stateChangeDebug()) {
- foreach(const QmlAction &action, applyList) {
- if (action.event)
- qWarning() << " QmlAction event:" << action.event->typeName();
- else
- qWarning() << " QmlAction:" << action.property.object()
- << action.property.name() << "From:" << action.fromValue
- << "To:" << action.toValue;
- }
- }
-
- d->transitionManager.transition(applyList, trans);
-}
-
-QML_DEFINE_NOCREATE_TYPE(QmlStateOperation)
-QmlStateOperation::ActionList QmlStateOperation::actions()
-{
- return ActionList();
-}
-
-QT_END_NAMESPACE