diff options
author | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2016-03-11 12:13:48 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2016-03-30 11:56:44 +0000 |
commit | 4e407b332b7d34cf4eaa10397dba9e761c7e2897 (patch) | |
tree | 999e81e3804385651e424c4bc9892c3e5c5703aa /src | |
parent | a14b1e4c4787fa1e4a7d470444c248fd08817105 (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.cpp | 44 | ||||
-rw-r--r-- | src/imports/scxmlstatemachine/statemachineloader.h | 14 |
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; }; |