summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2016-08-30 14:39:51 +0200
committerUlf Hermann <ulf.hermann@qt.io>2016-08-30 12:51:08 +0000
commit1db438735f7a3033b8a3ce6ef2b36aee1d725197 (patch)
treea127b1acd8f3009b3b7478ba9f49a9fb4ff9329e /src
parenta34e5cda67c92021d6999b3544669cdbbd9655f8 (diff)
Replace runningSubStateMachines() with invokableServices()
SCXML allows for different kinds of services, not only other state machines. We might add support for them in the future. From invoked state machines you can always get the actual state machine via the respective property. To make this easily accessible, we make the invoked services QObjects. Change-Id: Idd07783730bc98bded404dc2c2c3bd241180c1f4 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/imports/scxmlstatemachine/invokedservices.cpp (renamed from src/imports/scxmlstatemachine/substatemachines.cpp)35
-rw-r--r--src/imports/scxmlstatemachine/invokedservices.h (renamed from src/imports/scxmlstatemachine/substatemachines.h)10
-rw-r--r--src/imports/scxmlstatemachine/plugin.cpp4
-rw-r--r--src/imports/scxmlstatemachine/scxmlstatemachine.pro4
-rw-r--r--src/scxml/qscxmlinvokableservice.h10
-rw-r--r--src/scxml/qscxmlstatemachine.cpp31
-rw-r--r--src/scxml/qscxmlstatemachine.h7
-rw-r--r--src/scxml/qscxmlstatemachine_p.h2
8 files changed, 50 insertions, 53 deletions
diff --git a/src/imports/scxmlstatemachine/substatemachines.cpp b/src/imports/scxmlstatemachine/invokedservices.cpp
index 7feac92..8b4fd44 100644
--- a/src/imports/scxmlstatemachine/substatemachines.cpp
+++ b/src/imports/scxmlstatemachine/invokedservices.cpp
@@ -37,61 +37,62 @@
**
****************************************************************************/
-#include "substatemachines.h"
+#include "invokedservices.h"
+#include <QtScxml/qscxmlinvokableservice.h>
QT_BEGIN_NAMESPACE
-QScxmlSubStateMachines::QScxmlSubStateMachines(QObject *parent) : QObject(parent)
+QScxmlInvokedServices::QScxmlInvokedServices(QObject *parent) : QObject(parent)
{
}
-QVariantMap QScxmlSubStateMachines::children()
+QVariantMap QScxmlInvokedServices::children()
{
QVariantMap ret;
if (m_stateMachine) {
- const QVector<QScxmlStateMachine *> children = m_stateMachine->runningSubStateMachines();
- for (QScxmlStateMachine *stateMachine : children)
- ret.insertMulti(stateMachine->name(), QVariant::fromValue(stateMachine));
+ const QVector<QScxmlInvokableService *> children = m_stateMachine->invokedServices();
+ for (QScxmlInvokableService *service : children)
+ ret.insertMulti(service->name(), QVariant::fromValue(service));
}
return ret;
}
-void QScxmlSubStateMachines::classBegin()
+void QScxmlInvokedServices::classBegin()
{
}
-QScxmlStateMachine *QScxmlSubStateMachines::stateMachine() const
+QScxmlStateMachine *QScxmlInvokedServices::stateMachine() const
{
return m_stateMachine;
}
-void QScxmlSubStateMachines::setStateMachine(QScxmlStateMachine *stateMachine)
+void QScxmlInvokedServices::setStateMachine(QScxmlStateMachine *stateMachine)
{
if (stateMachine != m_stateMachine) {
if (m_stateMachine) {
- disconnect(m_stateMachine, &QScxmlStateMachine::runningSubStateMachinesChanged,
- this, &QScxmlSubStateMachines::childrenChanged);
+ disconnect(m_stateMachine, &QScxmlStateMachine::invokedServicesChanged,
+ this, &QScxmlInvokedServices::childrenChanged);
}
m_stateMachine = stateMachine;
- connect(m_stateMachine, &QScxmlStateMachine::runningSubStateMachinesChanged,
- this, &QScxmlSubStateMachines::childrenChanged);
+ connect(m_stateMachine, &QScxmlStateMachine::invokedServicesChanged,
+ this, &QScxmlInvokedServices::childrenChanged);
emit stateMachineChanged();
emit childrenChanged();
}
}
-QQmlListProperty<QObject> QScxmlSubStateMachines::qmlChildren()
+QQmlListProperty<QObject> QScxmlInvokedServices::qmlChildren()
{
return QQmlListProperty<QObject>(this, m_qmlChildren);
}
-void QScxmlSubStateMachines::componentComplete()
+void QScxmlInvokedServices::componentComplete()
{
if (!m_stateMachine) {
if ((m_stateMachine = qobject_cast<QScxmlStateMachine *>(parent()))) {
- connect(m_stateMachine, &QScxmlStateMachine::runningSubStateMachinesChanged,
- this, &QScxmlSubStateMachines::childrenChanged);
+ connect(m_stateMachine, &QScxmlStateMachine::invokedServicesChanged,
+ this, &QScxmlInvokedServices::childrenChanged);
}
}
}
diff --git a/src/imports/scxmlstatemachine/substatemachines.h b/src/imports/scxmlstatemachine/invokedservices.h
index 064f37a..58d93ad 100644
--- a/src/imports/scxmlstatemachine/substatemachines.h
+++ b/src/imports/scxmlstatemachine/invokedservices.h
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef SUBSTATEMACHINES_H
-#define SUBSTATEMACHINES_H
+#ifndef INVOKEDSERVICES_H
+#define INVOKEDSERVICES_H
#include <QtQml/qqmlparserstatus.h>
#include <QtQml/qqmllist.h>
@@ -46,7 +46,7 @@
QT_BEGIN_NAMESPACE
-class QScxmlSubStateMachines : public QObject, public QQmlParserStatus
+class QScxmlInvokedServices : public QObject, public QQmlParserStatus
{
Q_OBJECT
Q_PROPERTY(QScxmlStateMachine *stateMachine READ stateMachine WRITE setStateMachine
@@ -56,7 +56,7 @@ class QScxmlSubStateMachines : public QObject, public QQmlParserStatus
Q_INTERFACES(QQmlParserStatus)
Q_CLASSINFO("DefaultProperty", "qmlChildren")
public:
- QScxmlSubStateMachines(QObject *parent = 0);
+ QScxmlInvokedServices(QObject *parent = 0);
QVariantMap children();
QScxmlStateMachine *stateMachine() const;
@@ -78,4 +78,4 @@ private:
QT_END_NAMESPACE
-#endif // SUBSTATEMACHINES_H
+#endif // INVOKEDSERVICES_H
diff --git a/src/imports/scxmlstatemachine/plugin.cpp b/src/imports/scxmlstatemachine/plugin.cpp
index 9357764..cd13f33 100644
--- a/src/imports/scxmlstatemachine/plugin.cpp
+++ b/src/imports/scxmlstatemachine/plugin.cpp
@@ -41,7 +41,7 @@
#include "eventconnection.h"
#include "qscxmlevent.h"
#include "statemachineextended.h"
-#include "substatemachines.h"
+#include "invokedservices.h"
#include <QQmlExtensionPlugin>
#include <qqml.h>
@@ -70,7 +70,7 @@ public:
Q_UNUSED(qScxmlEventMetaTypeId)
qmlRegisterType<QScxmlStateMachineLoader>(uri, major, minor, "StateMachineLoader");
qmlRegisterType<QScxmlEventConnection>(uri, major, minor, "EventConnection");
- qmlRegisterType<QScxmlSubStateMachines>(uri, major, minor, "SubStateMachines");
+ qmlRegisterType<QScxmlInvokedServices>(uri, major, minor, "InvokedServices");
qmlRegisterExtendedUncreatableType<QScxmlStateMachine, QScxmlStateMachineExtended>(
uri, major, minor, "QScxmlStateMachine", "Only created through derived types");
qmlProtectModule(uri, 1);
diff --git a/src/imports/scxmlstatemachine/scxmlstatemachine.pro b/src/imports/scxmlstatemachine/scxmlstatemachine.pro
index 7c94091..da8dc18 100644
--- a/src/imports/scxmlstatemachine/scxmlstatemachine.pro
+++ b/src/imports/scxmlstatemachine/scxmlstatemachine.pro
@@ -8,13 +8,13 @@ SOURCES = \
$$PWD/statemachineloader.cpp \
$$PWD/eventconnection.cpp \
$$PWD/statemachineextended.cpp \
- $$PWD/substatemachines.cpp
+ $$PWD/invokedservices.cpp
HEADERS = \
$$PWD/statemachineloader.h \
$$PWD/eventconnection.h \
$$PWD/statemachineextended.h \
- $$PWD/substatemachines.h
+ $$PWD/invokedservices.h
load(qml_plugin)
diff --git a/src/scxml/qscxmlinvokableservice.h b/src/scxml/qscxmlinvokableservice.h
index 8323fe2..a17fdde 100644
--- a/src/scxml/qscxmlinvokableservice.h
+++ b/src/scxml/qscxmlinvokableservice.h
@@ -51,8 +51,14 @@ class QScxmlEvent;
class QScxmlStateMachine;
class QScxmlInvokableServiceFactory;
-class Q_SCXML_EXPORT QScxmlInvokableService
+class Q_SCXML_EXPORT QScxmlInvokableService : public QObject
{
+ Q_OBJECT
+ Q_PROPERTY(QScxmlStateMachine *parentStateMachine READ parentStateMachine CONSTANT)
+ Q_PROPERTY(bool autoforward READ autoforward CONSTANT)
+ Q_PROPERTY(QString id READ id CONSTANT)
+ Q_PROPERTY(QString name READ name CONSTANT)
+
public:
QScxmlInvokableService(QScxmlInvokableServiceFactory *service, QScxmlStateMachine *parentStateMachine);
virtual ~QScxmlInvokableService();
@@ -105,6 +111,8 @@ private:
class Q_SCXML_EXPORT QScxmlInvokableScxml: public QScxmlInvokableService
{
+ Q_OBJECT
+ Q_PROPERTY(QScxmlStateMachine *stateMachine READ stateMachine CONSTANT)
public:
QScxmlInvokableScxml(QScxmlInvokableServiceFactory *service,
QScxmlStateMachine *stateMachine,
diff --git a/src/scxml/qscxmlstatemachine.cpp b/src/scxml/qscxmlstatemachine.cpp
index 7dae1e3..ab03ad4 100644
--- a/src/scxml/qscxmlstatemachine.cpp
+++ b/src/scxml/qscxmlstatemachine.cpp
@@ -332,7 +332,7 @@ void QScxmlStateMachinePrivate::addService(int invokingState)
m_invokedServices[size_t(id)] = { invokingState, service, serviceName };
service->start();
}
- emitRunningSubStateMachinesChanged();
+ emitInvokedServicesChanged();
}
void QScxmlStateMachinePrivate::removeService(int invokingState)
@@ -349,7 +349,7 @@ void QScxmlStateMachinePrivate::removeService(int invokingState)
delete service;
}
}
- emitRunningSubStateMachinesChanged();
+ emitInvokedServicesChanged();
}
QScxmlInvokableServiceFactory *QScxmlStateMachinePrivate::serviceFactory(int id)
@@ -576,10 +576,10 @@ void QScxmlStateMachinePrivate::emitStateActive(int stateIndex, bool active)
QMetaObject::activate(q, m_metaObject, stateIndex, args);
}
-void QScxmlStateMachinePrivate::emitRunningSubStateMachinesChanged()
+void QScxmlStateMachinePrivate::emitInvokedServicesChanged()
{
Q_Q(QScxmlStateMachine);
- emit q->runningSubStateMachinesChanged(q->runningSubStateMachines());
+ emit q->invokedServicesChanged(q->invokedServices());
}
QStringList QScxmlStateMachinePrivate::stateNames(const std::vector<int> &stateIndexes) const
@@ -1819,20 +1819,19 @@ bool QScxmlStateMachine::isDispatchableTarget(const QString &target) const
}
/*!
- \property QScxmlStateMachine::runningSubStateMachines
- \brief A list of running sub state machines that were invoked from the main
+ \property QScxmlStateMachine::invokedServices
+ \brief A list of SCXML services that were invoked from the main
state machine (possibly recursively).
*/
-QVector<QScxmlStateMachine *> QScxmlStateMachine::runningSubStateMachines() const
+QVector<QScxmlInvokableService *> QScxmlStateMachine::invokedServices() const
{
Q_D(const QScxmlStateMachine);
- QVector<QScxmlStateMachine *> result;
+ QVector<QScxmlInvokableService *> result;
for (int i = 0, ei = int(d->m_invokedServices.size()); i != ei; ++i) {
- auto sub = runningSubStateMachine(i);
- if (sub)
- result.append(sub);
+ if (auto service = d->m_invokedServices[size_t(i)].service)
+ result.append(service);
}
return result;
}
@@ -1911,14 +1910,4 @@ bool QScxmlStateMachine::isActive(int stateIndex) const
return d->m_configuration.contains(stateIndex);
}
-QScxmlStateMachine *QScxmlStateMachine::runningSubStateMachine(int index) const
-{
- Q_D(const QScxmlStateMachine);
- auto invokedService = d->m_invokedServices[size_t(index)].service;
- if (auto scxmlService = dynamic_cast<QScxmlInvokableScxml *>(invokedService))
- return scxmlService->stateMachine();
- else
- return nullptr;
-}
-
QT_END_NAMESPACE
diff --git a/src/scxml/qscxmlstatemachine.h b/src/scxml/qscxmlstatemachine.h
index c436b0d..b80fcae 100644
--- a/src/scxml/qscxmlstatemachine.h
+++ b/src/scxml/qscxmlstatemachine.h
@@ -70,7 +70,7 @@ class Q_SCXML_EXPORT QScxmlStateMachine: public QObject
Q_PROPERTY(bool initialized READ isInitialized NOTIFY initializedChanged)
Q_PROPERTY(QScxmlDataModel *dataModel READ dataModel WRITE setDataModel NOTIFY dataModelChanged)
Q_PROPERTY(QVariantMap initialValues READ initialValues WRITE setInitialValues NOTIFY initialValuesChanged)
- Q_PROPERTY(QVector<QScxmlStateMachine *> runningSubStateMachines READ runningSubStateMachines NOTIFY runningSubStateMachinesChanged)
+ Q_PROPERTY(QVector<QScxmlInvokableService *> invokedServices READ invokedServices NOTIFY invokedServicesChanged)
Q_PROPERTY(QString sessionId READ sessionId CONSTANT)
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(bool invoked READ isInvoked CONSTANT)
@@ -235,11 +235,11 @@ public:
Q_INVOKABLE bool isDispatchableTarget(const QString &target) const;
- QVector<QScxmlStateMachine *> runningSubStateMachines() const;
+ QVector<QScxmlInvokableService *> invokedServices() const;
Q_SIGNALS:
void runningChanged(bool running);
- void runningSubStateMachinesChanged(const QVector<QScxmlStateMachine *> &runningMachines);
+ void invokedServicesChanged(const QVector<QScxmlInvokableService *> &invokedServices);
void log(const QString &label, const QString &msg);
void reachedStableState();
void finished();
@@ -262,7 +262,6 @@ protected: // methods for friends:
#ifndef Q_QDOC
// The methods below are used by the compiled state machines.
bool isActive(int stateIndex) const;
- QScxmlStateMachine *runningSubStateMachine(int index) const;
QScxmlTableData *tableData() const;
void setTableData(QScxmlTableData *tableData);
#endif // Q_QDOC
diff --git a/src/scxml/qscxmlstatemachine_p.h b/src/scxml/qscxmlstatemachine_p.h
index a2a52b9..3ca0688 100644
--- a/src/scxml/qscxmlstatemachine_p.h
+++ b/src/scxml/qscxmlstatemachine_p.h
@@ -261,7 +261,7 @@ public:
void resetEvent();
void emitStateActive(int stateIndex, bool active);
- void emitRunningSubStateMachinesChanged();
+ void emitInvokedServicesChanged();
void emitSignalForEvent(int signalIndex, const QVariant &data);
private: