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