aboutsummaryrefslogtreecommitdiffstats
path: root/share/qtcreator/qml/qmlpuppet/qml2puppet/instances
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2022-08-26 08:40:23 +0200
committerEike Ziller <eike.ziller@qt.io>2022-08-26 08:40:23 +0200
commitc6c92ec0961f17e6749f8a9f5a1a71ab56b71906 (patch)
tree71b8f039d3a5a4388a68dfe43a6fb831e723e967 /share/qtcreator/qml/qmlpuppet/qml2puppet/instances
parentc10f23a5c6c7d54e5a9af2c3b729e5a752dc51b6 (diff)
parent70343084badaca0ae8a05f2e4c150a893e929275 (diff)
Merge remote-tracking branch 'origin/8.0'
Conflicts: src/libs/qmljs/qmljsmodelmanagerinterface.cpp src/plugins/clangcodemodel/clangdclient.cpp src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp src/plugins/qmldesigner/designercore/include/modelnode.h src/plugins/qmldesigner/designercore/model/modelnode.cpp src/plugins/qmldesigner/designercore/model/rewriterview.cpp Change-Id: I93c57879b79f27325321bfc045ca618bd835af93
Diffstat (limited to 'share/qtcreator/qml/qmlpuppet/qml2puppet/instances')
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp15
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h2
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp20
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.cpp3
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp55
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h1
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp24
7 files changed, 87 insertions, 33 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp
index 21abeb5975..1f85e960ba 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp
@@ -1050,6 +1050,21 @@ ServerNodeInstance NodeInstanceServer::rootNodeInstance() const
return m_rootNodeInstance;
}
+QList<ServerNodeInstance> NodeInstanceServer::allGroupStateInstances() const
+{
+ QList<ServerNodeInstance> groups;
+ std::copy_if(nodeInstances().cbegin(),
+ nodeInstances().cend(),
+ std::back_inserter(groups),
+ [](const ServerNodeInstance &instance) {
+ return instance.isValid() && instance.internalObject()->metaObject()
+ && instance.internalObject()->metaObject()->className()
+ == QByteArrayLiteral("QQuickStateGroup");
+ });
+
+ return groups;
+}
+
void NodeInstanceServer::setStateInstance(const ServerNodeInstance &stateInstance)
{
m_activeStateInstance = stateInstance;
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h
index 42f345ee4e..698c93fc60 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h
@@ -200,6 +200,8 @@ public:
ServerNodeInstance rootNodeInstance() const;
+ QList<ServerNodeInstance> allGroupStateInstances() const;
+
void notifyPropertyChange(qint32 instanceid, const PropertyName &propertyName);
QByteArray importCode() const;
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp
index 429aec1ef8..5dbe9c14dd 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp
@@ -46,6 +46,10 @@
#include <QLibraryInfo>
#include <QJSValue>
+#include <private/qquickstategroup_p.h>
+
+#include <qquickitem.h>
+
static bool isSimpleExpression(const QString &expression)
{
if (expression.startsWith(QStringLiteral("{")))
@@ -456,6 +460,10 @@ QVariant ObjectNodeInstance::convertEnumToValue(const QVariant &value, const Pro
void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVariant &value)
{
+ if (name == "state" && object() && object()->metaObject()
+ && object()->metaObject()->className() == QByteArrayLiteral("QQuickStateGroup"))
+ return;
+
if (ignoredProperties().contains(name))
return;
@@ -652,8 +660,18 @@ QList<QQuickItem *> ObjectNodeInstance::allItemsRecursive() const
return QList<QQuickItem *>();
}
-QList<ServerNodeInstance> ObjectNodeInstance::stateInstances() const
+QList<ServerNodeInstance> ObjectNodeInstance::stateInstances() const
{
+ if (auto group = qobject_cast<QQuickStateGroup*>(object())) {
+ QList<ServerNodeInstance> instanceList;
+ const QList<QQuickState *> stateList = group->states();
+ for (QQuickState *state : stateList) {
+ if (state && nodeInstanceServer()->hasInstanceForObject(state))
+ instanceList.append(nodeInstanceServer()->instanceForObject(state));
+ }
+ return instanceList;
+ }
+
return QList<ServerNodeInstance>();
}
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.cpp
index 563b3a4702..4e86f0737b 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.cpp
@@ -87,8 +87,7 @@ void QmlStateNodeInstance::deactivateState()
void QmlStateNodeInstance::setPropertyVariant(const PropertyName &name, const QVariant &value)
{
- bool isStateOfTheRootModelNode = parentInstance() && parentInstance()->isRootNodeInstance();
- if (name == "when" && (isStateOfTheRootModelNode))
+ if (name == "when")
return;
ObjectNodeInstance::setPropertyVariant(name, value);
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
index 13e7063e29..cbf4db82a4 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
@@ -285,12 +285,16 @@ void Qt5InformationNodeInstanceServer::handleInputEvents()
continue;
}
}
- auto me = new QMouseEvent(command.type(), command.pos(), command.button(),
- command.buttons(), command.modifiers());
+ QMouseEvent me(command.type(), command.pos(), command.button(), command.buttons(),
+ command.modifiers());
// We must use sendEvent in Qt 6, as using postEvent allows the associated position
// data stored internally in QMutableEventPoint to potentially be updated by system
// before the event is delivered.
- QGuiApplication::sendEvent(m_editView3DData.window, me);
+ QGuiApplication::sendEvent(m_editView3DData.window, &me);
+
+ // Context menu requested
+ if (command.button() == Qt::RightButton && command.modifiers() == Qt::NoModifier)
+ getModelAtPos(command.pos());
}
}
@@ -405,6 +409,30 @@ void Qt5InformationNodeInstanceServer::removeRotationBlocks(
#endif
}
+void Qt5InformationNodeInstanceServer::getModelAtPos(const QPointF &pos)
+{
+#ifdef QUICK3D_MODULE
+ // pick a Quick3DModel at view position
+ auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
+ if (!helper)
+ return;
+
+ QQmlProperty editViewProp(m_editView3DData.rootItem, "editView", context());
+ QObject *obj = qvariant_cast<QObject *>(editViewProp.read());
+ QQuick3DViewport *editView = qobject_cast<QQuick3DViewport *>(obj);
+
+ QQuick3DModel *hitModel = helper->pickViewAt(editView, pos.x(), pos.y()).objectHit();
+
+ // filter out picks of models created dynamically or inside components
+ QQuick3DModel *resolvedPick = qobject_cast<QQuick3DModel *>(helper->resolvePick(hitModel));
+
+ QVariant instance = resolvedPick ? instanceForObject(resolvedPick).instanceId() : -1;
+ nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::ModelAtPos, instance});
+#else
+ Q_UNUSED(pos)
+#endif
+}
+
void Qt5InformationNodeInstanceServer::createEditView3D()
{
#ifdef QUICK3D_MODULE
@@ -2383,26 +2411,7 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
#endif
#ifdef QUICK3D_MODULE
case View3DActionCommand::GetModelAtPos: {
- // pick a Quick3DModel at view position
- auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
- if (!helper)
- return;
-
- QQmlProperty editViewProp(m_editView3DData.rootItem, "editView", context());
- QObject *obj = qvariant_cast<QObject *>(editViewProp.read());
- QQuick3DViewport *editView = qobject_cast<QQuick3DViewport *>(obj);
-
- QPointF pos = command.value().toPointF();
- QQuick3DModel *hitModel = helper->pickViewAt(editView, pos.x(), pos.y()).objectHit();
-
- // filter out picks of models created dynamically or inside components
- QQuick3DModel *resolvedPick = qobject_cast<QQuick3DModel *>(helper->resolvePick(hitModel));
-
- if (resolvedPick) {
- ServerNodeInstance instance = instanceForObject(resolvedPick);
- nodeInstanceClient()->handlePuppetToCreatorCommand(
- {PuppetToCreatorCommand::ModelAtPos, QVariant(instance.instanceId())});
- }
+ getModelAtPos(command.value().toPointF());
return;
}
#endif
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
index ea104442a6..87c1d53d54 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
@@ -148,6 +148,7 @@ private:
void updateMaterialPreviewData(const QVector<PropertyValueContainer> &valueChanges);
void updateRotationBlocks(const QVector<PropertyValueContainer> &valueChanges);
void removeRotationBlocks(const QVector<qint32> &instanceIds);
+ void getModelAtPos(const QPointF &pos);
void createAuxiliaryQuickView(const QUrl &url, RenderViewData &viewData);
#ifdef QUICK3D_PARTICLES_MODULE
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp
index e2889350f1..83c18c8486 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp
@@ -77,13 +77,23 @@ void Qt5PreviewNodeInstanceServer::collectItemChangesAndSendChangeCommands()
QVector<ImageContainer> imageContainerVector;
imageContainerVector.append(ImageContainer(0, renderPreviewImage(), -1));
- foreach (ServerNodeInstance instance, rootNodeInstance().stateInstances()) {
- instance.activateState();
- QImage previewImage = renderPreviewImage();
- if (!previewImage.isNull())
- imageContainerVector.append(ImageContainer(instance.instanceId(), renderPreviewImage(), instance.instanceId()));
- instance.deactivateState();
- }
+ QList<ServerNodeInstance> stateInstances = rootNodeInstance().stateInstances();
+
+ const QList<ServerNodeInstance> groupInstances = allGroupStateInstances();
+
+ for (ServerNodeInstance instance : groupInstances) {
+ stateInstances.append(instance.stateInstances());
+ }
+
+ for (ServerNodeInstance instance : qAsConst(stateInstances)) {
+ instance.activateState();
+ QImage previewImage = renderPreviewImage();
+ if (!previewImage.isNull())
+ imageContainerVector.append(ImageContainer(instance.instanceId(),
+ renderPreviewImage(),
+ instance.instanceId()));
+ instance.deactivateState();
+ }
nodeInstanceClient()->statePreviewImagesChanged(
StatePreviewImageChangedCommand(imageContainerVector));