From 55b3d53213d7f7c0e5eefdfa8e94badd41c32d4c Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Wed, 26 Feb 2020 15:03:02 +0200 Subject: [PATCH] Handle the case when there is no 3D Nodes in the qml doc When there is no 3D node in the qml doc, the view 3D will still be enabled and manipulate-able. Also few relevant tweaks. Task-number: QDS-1693 Change-Id: I758f783108b317a6971703bee8e3fb564400ed8b Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/mockfiles/EditView3D.qml | 43 ++++++----- .../qt5informationnodeinstanceserver.cpp | 74 ++++++++++--------- .../components/edit3d/edit3dcanvas.cpp | 4 +- .../components/edit3d/edit3dcanvas.h | 2 +- .../designercore/include/qmlvisualnode.h | 4 +- .../instances/nodeinstanceview.cpp | 2 +- .../designercore/model/qmlvisualnode.cpp | 18 ++--- 7 files changed, 78 insertions(+), 69 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 9ee23e48a4e..d60ee38c4a7 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -62,33 +62,42 @@ Item { onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective) onShowEditLightChanged: _generalHelper.storeToolState(sceneId,"showEditLight", showEditLight) onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation) + onActiveSceneChanged: updateActiveScene(); - onActiveSceneChanged: { + function updateActiveScene() + { if (editView) { // Destroy is async, so make sure we don't get any more updates for the old editView _generalHelper.enableItemUpdate(editView, false); editView.destroy(); } - if (activeScene) { - // importScene cannot be updated after initial set, so we need to reconstruct entire View3D - var component = Qt.createComponent("SceneView3D.qml"); - if (component.status === Component.Ready) { - editView = component.createObject(viewRect, - {"usePerspective": usePerspective, - "showSceneLight": showEditLight, - "importScene": activeScene, - "cameraZoomFactor": cameraControl._zoomFactor, - "z": 1}); - editView.usePerspective = Qt.binding(function() {return usePerspective;}); - editView.showSceneLight = Qt.binding(function() {return showEditLight;}); - editView.cameraZoomFactor = Qt.binding(function() {return cameraControl._zoomFactor;}); - selectionBoxes.length = 0; - updateToolStates(_generalHelper.getToolStates(sceneId), true); - } + // importScene cannot be updated after initial set, so we need to reconstruct entire View3D + var component = Qt.createComponent("SceneView3D.qml"); + if (component.status === Component.Ready) { + editView = component.createObject(viewRect, + {"usePerspective": usePerspective, + "showSceneLight": showEditLight, + "importScene": activeScene, + "cameraZoomFactor": cameraControl._zoomFactor, + "z": 1}); + editView.usePerspective = Qt.binding(function() {return usePerspective;}); + editView.showSceneLight = Qt.binding(function() {return showEditLight;}); + editView.cameraZoomFactor = Qt.binding(function() {return cameraControl._zoomFactor;}); + + selectionBoxes.length = 0; + updateToolStates(_generalHelper.getToolStates(sceneId), true); } } + function clearActiveScene() + { + activeScene = null; + sceneId = ""; + + updateActiveScene(); + } + // Disables edit view update if scene doesn't match current activeScene. // If it matches, updates are enabled. function enableEditViewUpdate(scene) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 3b8cb04a909..b525da8248b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -420,14 +420,22 @@ void Qt5InformationNodeInstanceServer::updateActiveSceneToEditView3D() sceneIdVar = QVariant::fromValue(sceneId); sceneIdProperty.write(sceneIdVar); - QQmlProperty sceneProperty(m_editView3DRootItem, "activeScene", context()); - sceneProperty.write(activeSceneVar); - - auto helper = qobject_cast(m_3dHelper); QVariantMap toolStates; - if (helper) - toolStates = helper->getToolStates(sceneId); - toolStates.insert("sceneInstanceId", QVariant::fromValue(sceneInstance.instanceId())); + + // if m_active3DScene is null, QQmlProperty::write() doesn't work so invoke the updateActiveScene + // qml method directly + if (!m_active3DScene) { + QMetaObject::invokeMethod(m_editView3DRootItem, "clearActiveScene", Qt::QueuedConnection); + toolStates.insert("sceneInstanceId", QVariant::fromValue(-1)); + } else { + QQmlProperty sceneProperty(m_editView3DRootItem, "activeScene", context()); + sceneProperty.write(activeSceneVar); + + auto helper = qobject_cast(m_3dHelper); + if (helper) + toolStates = helper->getToolStates(sceneId); + toolStates.insert("sceneInstanceId", QVariant::fromValue(sceneInstance.instanceId())); + } nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::ActiveSceneChanged, toolStates}); @@ -514,7 +522,6 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView() { static bool showEditView = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW"); if (m_editView3DRootItem && !showEditView) { - auto t = std::chrono::steady_clock::now(); if (!m_editView3DContentItem) { m_editView3DContentItem = QQmlProperty::read(m_editView3DRootItem, "contentItem").value(); if (m_editView3DContentItem) { @@ -544,10 +551,6 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView() // send the rendered image to creator process nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::Render3DView, QVariant::fromValue(imgContainer)}); - qDebug() << "\x1b[42m \x1b[1m" << __FUNCTION__ - << ", t=" << std::chrono::duration_cast(std::chrono::steady_clock::now()-t).count() - << "\x1b[m"; - if (m_needRender) { m_renderTimer.start(0); m_needRender = false; @@ -880,32 +883,31 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList(m_3dHelper); - if (helper) { - auto it = toolStates.constBegin(); - while (it != toolStates.constEnd()) { - helper->initToolStates(it.key(), it.value()); - ++it; - } - helper->restoreWindowState(); - if (toolStates.contains(helper->globalStateId()) - && toolStates[helper->globalStateId()].contains("rootSize")) { - m_editView3DRootItem->setSize(toolStates[helper->globalStateId()]["rootSize"].value()); - } - } - - updateActiveSceneToEditView3D(); - - createCameraAndLightGizmos(instanceList); + createEditView3D(); + if (!m_editView3DRootItem) { + m_active3DScene = nullptr; + m_active3DView = nullptr; + return; } + + auto helper = qobject_cast(m_3dHelper); + if (helper) { + auto it = toolStates.constBegin(); + while (it != toolStates.constEnd()) { + helper->initToolStates(it.key(), it.value()); + ++it; + } + helper->restoreWindowState(); + if (toolStates.contains(helper->globalStateId()) + && toolStates[helper->globalStateId()].contains("rootSize")) { + m_editView3DRootItem->setSize(toolStates[helper->globalStateId()]["rootSize"].value()); + } + } + + updateActiveSceneToEditView3D(); + + createCameraAndLightGizmos(instanceList); #else Q_UNUSED(instanceList) Q_UNUSED(toolStates) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp index 8a1c049907b..37c80246a51 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp @@ -117,9 +117,7 @@ void Edit3DCanvas::dropEvent(QDropEvent *e) { Q_UNUSED(e) - QmlVisualNode::createQmlVisualNode(m_parent->view(), m_itemLibraryEntry, m_activeScene, {}); + QmlVisualNode::createQml3DNode(m_parent->view(), m_itemLibraryEntry, m_activeScene); } } - - diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h index 48b05789476..2243a466dd4 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h @@ -59,7 +59,7 @@ protected: private: QPointer m_parent; QImage m_image; - qint32 m_activeScene; + qint32 m_activeScene = -1; ItemLibraryEntry m_itemLibraryEntry; }; diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index e573ec1bc99..d2169b52ff7 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -102,9 +102,9 @@ public: const Position &position, NodeAbstractProperty parentproperty); - static QmlVisualNode createQmlVisualNode(AbstractView *view, + static QmlVisualNode createQml3DNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, - qint32 sceneRootId, const QVector3D &position); + qint32 sceneRootId = -1, const QVector3D &position = {}); static NodeListProperty findSceneNodeProperty(AbstractView *view, qint32 sceneRootId); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index e361b742058..66572534261 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -1452,7 +1452,7 @@ void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &comm QDataStream stream(command.itemData()); ItemLibraryEntry itemLibraryEntry; stream >> itemLibraryEntry; - QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, command.sceneRootId(), {}); + QmlVisualNode::createQml3DNode(this, itemLibraryEntry, command.sceneRootId(), {}); } void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index ada504908f9..16caa385e67 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -294,15 +294,16 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, return newQmlObjectNode; } -QmlVisualNode QmlVisualNode::createQmlVisualNode(AbstractView *view, - const ItemLibraryEntry &itemLibraryEntry, - qint32 sceneRootId, const QVector3D &position) +QmlVisualNode QmlVisualNode::createQml3DNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + qint32 sceneRootId, const QVector3D &position) { - NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view, sceneRootId); - QTC_ASSERT(sceneNodeProperty.isValid(), return {}); - ModelNode node = createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode(); + NodeAbstractProperty sceneNodeProperty = sceneRootId != -1 ? findSceneNodeProperty(view, sceneRootId) + : view->rootModelNode().defaultNodeAbstractProperty(); - return node; + QTC_ASSERT(sceneNodeProperty.isValid(), return {}); + + return createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode(); } NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 sceneRootId) @@ -318,8 +319,7 @@ NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 bool QmlVisualNode::isFlowTransition(const ModelNode &node) { - return node.metaInfo().isValid() - && node.metaInfo().isSubclassOf("FlowView.FlowTransition"); + return node.metaInfo().isValid() && node.metaInfo().isSubclassOf("FlowView.FlowTransition"); } bool QmlVisualNode::isFlowTransition() const