From e40720eda1249fa84a3d2064e8361f65b147f888 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 17 Jun 2024 13:31:29 +0300 Subject: [PATCH] QmlDesigner: Fix crash in 3D import dialog close If preview generation crashes for some reason, the puppet cleanup needs to be done asynchronously instead of directly in the callback function, as callback is triggered from cleaned up instances. Also add an error text to the canvas where the preview should be shown if it can't be generated due to crash. Fixes: QDS-13012 Change-Id: I6196e5b395b056f6b3033ea4da3a0101ef8ea48f Reviewed-by: Mahmoud Badri --- .../components/itemlibrary/import3dcanvas.cpp | 9 +++++++++ .../qmldesigner/components/itemlibrary/import3dcanvas.h | 2 ++ .../itemlibrary/itemlibraryassetimportdialog.cpp | 6 ++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/import3dcanvas.cpp b/src/plugins/qmldesigner/components/itemlibrary/import3dcanvas.cpp index 608bf42eb36..d4480ccdb65 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/import3dcanvas.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/import3dcanvas.cpp @@ -34,6 +34,12 @@ void Import3dCanvas::updateRenderImage(const QImage &img) update(); } +void Import3dCanvas::displayError(const QString &error) +{ + m_errorMsg = error; + update(); +} + void Import3dCanvas::paintEvent([[maybe_unused]] QPaintEvent *e) { QWidget::paintEvent(e); @@ -46,6 +52,9 @@ void Import3dCanvas::paintEvent([[maybe_unused]] QPaintEvent *e) } else { painter.drawImage(rect(), m_image, QRect(0, 0, m_image.width(), m_image.height())); } + + if (!m_errorMsg.isEmpty()) + painter.drawText(QRect(0, 0, width(), height()), Qt::AlignHCenter | Qt::AlignVCenter, m_errorMsg); } void Import3dCanvas::resizeEvent(QResizeEvent *) diff --git a/src/plugins/qmldesigner/components/itemlibrary/import3dcanvas.h b/src/plugins/qmldesigner/components/itemlibrary/import3dcanvas.h index 72fb19acffc..5df000e763a 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/import3dcanvas.h +++ b/src/plugins/qmldesigner/components/itemlibrary/import3dcanvas.h @@ -17,6 +17,7 @@ public: Import3dCanvas(QWidget *parent); void updateRenderImage(const QImage &img); + void displayError(const QString &error); signals: void requestImageUpdate(); @@ -32,6 +33,7 @@ protected: private: QImage m_image; QPointF m_dragPos; + QString m_errorMsg; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp index 4ff4ffcdc09..ddfe0256191 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp @@ -1036,8 +1036,10 @@ Rectangle { }; auto crashCallback = [&] { - addWarning("Preview process crashed."); - cleanupPreviewPuppet(); + const QString errorMsg(tr("Preview generation process crashed.")); + addWarning(errorMsg); + canvas()->displayError(errorMsg); + QTimer::singleShot(0, this, &ItemLibraryAssetImportDialog::cleanupPreviewPuppet); }; m_connectionManager->setPreviewIconCallback(std::move(previewIconCallback));