diff options
author | Sebastian Sauer <sebastian.sauer.ford@kdab.com> | 2014-08-12 18:53:00 +0700 |
---|---|---|
committer | Sebastian Sauer <sebastian.sauer@kdab.com> | 2014-08-25 17:29:21 +0200 |
commit | cae7176827eb3c23428cfcd8f6dabb00f8dcaef3 (patch) | |
tree | 948a32f66791eff082363c6aca5a1436cd4e9353 /src/imports | |
parent | 99fd3a6b22a7eabf2aff656a942b0b7e32093254 (diff) |
QSM: Reintroduce guard argument evaluation
Implements the suggestion from Simon Hausmann (codereview 89716
from 08-05 14:46) to use QQmlScriptString rather then the previous
used MetaObject-manipulation.
This also introduces comparison operators for QQmlScriptString
to be able to determinate if a QQmlScriptString changed what
is needed cause there is otherwise no way to access (all) the
needed details within QQmlScriptStringPrivate.
Change-Id: I198479eac8fd37cbdd98a99aacdd8eebf7b75d21
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/imports')
-rw-r--r-- | src/imports/statemachine/signaltransition.cpp | 41 | ||||
-rw-r--r-- | src/imports/statemachine/signaltransition.h | 10 |
2 files changed, 39 insertions, 12 deletions
diff --git a/src/imports/statemachine/signaltransition.cpp b/src/imports/statemachine/signaltransition.cpp index 9b64550678..634ec5a43b 100644 --- a/src/imports/statemachine/signaltransition.cpp +++ b/src/imports/statemachine/signaltransition.cpp @@ -38,6 +38,7 @@ #include <QQmlInfo> #include <QQmlEngine> #include <QQmlContext> +#include <QQmlExpression> #include <private/qv4qobjectwrapper_p.h> #include <private/qv8engine_p.h> @@ -46,7 +47,6 @@ SignalTransition::SignalTransition(QState *parent) : QSignalTransition(this, SIGNAL(invokeYourself()), parent) - , m_guard(true) { connect(this, SIGNAL(signalChanged()), SIGNAL(qmlSignalChanged())); } @@ -57,7 +57,23 @@ bool SignalTransition::eventTest(QEvent *event) if (!QSignalTransition::eventTest(event)) return false; - return m_guard; + if (m_guard.isEmpty()) + return true; + + QQmlContext context(QQmlEngine::contextForObject(this)); + + QStateMachine::SignalEvent *e = static_cast<QStateMachine::SignalEvent*>(event); + + // Set arguments as context properties + int count = e->arguments().count(); + QMetaMethod metaMethod = e->sender()->metaObject()->method(e->signalIndex()); + for (int i = 0; i < count; i++) + context.setContextProperty(metaMethod.parameterNames()[i], QVariant::fromValue(e->arguments().at(i))); + + QQmlExpression expr(m_guard, &context, this); + QVariant result = expr.evaluate(); + + return result.toBool(); } const QJSValue& SignalTransition::signal() @@ -89,17 +105,18 @@ void SignalTransition::setSignal(const QJSValue &signal) QSignalTransition::setSignal(metaMethod.methodSignature()); } -bool SignalTransition::guard() const +QQmlScriptString SignalTransition::guard() const { return m_guard; } -void SignalTransition::setGuard(bool guard) +void SignalTransition::setGuard(const QQmlScriptString &guard) { - if (guard != m_guard) { - m_guard = guard; - emit guardChanged(); - } + if (m_guard == guard) + return; + + m_guard = guard; + emit guardChanged(); } void SignalTransition::invoke() @@ -227,4 +244,12 @@ void SignalTransition::invoke() Guard conditions affect the behavior of a state machine by enabling transitions only when they evaluate to true and disabling them when they evaluate to false. + + When the signal associated with this signal transition is emitted the + guard condition is evaluated. In the guard condition the arguments + of the signal can be used as demonstrated in the example below. + + \snippet qml/statemachine/guardcondition.qml document + + \sa signal */ diff --git a/src/imports/statemachine/signaltransition.h b/src/imports/statemachine/signaltransition.h index 311195e8e9..3ac563b15e 100644 --- a/src/imports/statemachine/signaltransition.h +++ b/src/imports/statemachine/signaltransition.h @@ -38,19 +38,21 @@ #include <QtCore/QVariant> #include <QtQml/QJSValue> +#include <QtQml/qqmlscriptstring.h> + QT_BEGIN_NAMESPACE class SignalTransition : public QSignalTransition { Q_OBJECT Q_PROPERTY(QJSValue signal READ signal WRITE setSignal NOTIFY qmlSignalChanged) - Q_PROPERTY(bool guard READ guard WRITE setGuard NOTIFY guardChanged) + Q_PROPERTY(QQmlScriptString guard READ guard WRITE setGuard NOTIFY guardChanged) public: explicit SignalTransition(QState *parent = Q_NULLPTR); - bool guard() const; - void setGuard(bool guard); + QQmlScriptString guard() const; + void setGuard(const QQmlScriptString &guard); bool eventTest(QEvent *event); @@ -70,7 +72,7 @@ Q_SIGNALS: private: QByteArray m_data; QJSValue m_signal; - bool m_guard; + QQmlScriptString m_guard; }; QT_END_NAMESPACE |