summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@theqtcompany.com>2016-03-11 12:13:48 +0100
committerUlf Hermann <ulf.hermann@theqtcompany.com>2016-03-30 11:56:44 +0000
commit4e407b332b7d34cf4eaa10397dba9e761c7e2897 (patch)
tree999e81e3804385651e424c4bc9892c3e5c5703aa /src
parenta14b1e4c4787fa1e4a7d470444c248fd08817105 (diff)
Pass data model and initial values through the loader
As the loader automatically starts the state machine and we can only set the data model and initial values before the machine starts, we have to do this. Change-Id: I8d013465cc2f35ce286263bf881cb4389cb335b0 Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/imports/scxmlstatemachine/statemachineloader.cpp44
-rw-r--r--src/imports/scxmlstatemachine/statemachineloader.h14
2 files changed, 58 insertions, 0 deletions
diff --git a/src/imports/scxmlstatemachine/statemachineloader.cpp b/src/imports/scxmlstatemachine/statemachineloader.cpp
index 2062ab6..1fc48bf 100644
--- a/src/imports/scxmlstatemachine/statemachineloader.cpp
+++ b/src/imports/scxmlstatemachine/statemachineloader.cpp
@@ -67,6 +67,8 @@
QScxmlStateMachineLoader::QScxmlStateMachineLoader(QObject *parent)
: QObject(parent)
+ , m_dataModel(Q_NULLPTR)
+ , m_implicitDataModel(Q_NULLPTR)
, m_stateMachine(Q_NULLPTR)
{
}
@@ -100,6 +102,7 @@ void QScxmlStateMachineLoader::setFilename(const QUrl &filename)
if (m_stateMachine) {
delete m_stateMachine;
m_stateMachine = Q_NULLPTR;
+ m_implicitDataModel = Q_NULLPTR;
}
if (parse(filename)) {
@@ -113,6 +116,40 @@ void QScxmlStateMachineLoader::setFilename(const QUrl &filename)
}
}
+QVariantMap QScxmlStateMachineLoader::initialValues() const
+{
+ return m_initialValues;
+}
+
+void QScxmlStateMachineLoader::setInitialValues(const QVariantMap &initialValues)
+{
+ if (initialValues != m_initialValues) {
+ m_initialValues = initialValues;
+ if (m_stateMachine)
+ m_stateMachine->setInitialValues(initialValues);
+ emit initialValuesChanged();
+ }
+}
+
+QScxmlDataModel *QScxmlStateMachineLoader::dataModel() const
+{
+ return m_dataModel;
+}
+
+void QScxmlStateMachineLoader::setDataModel(QScxmlDataModel *dataModel)
+{
+ if (dataModel != m_dataModel) {
+ m_dataModel = dataModel;
+ if (m_stateMachine) {
+ if (dataModel)
+ m_stateMachine->setDataModel(dataModel);
+ else
+ m_stateMachine->setDataModel(m_implicitDataModel);
+ }
+ emit dataModelChanged();
+ }
+}
+
bool QScxmlStateMachineLoader::parse(const QUrl &filename)
{
if (!QQmlFile::isSynchronous(filename)) {
@@ -135,9 +172,16 @@ bool QScxmlStateMachineLoader::parse(const QUrl &filename)
m_stateMachine = QScxmlStateMachine::fromData(&buf, filename.toString());
m_stateMachine->setParent(this);
+ m_implicitDataModel = m_stateMachine->dataModel();
if (m_stateMachine->parseErrors().isEmpty()) {
+ if (m_dataModel)
+ m_stateMachine->setDataModel(m_dataModel);
+ m_stateMachine->setInitialValues(m_initialValues);
emit stateMachineChanged();
+
+ // as this is deferred any pending property updates to m_dataModel and m_initialValues
+ // should still occur before start().
QMetaObject::invokeMethod(m_stateMachine, "start", Qt::QueuedConnection);
return true;
} else {
diff --git a/src/imports/scxmlstatemachine/statemachineloader.h b/src/imports/scxmlstatemachine/statemachineloader.h
index 5448047..0e73a50 100644
--- a/src/imports/scxmlstatemachine/statemachineloader.h
+++ b/src/imports/scxmlstatemachine/statemachineloader.h
@@ -51,6 +51,9 @@ class QScxmlStateMachineLoader: public QObject
Q_OBJECT
Q_PROPERTY(QUrl filename READ filename WRITE setFilename NOTIFY filenameChanged)
Q_PROPERTY(QScxmlStateMachine* stateMachine READ stateMachine DESIGNABLE false NOTIFY stateMachineChanged)
+ Q_PROPERTY(QVariantMap initialValues READ initialValues WRITE setInitialValues NOTIFY initialValuesChanged)
+ Q_PROPERTY(QScxmlDataModel* dataModel READ dataModel WRITE setDataModel NOTIFY dataModelChanged)
+
public:
explicit QScxmlStateMachineLoader(QObject *parent = 0);
@@ -60,15 +63,26 @@ public:
QUrl filename();
void setFilename(const QUrl &filename);
+ QVariantMap initialValues() const;
+ void setInitialValues(const QVariantMap &initialValues);
+
+ QScxmlDataModel *dataModel() const;
+ void setDataModel(QScxmlDataModel *dataModel);
+
Q_SIGNALS:
void filenameChanged();
+ void initialValuesChanged();
void stateMachineChanged();
+ void dataModelChanged();
private:
bool parse(const QUrl &filename);
private:
QUrl m_filename;
+ QVariantMap m_initialValues;
+ QScxmlDataModel *m_dataModel;
+ QScxmlDataModel *m_implicitDataModel;
QScxmlStateMachine *m_stateMachine;
};