summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2019-10-25 16:09:51 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2019-10-28 08:57:14 +0000
commitd6b29a89ec980e415cf4c3bdadd32ee850917e05 (patch)
treecf829e4fba27cc999a26b3cabe77039b7e1d6b96 /src/plugins
parent7b2b040f41412c735c67e33d90fdd77cdb7a297f (diff)
downloadqt-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.h3
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp38
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());
+ }
}
}
}