diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2019-10-25 16:09:51 +0200 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2019-10-28 08:57:14 +0000 |
commit | d6b29a89ec980e415cf4c3bdadd32ee850917e05 (patch) | |
tree | cf829e4fba27cc999a26b3cabe77039b7e1d6b96 /src/plugins | |
parent | 7b2b040f41412c735c67e33d90fdd77cdb7a297f (diff) | |
download | qt-creator-d6b29a89ec980e415cf4c3bdadd32ee850917e05.tar.gz |
QmlDesigner: Add transactions to NodeInstanceView::valuesModified()
Transactions bypass the rewriter and one transaction is one step on
the undo/redo stack.
Change-Id: Icd782389f74bde2b14432b8f854f29bad49a9104
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/qmldesigner/designercore/include/nodeinstanceview.h | 3 | ||||
-rw-r--r-- | src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp | 38 |
2 files changed, 39 insertions, 2 deletions
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 1e1032900b..5c9356f556 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -194,6 +194,8 @@ private: // functions private: void handleCrash(); + void startPuppetTransaction(); + void endPuppetTransaction(); private: //variables NodeInstance m_rootNodeInstance; @@ -209,6 +211,7 @@ private: //variables ProjectExplorer::Kit *m_currentKit = nullptr; ProjectExplorer::Project *m_currentProject = nullptr; int m_restartProcessTimerId; + RewriterTransaction m_puppetTransaction; }; } // namespace ProxyNodeInstanceView diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index ed63caec5a..92b0880c80 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -70,6 +70,7 @@ #include "nodeinstanceserverproxy.h" #include <utils/algorithm.h> +#include <utils/qtcassert.h> #include <QUrl> #include <QMultiHash> @@ -218,6 +219,30 @@ void NodeInstanceView::handleCrash() emitCustomNotification(QStringLiteral("puppet crashed")); } +void NodeInstanceView::startPuppetTransaction() +{ + /* We assume no transaction is active. */ + QTC_ASSERT(!m_puppetTransaction.isValid(), return); + m_puppetTransaction = beginRewriterTransaction("NodeInstanceView::PuppetTransaction"); +} + +void NodeInstanceView::endPuppetTransaction() +{ + /* We assume a transaction is active. */ + QTC_ASSERT(m_puppetTransaction.isValid(), return); + + /* Committing a transaction should not throw, but if there is + * an issue with rewriting we should show an error message, instead + * of simply crashing. + */ + + try { + m_puppetTransaction.commit(); + } catch (Exception &e) { + e.showException(); + } +} + void NodeInstanceView::restartProcess() { if (rootNodeInstance().isValid()) @@ -1195,11 +1220,20 @@ void NodeInstanceView::valuesModified(const ValuesModifiedCommand &command) if (!model()) return; + if (command.transactionOption == ValuesModifiedCommand::TransactionOption::Start) + startPuppetTransaction(); + else if (command.transactionOption == ValuesModifiedCommand::TransactionOption::End) + endPuppetTransaction(); + for (const PropertyValueContainer &container : command.valueChanges()) { if (hasInstanceForId(container.instanceId())) { NodeInstance instance = instanceForId(container.instanceId()); - if (instance.isValid()) - instance.modelNode().variantProperty(container.name()).setValue(container.value()); + if (instance.isValid()) { + ModelNode node = instance.modelNode(); + VariantProperty property = instance.modelNode().variantProperty(container.name()); + if (property.value() != container.value()) + property.setValue(container.value()); + } } } } |