From cae7176827eb3c23428cfcd8f6dabb00f8dcaef3 Mon Sep 17 00:00:00 2001 From: Sebastian Sauer Date: Tue, 12 Aug 2014 18:53:00 +0700 Subject: 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 --- src/imports/statemachine/signaltransition.cpp | 41 +++++++++++++++++++++------ src/imports/statemachine/signaltransition.h | 10 ++++--- 2 files changed, 39 insertions(+), 12 deletions(-) (limited to 'src/imports') 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 #include #include +#include #include #include @@ -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(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 #include +#include + 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 -- cgit v1.2.3