From 3c78d4d74d69ab44e49d6c3d854abf12ab2b2d3a Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Wed, 23 Oct 2019 15:40:55 +0300 Subject: [PATCH] Enable object selection in the 3D edit view Clicking an object in the 3D object selection view, selects it in the creator side. Multiselection (i.e. Ctrl+click) is not implemented yet. Also selected object is not highlighted in the view yet. Task-number: QDS-1124 Change-Id: I0b10162539ecedc40ed117896e385975c52b04a9 Reviewed-by: Miikka Heikkinen --- .../qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml | 11 +++++++++++ .../instances/qt5informationnodeinstanceserver.cpp | 9 ++++++++- .../instances/qt5informationnodeinstanceserver.h | 4 ++++ .../designercore/instances/nodeinstanceview.cpp | 2 +- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 73f4846e9cb..f3c7dc3429e 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -42,12 +42,23 @@ Window { property alias showEditLight: editLightCheckbox.checked property alias usePerspective: usePerspectiveCheckbox.checked + signal objectClicked(var object) + Rectangle { id: sceneBg color: "#FFFFFF" anchors.fill: parent focus: true + TapHandler { // check tapping/clicking an object in the scene + onTapped: { + var pickResult = editView.pick(eventPoint.scenePosition.x, + eventPoint.scenePosition.y); + if (pickResult.objectHit) + viewWindow.objectClicked(pickResult.objectHit); + } + } + View3D { id: editView anchors.fill: parent diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index b8aabfffc76..ff4bb7e84dd 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -75,7 +75,7 @@ static QVariant objectToVariant(QObject *object) return QVariant::fromValue(object); } -static QObject *createEditView3D(QQmlEngine *engine) +QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine) { QmlDesigner::Internal::CameraControlHelper *helper = new QmlDesigner::Internal::CameraControlHelper(); engine->rootContext()->setContextProperty("designStudioNativeCameraControlHelper", helper); @@ -89,6 +89,8 @@ static QObject *createEditView3D(QQmlEngine *engine) return nullptr; } + QObject::connect(window, SIGNAL(objectClicked(QVariant)), this, SLOT(objectClicked(QVariant))); + //For macOS we have to use the 4.1 core profile QSurfaceFormat surfaceFormat = window->requestedFormat(); surfaceFormat.setVersion(4, 1); @@ -99,6 +101,11 @@ static QObject *createEditView3D(QQmlEngine *engine) return window; } +void Qt5InformationNodeInstanceServer::objectClicked(const QVariant &object) { + QObject *item = qobject_cast(object.value()); + selectInstance(instanceForObject(item)); +} + Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) : Qt5NodeInstanceServer(nodeInstanceClient) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index 6f05659426e..2e39339583a 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -44,6 +44,9 @@ public: void removeSharedMemory(const RemoveSharedMemoryCommand &command) override; void changeSelection(const ChangeSelectionCommand &command) override; +public slots: + void objectClicked(const QVariant &object); + protected: void collectItemChangesAndSendChangeCommands() override; void sendChildrenChangedCommand(const QList &childList); @@ -54,6 +57,7 @@ protected: void modifyProperties(const QVector &properties); private: + QObject *createEditView3D(QQmlEngine *engine); void setup3DEditView(const QList &instanceList); QObject *findRootNodeOf3DViewport(const QList &instanceList) const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 7200231267a..ed63caec5ac 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -1329,7 +1329,6 @@ void NodeInstanceView::childrenChanged(const ChildrenChangedCommand &command) if (!model()) return; - QVector childNodeVector; foreach (qint32 instanceId, command.childrenInstances()) { @@ -1396,6 +1395,7 @@ void NodeInstanceView::sendToken(const QString &token, int number, const QVector void NodeInstanceView::selectionChanged(const ChangeSelectionCommand &command) { + clearSelectedModelNodes(); foreach (const qint32 &instanceId, command.instanceIds()) { if (hasModelNodeForInternalId(instanceId)) selectModelNode(modelNodeForInternalId(instanceId));