From d68f942242e3a5fe028dfe603828c9c01acacdc5 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Sat, 24 May 2025 11:13:47 +0200 Subject: [PATCH] QmlDesigner: Add change set tracing Change-Id: Id46b8986eadf3ff94c9b83a5f0a7b5154e133d0e Reviewed-by: Thomas Hartmann --- .../qmldesigner/qmltools/qmlchangeset.cpp | 94 ++++++++++++++++--- .../qmldesigner/qmltools/qmlchangeset.h | 44 +++++---- 2 files changed, 108 insertions(+), 30 deletions(-) diff --git a/src/plugins/qmldesigner/qmltools/qmlchangeset.cpp b/src/plugins/qmldesigner/qmltools/qmlchangeset.cpp index e77656b9672..9bec6f5cc06 100644 --- a/src/plugins/qmldesigner/qmltools/qmlchangeset.cpp +++ b/src/plugins/qmldesigner/qmltools/qmlchangeset.cpp @@ -11,75 +11,141 @@ namespace QmlDesigner { -ModelNode QmlModelStateOperation::target() const +static auto category = ModelTracing::category; + +ModelNode QmlModelStateOperation::target(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state operation target", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (modelNode().property("target").isBindingProperty()) return modelNode().bindingProperty("target").resolveToModelNode(); else return ModelNode(); //exception? } -void QmlModelStateOperation::setTarget(const ModelNode &target) +void QmlModelStateOperation::setTarget(const ModelNode &target, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state operation set target", + category(), + keyValue("model node", *this), + keyValue("target", target), + keyValue("caller location", sl)}; + modelNode().bindingProperty("target").setExpression(target.id()); } -bool QmlModelStateOperation::explicitValue() const +bool QmlModelStateOperation::explicitValue(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state operation explicit value", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (modelNode().property("explicit").isVariantProperty()) return modelNode().variantProperty("explicit").value().toBool(); return false; } -void QmlModelStateOperation::setExplicitValue(bool value) +void QmlModelStateOperation::setExplicitValue(bool value, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state operation set explicit value", + category(), + keyValue("model node", *this), + keyValue("value", value), + keyValue("caller location", sl)}; + modelNode().variantProperty("explicit").setValue(value); } -bool QmlModelStateOperation::restoreEntryValues() const +bool QmlModelStateOperation::restoreEntryValues(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state operation restore entry values", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (modelNode().property("restoreEntryValues").isVariantProperty()) return modelNode().variantProperty("restoreEntryValues").value().toBool(); return false; } -void QmlModelStateOperation::setRestoreEntryValues(bool value) +void QmlModelStateOperation::setRestoreEntryValues(bool value, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state operation set restore entry values", + category(), + keyValue("model node", *this), + keyValue("value", value), + keyValue("caller location", sl)}; + modelNode().variantProperty("restoreEntryValues").setValue(value); } -QList QmlModelStateOperation::targetProperties() const +QList QmlModelStateOperation::targetProperties(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state operation target properties", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + return Utils::filtered(modelNode().properties(), [](const AbstractProperty &property) { const QList ignore = {"target", "explicit", "restoreEntryValues"}; return !ignore.contains(property.name()); }); } -bool QmlPropertyChanges::isValid() const +bool QmlPropertyChanges::isValid(SL sl) const { - return isValidQmlPropertyChanges(modelNode()); + return isValidQmlPropertyChanges(modelNode(), sl); } -bool QmlPropertyChanges::isValidQmlPropertyChanges(const ModelNode &modelNode) +bool QmlPropertyChanges::isValidQmlPropertyChanges(const ModelNode &modelNode, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"is valid qml property changes", + category(), + keyValue("model node", modelNode), + keyValue("caller location", sl)}; + return isValidQmlModelNodeFacade(modelNode) && modelNode.metaInfo().isQtQuickPropertyChanges(); } -bool QmlModelStateOperation::isValid() const +bool QmlModelStateOperation::isValid(SL sl) const { - return isValidQmlModelStateOperation(modelNode()); + return isValidQmlModelStateOperation(modelNode(), sl); } -bool QmlModelStateOperation::isValidQmlModelStateOperation(const ModelNode &modelNode) +bool QmlModelStateOperation::isValidQmlModelStateOperation(const ModelNode &modelNode, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"is valid qml model state operation", + category(), + keyValue("model node", modelNode), + keyValue("caller location", sl)}; + return isValidQmlModelNodeFacade(modelNode) && modelNode.metaInfo().isQtQuickStateOperation(); } -void QmlPropertyChanges::removeProperty(PropertyNameView name) +void QmlPropertyChanges::removeProperty(PropertyNameView name, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml property changes remove property", + category(), + keyValue("model node", *this), + keyValue("property name", name), + keyValue("caller location", sl)}; + RewriterTransaction transaction(view()->beginRewriterTransaction(QByteArrayLiteral("QmlPropertyChanges::removeProperty"))); if (name == "name") return; diff --git a/src/plugins/qmldesigner/qmltools/qmlchangeset.h b/src/plugins/qmldesigner/qmltools/qmlchangeset.h index 6c796e0b0cc..f89c2e111a0 100644 --- a/src/plugins/qmldesigner/qmltools/qmlchangeset.h +++ b/src/plugins/qmldesigner/qmltools/qmlchangeset.h @@ -11,29 +11,41 @@ namespace QmlDesigner { class QMLDESIGNER_EXPORT QmlModelStateOperation : public QmlModelNodeFacade { public: - QmlModelStateOperation() : QmlModelNodeFacade() {} - QmlModelStateOperation(const ModelNode &modelNode) : QmlModelNodeFacade(modelNode) {} - ModelNode target() const; - void setTarget(const ModelNode &target); - bool explicitValue() const; - void setExplicitValue(bool value); - bool restoreEntryValues() const; - void setRestoreEntryValues(bool value); - QList targetProperties() const; - bool isValid() const; + QmlModelStateOperation() : QmlModelNodeFacade() + {} + + QmlModelStateOperation(const ModelNode &modelNode) + : QmlModelNodeFacade(modelNode) + {} + + ModelNode target(SL sl = {}) const; + void setTarget(const ModelNode &target, SL sl = {}); + bool explicitValue(SL sl = {}) const; + void setExplicitValue(bool value, SL sl = {}); + bool restoreEntryValues(SL sl = {}) const; + void setRestoreEntryValues(bool value, SL sl = {}); + QList targetProperties(SL sl = {}) const; + bool isValid(SL sl = {}) const; explicit operator bool() const { return isValid(); } - static bool isValidQmlModelStateOperation(const ModelNode &modelNode); + + static bool isValidQmlModelStateOperation(const ModelNode &modelNode, SL sl = {}); }; class QMLDESIGNER_EXPORT QmlPropertyChanges : public QmlModelStateOperation { public: - QmlPropertyChanges() : QmlModelStateOperation() {} - QmlPropertyChanges(const ModelNode &modelNode) : QmlModelStateOperation(modelNode) {} - bool isValid() const; + QmlPropertyChanges() : QmlModelStateOperation() + {} + + QmlPropertyChanges(const ModelNode &modelNode) + : QmlModelStateOperation(modelNode) + {} + + bool isValid(SL sl = {}) const; explicit operator bool() const { return isValid(); } - static bool isValidQmlPropertyChanges(const ModelNode &modelNode); - void removeProperty(PropertyNameView name); + + static bool isValidQmlPropertyChanges(const ModelNode &modelNode, SL sl = {}); + void removeProperty(PropertyNameView name, SL sl = {}); }; } //QmlDesigner