diff options
author | Eike Ziller <eike.ziller@qt.io> | 2022-08-26 08:40:23 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2022-08-26 08:40:23 +0200 |
commit | c6c92ec0961f17e6749f8a9f5a1a71ab56b71906 (patch) | |
tree | 71b8f039d3a5a4388a68dfe43a6fb831e723e967 /share/qtcreator/qml/qmlpuppet/qml2puppet/instances | |
parent | c10f23a5c6c7d54e5a9af2c3b729e5a752dc51b6 (diff) | |
parent | 70343084badaca0ae8a05f2e4c150a893e929275 (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')
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)); |