diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 8aefce79403..d3dc95b4e57 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -73,6 +73,10 @@ Edit3DWidget *Edit3DView::edit3DWidget() const void Edit3DView::renderImage3DChanged(const QImage &img) { edit3DWidget()->canvas()->updateRenderImage(img); + + // Notify puppet to resize if received image wasn't correct size + if (img.size() != canvasSize()) + edit3DViewResized(canvasSize()); } void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) @@ -118,6 +122,15 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) m_editLightAction->action()->setChecked(false); } +void Edit3DView::modelAboutToBeDetached(Model *model) +{ + Q_UNUSED(model) + + // Clear the image when model is detached (i.e. changing documents) + QImage emptyImage; + edit3DWidget()->canvas()->updateRenderImage(emptyImage); +} + void Edit3DView::sendInputEvent(QInputEvent *e) const { nodeInstanceView()->sendInputEvent(e); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index bf6519dd7cf..81298791067 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -55,6 +55,7 @@ public: void renderImage3DChanged(const QImage &img) override; void updateActiveScene3D(const QVariantMap &sceneState) override; + void modelAboutToBeDetached(Model *model) override; void sendInputEvent(QInputEvent *e) const; void edit3DViewResized(const QSize &size) const; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index c7bd9d3682c..63b73cbdff9 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -209,7 +209,9 @@ private: // functions ProjectExplorer::Target *m_currentTarget = nullptr; int m_restartProcessTimerId; RewriterTransaction m_puppetTransaction; - QHash m_edit3DToolStates; // Key: instance qml id, value: related tool states + + // key: fileUrl value: (key: instance qml id, value: related tool states) + QHash> m_edit3DToolStates; }; } // namespace ProxyNodeInstanceView diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index d68a2ce7e8a..48b7ac1c025 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -984,7 +984,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() importVector, mockupTypesVector, model()->fileUrl(), - m_edit3DToolStates); + m_edit3DToolStates[model()->fileUrl()]); } ClearSceneCommand NodeInstanceView::createClearSceneCommand() const @@ -1454,7 +1454,7 @@ void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand auto data = qvariant_cast(command.data()); if (data.size() == 3) { QString qmlId = data[0].toString(); - m_edit3DToolStates[qmlId].insert(data[1].toString(), data[2]); + m_edit3DToolStates[model()->fileUrl()][qmlId].insert(data[1].toString(), data[2]); } } } else if (command.type() == PuppetToCreatorCommand::Render3DView) {