diff --git a/src/plugins/qmldesigner/qmltools/qmlstate.cpp b/src/plugins/qmldesigner/qmltools/qmlstate.cpp index ad8b17e2c1e..32648830c17 100644 --- a/src/plugins/qmldesigner/qmltools/qmlstate.cpp +++ b/src/plugins/qmldesigner/qmltools/qmlstate.cpp @@ -15,17 +15,17 @@ namespace QmlDesigner { -QmlModelState::QmlModelState() -{ -} +static auto category = ModelTracing::category; -QmlModelState::QmlModelState(const ModelNode &modelNode) - : QmlModelNodeFacade(modelNode) +QmlPropertyChanges QmlModelState::propertyChanges(const ModelNode &node, SL sl) { -} + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state property changes", + category(), + keyValue("model node", *this), + keyValue("node", node), + keyValue("caller location", sl)}; -QmlPropertyChanges QmlModelState::propertyChanges(const ModelNode &node) -{ if (isValid() && !isBaseState()) { addChangeSetIfNotExists(node); @@ -42,8 +42,15 @@ QmlPropertyChanges QmlModelState::propertyChanges(const ModelNode &node) return QmlPropertyChanges(); //not found } -QList QmlModelState::stateOperations(const ModelNode &node) const +QList QmlModelState::stateOperations(const ModelNode &node, SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state state operations", + category(), + keyValue("model node", *this), + keyValue("node", node), + keyValue("caller location", sl)}; + QList returnList; if (!isBaseState() && modelNode().hasNodeListProperty("changes")) { @@ -61,8 +68,14 @@ QList QmlModelState::stateOperations(const ModelNode &no return returnList; //not found } -QList QmlModelState::propertyChanges() const +QList QmlModelState::propertyChanges(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state property changes", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + QList returnList; if (!isBaseState() && modelNode().hasNodeListProperty("changes")) { @@ -77,9 +90,15 @@ QList QmlModelState::propertyChanges() const return returnList; } - -bool QmlModelState::hasPropertyChanges(const ModelNode &node) const +bool QmlModelState::hasPropertyChanges(const ModelNode &node, SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state has property changes", + category(), + keyValue("model node", *this), + keyValue("node", node), + keyValue("caller location", sl)}; + if (!isBaseState() && modelNode().hasNodeListProperty("changes")) { const QList changes = propertyChanges(); for (const QmlPropertyChanges &changeSet : changes) { @@ -91,8 +110,15 @@ bool QmlModelState::hasPropertyChanges(const ModelNode &node) const return false; } -bool QmlModelState::hasStateOperation(const ModelNode &node) const +bool QmlModelState::hasStateOperation(const ModelNode &node, SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state has state operation", + category(), + keyValue("model node", *this), + keyValue("node", node), + keyValue("caller location", sl)}; + if (!isBaseState()) { const QList operations = stateOperations(); for (const QmlModelStateOperation &stateOperation : operations) { @@ -103,8 +129,14 @@ bool QmlModelState::hasStateOperation(const ModelNode &node) const return false; } -QList QmlModelState::stateOperations() const +QList QmlModelState::stateOperations(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state state operations", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + //### exception if not valid QList returnList; @@ -120,8 +152,14 @@ QList QmlModelState::stateOperations() const return returnList; } -QList QmlModelState::allInvalidStateOperations() const +QList QmlModelState::allInvalidStateOperations(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state all invalid state operations", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + return Utils::filtered(stateOperations(), [](const QmlModelStateOperation &operation) { return !operation.target().isValid(); }); @@ -159,9 +197,14 @@ void QmlModelState::addChangeSetIfNotExists(const ModelNode &node) } } -void QmlModelState::removePropertyChanges(const ModelNode &node) +void QmlModelState::removePropertyChanges(const ModelNode &node, SL sl) { - //### exception if not valid + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state remove property changes", + category(), + keyValue("model node", *this), + keyValue("node", node), + keyValue("caller location", sl)}; if (!isValid()) return; @@ -178,8 +221,15 @@ void QmlModelState::removePropertyChanges(const ModelNode &node) /*! Returns \c true if this state affects \a node. */ -bool QmlModelState::affectsModelNode(const ModelNode &node) const +bool QmlModelState::affectsModelNode(const ModelNode &node, SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state affects model node", + category(), + keyValue("model node", *this), + keyValue("node", node), + keyValue("caller location", sl)}; + if (!isValid()) return false; @@ -189,8 +239,14 @@ bool QmlModelState::affectsModelNode(const ModelNode &node) const return !stateOperations(node).isEmpty(); } -QList QmlModelState::allAffectedNodes() const +QList QmlModelState::allAffectedNodes(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state all affected nodes", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + QList returnList; const QList nodes = modelNode().nodeListProperty("changes").toModelNodeList(); @@ -203,27 +259,46 @@ QList QmlModelState::allAffectedNodes() const return returnList; } -QString QmlModelState::name() const +QString QmlModelState::name(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state name", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (isBaseState()) return QString(); return modelNode().variantProperty("name").value().toString(); } -void QmlModelState::setName(const QString &name) +void QmlModelState::setName(const QString &name, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state set name", + category(), + keyValue("model node", *this), + keyValue("name", name), + keyValue("caller location", sl)}; + if ((!isBaseState()) && (modelNode().isValid())) modelNode().variantProperty("name").setValue(name); } -bool QmlModelState::isValid() const +bool QmlModelState::isValid(SL sl) const { - return isValidQmlModelState(modelNode()); + return isValidQmlModelState(modelNode(), sl); } -bool QmlModelState::isValidQmlModelState(const ModelNode &modelNode) +bool QmlModelState::isValidQmlModelState(const ModelNode &modelNode, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"is valid qml model state", + category(), + keyValue("model node", modelNode), + keyValue("caller location", sl)}; + return isValidQmlModelNodeFacade(modelNode) && (modelNode.metaInfo().isQtQuickState() || isBaseState(modelNode)); } @@ -231,9 +306,14 @@ bool QmlModelState::isValidQmlModelState(const ModelNode &modelNode) /** Removes state node & all subnodes. */ -void QmlModelState::destroy() +void QmlModelState::destroy(SL sl) { - Q_ASSERT(isValid()); + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state destroy", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + modelNode().destroy(); } @@ -241,18 +321,37 @@ void QmlModelState::destroy() Returns \c true if this state is the base state. */ -bool QmlModelState::isBaseState() const +bool QmlModelState::isBaseState(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state is base state", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + return isBaseState(modelNode()); } -bool QmlModelState::isBaseState(const ModelNode &modelNode) +bool QmlModelState::isBaseState(const ModelNode &modelNode, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"is base state", + category(), + keyValue("model node", modelNode), + keyValue("caller location", sl)}; + return !modelNode.isValid() || modelNode.isRootNode(); } -QmlModelState QmlModelState::duplicate(const QString &name) const +QmlModelState QmlModelState::duplicate(const QString &name, SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state duplicate", + category(), + keyValue("model node", *this), + keyValue("name", name), + keyValue("caller location", sl)}; + if (!isValid()) return {}; @@ -289,15 +388,28 @@ QmlModelState QmlModelState::duplicate(const QString &name) const return newState; } -QmlModelStateGroup QmlModelState::stateGroup() const +QmlModelStateGroup QmlModelState::stateGroup(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state state group", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + QmlObjectNode parentNode(modelNode().parentProperty().parentModelNode()); return parentNode.states(); } -ModelNode QmlModelState::createQmlState(AbstractView *view, const PropertyListType &propertyList) +ModelNode QmlModelState::createQmlState(AbstractView *view, const PropertyListType &propertyList, SL sl) { - QTC_ASSERT(view, return {}); + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state create", + category(), + keyValue("view", view), + keyValue("caller location", sl)}; + + if (!view) + return {}; #ifdef QDS_USE_PROJECTSTORAGE return view->createModelNode("State", propertyList); @@ -312,15 +424,27 @@ ModelNode QmlModelState::createQmlState(AbstractView *view, const PropertyListTy #endif } -void QmlModelState::setAsDefault() +void QmlModelState::setAsDefault(SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state set as default", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if ((!isBaseState()) && (modelNode().isValid())) { stateGroup().modelNode().variantProperty("state").setValue(name()); } } -bool QmlModelState::isDefault() const +bool QmlModelState::isDefault(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state is default", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if ((!isBaseState()) && (modelNode().isValid())) { if (stateGroup().modelNode().hasProperty("state")) { return (stateGroup().modelNode().variantProperty("state").value() == name()); @@ -330,67 +454,123 @@ bool QmlModelState::isDefault() const return false; } -void QmlModelState::setAnnotation(const Annotation &annotation, const QString &id) +void QmlModelState::setAnnotation(const Annotation &annotation, const QString &id, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state set annotation", + category(), + keyValue("model node", *this), + keyValue("id", id), + keyValue("caller location", sl)}; + if (modelNode().isValid()) { modelNode().setCustomId(id); modelNode().setAnnotation(annotation); } } -Annotation QmlModelState::annotation() const +Annotation QmlModelState::annotation(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state annotation", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (modelNode().isValid()) return modelNode().annotation(); return {}; } -QString QmlModelState::annotationName() const +QString QmlModelState::annotationName(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state annotation name", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (modelNode().isValid()) return modelNode().customId(); return {}; } -bool QmlModelState::hasAnnotation() const +bool QmlModelState::hasAnnotation(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state has annotation", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (modelNode().isValid()) return modelNode().hasAnnotation() || modelNode().hasCustomId(); return false; } -void QmlModelState::removeAnnotation() +void QmlModelState::removeAnnotation(SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state remove annotation", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (modelNode().isValid()) { modelNode().removeCustomId(); modelNode().removeAnnotation(); } } -QString QmlModelState::extend() const +QString QmlModelState::extend(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state extend", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (isBaseState()) return QString(); return modelNode().variantProperty("extend").value().toString(); } -void QmlModelState::setExtend(const QString &name) +void QmlModelState::setExtend(const QString &name, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state set extend", + category(), + keyValue("model node", *this), + keyValue("name", name), + keyValue("caller location", sl)}; + if ((!isBaseState()) && (modelNode().isValid())) modelNode().variantProperty("extend").setValue(name); } -bool QmlModelState::hasExtend() const +bool QmlModelState::hasExtend(SL sl) const { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state has extend", + category(), + keyValue("model node", *this), + keyValue("caller location", sl)}; + if (!isBaseState() && modelNode().isValid()) return modelNode().hasVariantProperty("extend"); return false; } -QmlModelState QmlModelState::createBaseState(const AbstractView *view) +QmlModelState QmlModelState::createBaseState(const AbstractView *view, SL sl) { + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"qml model state create base state", + category(), + keyValue("view", view), + keyValue("caller location", sl)}; + QmlModelState qmlModelState(view->rootModelNode()); return qmlModelState; diff --git a/src/plugins/qmldesigner/qmltools/qmlstate.h b/src/plugins/qmldesigner/qmltools/qmlstate.h index 2a153aad17a..8bd5a4eda16 100644 --- a/src/plugins/qmldesigner/qmltools/qmlstate.h +++ b/src/plugins/qmldesigner/qmltools/qmlstate.h @@ -21,56 +21,61 @@ class StatesEditorView; class QMLDESIGNER_EXPORT QmlModelState final : public QmlModelNodeFacade { - friend StatesEditorView; - public: - QmlModelState(); - QmlModelState(const ModelNode &modelNode); + QmlModelState() = default; - QmlPropertyChanges propertyChanges(const ModelNode &node); - QList stateOperations(const ModelNode &node) const; - QList propertyChanges() const; - QList stateOperations() const; - QList allInvalidStateOperations() const; + QmlModelState(const ModelNode &modelNode) + : QmlModelNodeFacade(modelNode) + {} - bool hasPropertyChanges(const ModelNode &node) const; + QmlPropertyChanges propertyChanges(const ModelNode &node, SL sl = {}); + QList stateOperations(const ModelNode &node, SL sl = {}) const; + QList propertyChanges(SL sl = {}) const; + QList stateOperations(SL sl = {}) const; + QList allInvalidStateOperations(SL sl = {}) const; - bool hasStateOperation(const ModelNode &node) const; + bool hasPropertyChanges(const ModelNode &node, SL sl = {}) const; - void removePropertyChanges(const ModelNode &node); + bool hasStateOperation(const ModelNode &node, SL sl = {}) const; - bool affectsModelNode(const ModelNode &node) const; - QList allAffectedNodes() const; - QString name() const; - void setName(const QString &name); - bool isValid() const; + void removePropertyChanges(const ModelNode &node, SL sl = {}); + + bool affectsModelNode(const ModelNode &node, SL sl = {}) const; + QList allAffectedNodes(SL sl = {}) const; + QString name(SL sl = {}) const; + void setName(const QString &name, SL sl = {}); + bool isValid(SL sl = {}) const; explicit operator bool() const { return isValid(); } - static bool isValidQmlModelState(const ModelNode &modelNode); - void destroy(); - bool isBaseState() const; - static bool isBaseState(const ModelNode &modelNode); - QmlModelState duplicate(const QString &name) const; - QmlModelStateGroup stateGroup() const; + static bool isValidQmlModelState(const ModelNode &modelNode, SL sl = {}); + void destroy(SL sl = {}); - static ModelNode createQmlState(AbstractView *view, const PropertyListType &propertyList); + bool isBaseState(SL sl = {}) const; + static bool isBaseState(const ModelNode &modelNode, SL sl = {}); + QmlModelState duplicate(const QString &name, SL sl = {}) const; + QmlModelStateGroup stateGroup(SL sl = {}) const; - void setAsDefault(); - bool isDefault() const; + static ModelNode createQmlState(AbstractView *view, + const PropertyListType &propertyList, + SL sl = {}); - void setAnnotation(const Annotation &annotation, const QString &id); - Annotation annotation() const; - QString annotationName() const; - bool hasAnnotation() const; - void removeAnnotation(); + static QmlModelState createBaseState(const AbstractView *view, SL sl = {}); - QString extend() const; - void setExtend(const QString &name); - bool hasExtend() const; + void setAsDefault(SL sl = {}); + bool isDefault(SL sl = {}) const; -protected: + void setAnnotation(const Annotation &annotation, const QString &id, SL sl = {}); + Annotation annotation(SL sl = {}) const; + QString annotationName(SL sl = {}) const; + bool hasAnnotation(SL sl = {}) const; + void removeAnnotation(SL sl = {}); + + QString extend(SL sl = {}) const; + void setExtend(const QString &name, SL sl = {}); + bool hasExtend(SL sl = {}) const; + +private: void addChangeSetIfNotExists(const ModelNode &node); - static QmlModelState createBaseState(const AbstractView *view); }; } //QmlDesigner