From 3caafb2b8194ab28c5ee9f9772abd6233aa3845d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 21 Apr 2020 08:06:43 +0200 Subject: QmlDesigner: Inspect components for existing states For each created items we retrieve a list of the names of all existing states. Task-number: QDS-1978 Change-Id: I8e85e439fce3c6204cb8bcf69f6be847cc8dae5c Reviewed-by: Tim Jenssen --- share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h | 1 + .../qml2puppet/instances/nodeinstanceserver.cpp | 1 + .../qml2puppet/instances/objectnodeinstance.cpp | 5 +++++ .../qmlpuppet/qml2puppet/instances/objectnodeinstance.h | 1 + .../qml2puppet/instances/quickitemnodeinstance.cpp | 14 ++++++++++++++ .../qml2puppet/instances/quickitemnodeinstance.h | 1 + .../qml2puppet/instances/servernodeinstance.cpp | 8 ++++++++ .../qmlpuppet/qml2puppet/instances/servernodeinstance.h | 1 + .../qmldesigner/designercore/include/nodeinstance.h | 2 ++ .../qmldesigner/designercore/instances/nodeinstance.cpp | 16 ++++++++++++++++ 10 files changed, 50 insertions(+) diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h b/share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h index eb1bd41051..b5cf157a8c 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h @@ -34,6 +34,7 @@ enum InformationName { NoName, NoInformationChange = NoName, + AllStates, Size, BoundingRect, Transform, diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index cfdc513c1b..813057e10b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1061,6 +1061,7 @@ static QVector createInformationVector(const QList QuickItemNodeInstance::allItemsRecursive() const return itemList; } +QStringList QuickItemNodeInstance::allStates() const +{ + QStringList list; + + QList stateList = DesignerSupport::statesForItem(quickItem()); + for (QObject *state : stateList) { + QQmlProperty property(state, "name"); + if (property.isValid()) + list.append(property.read().toString()); + } + + return list; +} + QRectF QuickItemNodeInstance::contentItemBoundingBox() const { if (contentItem()) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h index 8aab24178b..f42e45a8ff 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h @@ -96,6 +96,7 @@ public: void doComponentComplete() override; QList allItemsRecursive() const override; + QStringList allStates() const override; protected: explicit QuickItemNodeInstance(QQuickItem*); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index 483cf581c1..0c9f5721a5 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -661,6 +661,14 @@ QList ServerNodeInstance::stateInstances() const return m_nodeInstance->stateInstances(); } +QStringList ServerNodeInstance::allStates() const +{ + if (isValid()) + return m_nodeInstance->allStates(); + + return {}; +} + Internal::ObjectNodeInstance::Pointer ServerNodeInstance::internalInstance() const { return m_nodeInstance; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h index c85ba9a2b8..ceb3b1e5b1 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h @@ -164,6 +164,7 @@ public: QSharedPointer internalInstance() const; QList stateInstances() const; + QStringList allStates() const; static bool isSubclassOf(QObject *object, const QByteArray &superTypeName); diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h index 9595396ae9..56b8141bde 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h @@ -90,6 +90,7 @@ public: bool hasAnchors() const; QString error() const; bool hasError() const; + QStringList allStateNames() const; protected: void setProperty(const PropertyName &name, const QVariant &value); @@ -117,6 +118,7 @@ protected: InformationName setInformationAnchor(const PropertyName &sourceAnchorLine, const PropertyName &targetAnchorLine, qint32 targetInstanceId); InformationName setInformationInstanceTypeForProperty(const PropertyName &property, const TypeName &type); InformationName setInformationHasBindingForProperty(const PropertyName &property, bool hasProperty); + InformationName setAllStates(const QStringList &states); void setParentId(qint32 instanceId); void setRenderPixmap(const QImage &image); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index 15d09e4516..453c1b31a4 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -76,6 +76,7 @@ public: QString errorMessage; QHash > anchors; + QStringList allStates; }; NodeInstance::NodeInstance() = default; @@ -169,6 +170,10 @@ bool NodeInstance::hasError() const return !d->errorMessage.isEmpty(); } +QStringList NodeInstance::allStateNames() const +{ + return d->allStates; +} bool NodeInstance::isValid() const { @@ -592,6 +597,16 @@ InformationName NodeInstance::setInformationHasBindingForProperty(const Property return NoInformationChange; } +InformationName NodeInstance::setAllStates(const QStringList &states) +{ + if (d->allStates != states) { + d->allStates = states; + return AllStates; + } + + return NoInformationChange; +} + InformationName NodeInstance::setInformation(InformationName name, const QVariant &information, const QVariant &secondInformation, const QVariant &thirdInformation) { switch (name) { @@ -614,6 +629,7 @@ InformationName NodeInstance::setInformation(InformationName name, const QVarian case Anchor: return setInformationAnchor(information.toByteArray(), secondInformation.toByteArray(), thirdInformation.value()); case InstanceTypeForProperty: return setInformationInstanceTypeForProperty(information.toByteArray(), secondInformation.toByteArray()); case HasBindingForProperty: return setInformationHasBindingForProperty(information.toByteArray(), secondInformation.toBool()); + case AllStates: return setAllStates(information.toStringList()); case NoName: default: break; } -- cgit v1.2.1