diff options
author | Eike Ziller <eike.ziller@qt.io> | 2021-10-21 09:13:03 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2021-10-21 09:13:03 +0200 |
commit | bb9774de92dd2c8da85c5231ca5646b078cb42a3 (patch) | |
tree | e43470cf6f3a7c965b7dc8a349593dadd03ee65e /share/qtcreator/qml/qmlpuppet/qml2puppet | |
parent | f41bebc843a8b4ab1ab29562ba200b032b5ab5ac (diff) | |
parent | 5377253612801b2f92e0b55e40c3ce0dd2574b09 (diff) |
Merge remote-tracking branch 'origin/6.0'
Conflicts:
cmake/QtCreatorIDEBranding.cmake
qbs/modules/qtc/qtc.qbs
qtcreator_ide_branding.pri
Change-Id: If8baed5564470e550a0ba5c7720915217eec2412
Diffstat (limited to 'share/qtcreator/qml/qmlpuppet/qml2puppet')
9 files changed, 106 insertions, 50 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp index 02e6f2df59..d3a8b4e8f5 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp @@ -267,6 +267,31 @@ void GeneralHelper::delayedPropertySet(QObject *obj, int delay, const QString &p }); } +// Returns the first valid QQuick3DPickResult from view at (posX, PosY). +QQuick3DPickResult GeneralHelper::pickViewAt(QQuick3DViewport *view, float posX, float posY) +{ + if (!view) + return QQuick3DPickResult(); + +#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 1) + // Make sure global picking is on + view->setGlobalPickingEnabled(true); + + // With Qt 6.2+, select first suitable result from all picked objects + auto pickResults = view->pickAll(posX, posY); + for (auto pickResult : pickResults) { + if (isPickable(pickResult.objectHit())) + return pickResult; + } +#else + // With older Qt version we'll just pick the single object + auto pickResult = view->pick(posX, posY); + if (isPickable(pickResult.objectHit())) + return pickResult; +#endif + return QQuick3DPickResult(); +} + QQuick3DNode *GeneralHelper::resolvePick(QQuick3DNode *pickNode) { if (pickNode) { @@ -315,6 +340,10 @@ bool GeneralHelper::isHidden(QQuick3DNode *node) return false; } +bool GeneralHelper::isPickable(QQuick3DNode *node) { + return (node && !isLocked(node) && !isHidden(node) && node->visible()); +} + void GeneralHelper::storeToolState(const QString &sceneId, const QString &tool, const QVariant &state, int delay) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h index 6e888980f8..c22f310edd 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h @@ -35,6 +35,7 @@ #include <QTimer> #include <QVariant> #include <QVector3D> +#include <QtQuick3D/private/qquick3dpickresult_p.h> QT_BEGIN_NAMESPACE class QQuick3DCamera; @@ -74,12 +75,14 @@ public: Q_INVOKABLE bool fuzzyCompare(double a, double b); Q_INVOKABLE void delayedPropertySet(QObject *obj, int delay, const QString &property, const QVariant& value); + Q_INVOKABLE QQuick3DPickResult pickViewAt(QQuick3DViewport *view, float posX, float posY); Q_INVOKABLE QQuick3DNode *resolvePick(QQuick3DNode *pickNode); Q_INVOKABLE void registerGizmoTarget(QQuick3DNode *node); Q_INVOKABLE void unregisterGizmoTarget(QQuick3DNode *node); Q_INVOKABLE bool isLocked(QQuick3DNode *node); Q_INVOKABLE bool isHidden(QQuick3DNode *node); + Q_INVOKABLE bool isPickable(QQuick3DNode *node); Q_INVOKABLE void storeToolState(const QString &sceneId, const QString &tool, const QVariant &state, int delayEmit = 0); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 19e864e638..ee20e5636c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -2047,8 +2047,10 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst // as changes in the node tree (reparenting, adding new nodes) can make the previously set // hide status based on ancestor unreliable. node->setProperty("_edit3dHidden", edit3dHidden); +#if QT_VERSION < QT_VERSION_CHECK(6, 2, 1) if (auto model = qobject_cast<QQuick3DModel *>(node)) model->setPickable(!edit3dHidden); // allow 3D objects to receive mouse clicks +#endif const auto childItems = node->childItems(); for (auto childItem : childItems) { const ServerNodeInstance quick3dInstance = getQuick3DInstanceAndHidden(childItem); @@ -2070,7 +2072,9 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst value = QVariant::fromValue(node); // Specify the actual pick target with dynamic property checkModel->setProperty("_pickTarget", value); +#if QT_VERSION < QT_VERSION_CHECK(6, 2, 1) checkModel->setPickable(!edit3dHidden); +#endif } }; if (auto childNode = qobject_cast<QQuick3DNode *>(childItem)) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index 2e1e03fa63..9f8f5caf52 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -37,7 +37,6 @@ #include <addimportcontainer.h> #include <createscenecommand.h> #include <reparentinstancescommand.h> -#include <removeinstancescommand.h> #include <clearscenecommand.h> #include <QDebug> @@ -194,32 +193,6 @@ QList<QQuickItem*> Qt5NodeInstanceServer::allItems() const return QList<QQuickItem*>(); } -void Qt5NodeInstanceServer::markRepeaterParentDirty(qint32 id) const -{ - if (!hasInstanceForId(id)) - return; - - ServerNodeInstance instance = instanceForId(id); - if (!instance.isValid()) - return; - - ServerNodeInstance parentInstance = instance.parent(); - if (!parentInstance.isValid()) - return; - - // If a Repeater instance was moved/removed, the old parent must be marked dirty to rerender it - const QByteArray type("QQuickRepeater"); - if (ServerNodeInstance::isSubclassOf(instance.internalObject(), type)) - DesignerSupport::addDirty(parentInstance.rootQuickItem(), QQuickDesignerSupport::Content); - - // Repeater's parent must also be dirtied when a child of a repeater was moved/removed. - if (ServerNodeInstance::isSubclassOf(parentInstance.internalObject(), type)) { - ServerNodeInstance parentsParent = parentInstance.parent(); - if (parentsParent.isValid()) - DesignerSupport::addDirty(parentsParent.rootQuickItem(), QQuickDesignerSupport::Content); - } -} - bool Qt5NodeInstanceServer::initRhi(RenderViewData &viewData) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -550,23 +523,8 @@ void Qt5NodeInstanceServer::clearScene(const ClearSceneCommand &command) void Qt5NodeInstanceServer::reparentInstances(const ReparentInstancesCommand &command) { - const QVector<ReparentContainer> &containerVector = command.reparentInstances(); - for (const ReparentContainer &container : containerVector) - markRepeaterParentDirty(container.instanceId()); - NodeInstanceServer::reparentInstances(command.reparentInstances()); startRenderTimer(); } -void Qt5NodeInstanceServer::removeInstances(const RemoveInstancesCommand &command) -{ - const QVector<qint32> &idVector = command.instanceIds(); - for (const qint32 id : idVector) - markRepeaterParentDirty(id); - - NodeInstanceServer::removeInstances(command); - startRenderTimer(); -} - - } // QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h index d93ecad84e..4af451b61a 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h @@ -67,7 +67,6 @@ public: void createScene(const CreateSceneCommand &command) override; void clearScene(const ClearSceneCommand &command) override; void reparentInstances(const ReparentInstancesCommand &command) override; - void removeInstances(const RemoveInstancesCommand &command) override; QImage grabWindow() override; QImage grabItem(QQuickItem *item) override; @@ -80,7 +79,6 @@ protected: void resetAllItems(); void setupScene(const CreateSceneCommand &command) override; QList<QQuickItem*> allItems() const; - void markRepeaterParentDirty(qint32 id) const; struct RenderViewData { QPointer<QQuickWindow> window = nullptr; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp index 1dae931af3..d40d182126 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp @@ -777,6 +777,8 @@ void QuickItemNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParen setMovable(true); } + markRepeaterParentDirty(); + ObjectNodeInstance::reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty); if (!newParentInstance) @@ -841,6 +843,8 @@ void QuickItemNodeInstance::setPropertyVariant(const PropertyName &name, const Q if (name == "layer.enabled" || name == "layer.effect") setAllNodesDirtyRecursive(quickItem()); + markRepeaterParentDirty(); + ObjectNodeInstance::setPropertyVariant(name, value); refresh(); @@ -860,6 +864,8 @@ void QuickItemNodeInstance::setPropertyBinding(const PropertyName &name, const Q if (name.startsWith("anchors.") && isRootNodeInstance()) return; + markRepeaterParentDirty(); + ObjectNodeInstance::setPropertyBinding(name, expression); refresh(); @@ -937,6 +943,8 @@ void QuickItemNodeInstance::resetProperty(const PropertyName &name) resetVertical(); } + markRepeaterParentDirty(); + ObjectNodeInstance::resetProperty(name); if (isInLayoutable()) @@ -1013,6 +1021,35 @@ QQuickItem *QuickItemNodeInstance::quickItem() const return static_cast<QQuickItem*>(object()); } +void QuickItemNodeInstance::markRepeaterParentDirty() const +{ + const qint32 id = instanceId(); + if (id <= 0 && !isValid()) + return; + + QQuickItem *item = quickItem(); + if (!item) + return; + + QQuickItem *parentItem = item->parentItem(); + if (!parentItem) + return; + + // If a Repeater instance was changed in any way, the parent must be marked dirty to rerender it + const QByteArray type("QQuickRepeater"); + if (ServerNodeInstance::isSubclassOf(item, type)) + DesignerSupport::addDirty(parentItem, QQuickDesignerSupport::Content); + + // Repeater's parent must also be dirtied when a child of a repeater was changed + if (ServerNodeInstance::isSubclassOf(parentItem, type)) { + QQuickItem *parentsParent = parentItem->parentItem(); + if (parentsParent) + DesignerSupport::addDirty(parentsParent, QQuickDesignerSupport::Content); + } +} + + + } // namespace Internal } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h index 77d3a3fc6b..46b22b8c9a 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h @@ -130,6 +130,7 @@ protected: double x() const; double y() const; bool checkIfRefFromEffect(qint32 id); + void markRepeaterParentDirty() const; private: //variables QPointer<QQuickItem> m_contentItem; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index 2aa17d9e2b..97b5031260 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -234,6 +234,25 @@ bool isInPathList(const QStringList &pathList, const QString &componentPath) }); } +bool canBeCreatedAsPrimitive(const QStringList &pathList, + const InstanceContainer &instanceContainer, + QQmlContext *context, + QObject *&object) +{ + if (isInPathList(pathList, instanceContainer.componentPath())) { + object = Internal::ObjectNodeInstance::createPrimitive(QString::fromUtf8( + instanceContainer.type()), + instanceContainer.majorNumber(), + instanceContainer.minorNumber(), + context); + + if (object) + return true; + + } + return false; +} + ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceServer, const InstanceContainer &instanceContainer, ComponentWrap componentWrap) @@ -249,8 +268,8 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe if (object == nullptr) nodeInstanceServer->sendDebugOutput(DebugOutputCommand::ErrorType, QLatin1String("Custom parser object could not be created."), instanceContainer.instanceId()); } else if (!instanceContainer.componentPath().isEmpty() - && !isInPathList(nodeInstanceServer->engine()->importPathList(), - instanceContainer.componentPath())) { + && !canBeCreatedAsPrimitive(nodeInstanceServer->engine()->importPathList(), + instanceContainer, nodeInstanceServer->context(), object)) { object = Internal::ObjectNodeInstance::createComponent(instanceContainer.componentPath(), nodeInstanceServer->context()); if (object == nullptr) { object = Internal::ObjectNodeInstance::createPrimitive(QString::fromUtf8(instanceContainer.type()), instanceContainer.majorNumber(), instanceContainer.minorNumber(), nodeInstanceServer->context()); @@ -260,7 +279,7 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe nodeInstanceServer->sendDebugOutput(DebugOutputCommand::ErrorType, message + errors, instanceContainer.instanceId()); } } - } else { + } else if (!object) { object = Internal::ObjectNodeInstance::createPrimitive(QString::fromUtf8(instanceContainer.type()), instanceContainer.majorNumber(), instanceContainer.minorNumber(), nodeInstanceServer->context()); if (object == nullptr) nodeInstanceServer->sendDebugOutput(DebugOutputCommand::ErrorType, QLatin1String("Item could not be created."), instanceContainer.instanceId()); @@ -498,7 +517,7 @@ QDebug operator <<(QDebug debug, const ServerNodeInstance &instance) return debug.space(); } -uint qHash(const ServerNodeInstance &instance) +ServerNodeInstance::QHashValueType qHash(const ServerNodeInstance &instance) { return ::qHash(instance.instanceId()); } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h index 52ead77e12..7fd6453daa 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h @@ -67,6 +67,13 @@ namespace Internal { class ServerNodeInstance { +public: +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +using QHashValueType = uint; +#else +using QHashValueType = size_t; +#endif + friend class NodeInstanceServer; friend class Qt4NodeInstanceServer; friend class Qt4PreviewNodeInstanceServer; @@ -76,7 +83,7 @@ class ServerNodeInstance friend class Qt5CapturePreviewNodeInstanceServer; friend class Qt5TestNodeInstanceServer; friend class QHash<qint32, ServerNodeInstance>; - friend uint qHash(const ServerNodeInstance &instance); + friend QHashValueType qHash(const ServerNodeInstance &instance); friend bool operator==(const ServerNodeInstance &first, const ServerNodeInstance &second); friend QDebug operator<<(QDebug debug, const ServerNodeInstance &instance); friend class NodeMetaInfo; @@ -220,7 +227,7 @@ private: // variables QSharedPointer<Internal::ObjectNodeInstance> m_nodeInstance; }; -uint qHash(const ServerNodeInstance &instance); +ServerNodeInstance::QHashValueType qHash(const ServerNodeInstance &instance); bool operator ==(const ServerNodeInstance &first, const ServerNodeInstance &second); bool operator <(const ServerNodeInstance &first, const ServerNodeInstance &second); QDebug operator <<(QDebug debug, const ServerNodeInstance &instance); |