From 64d274454e6494bc498b7b8ec95facb88496e31c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 29 Jun 2021 16:10:01 +0300 Subject: QmlPuppet: Fix imported 3D asset library icon generation Recent changes to custom geometry handling now require that the zoom process in icon creation does each focus step asynchronously, so that selection box geometry has a chance to update between frames. Fixes: QDS-4652 Change-Id: If92bf580a556a68c10d3af1406c2eabef530254a Reviewed-by: Mahmoud Badri --- .../qml2puppet/iconrenderer/iconrenderer.cpp | 38 +++++++++++++++------- .../qml2puppet/iconrenderer/iconrenderer.h | 5 ++- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp index 82af9150d35..2dd653273cd 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp @@ -135,7 +135,7 @@ void IconRenderer::setupRender() resizeContent(m_size); if (!initRhi()) QTimer::singleShot(0, qGuiApp, &QGuiApplication::quit); - QTimer::singleShot(0, this, &IconRenderer::createIcon); + QTimer::singleShot(0, this, &IconRenderer::startCreateIcon); } else { QTimer::singleShot(0, qGuiApp, &QGuiApplication::quit); } @@ -144,25 +144,41 @@ void IconRenderer::setupRender() } } -void IconRenderer::createIcon() +void IconRenderer::startCreateIcon() { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) m_designerSupport.refFromEffectItem(m_containerItem, false); #endif QQuickDesignerSupportItems::disableNativeTextRendering(m_containerItem); + + if (m_is3D) + QTimer::singleShot(0, this, &IconRenderer::focusCamera); + else + QTimer::singleShot(0, this, &IconRenderer::finishCreateIcon); +} + +void IconRenderer::focusCamera() +{ #ifdef QUICK3D_MODULE - if (m_is3D) { - // Render once to make sure scene is up to date before we set up the selection box - render({}); + if (m_focusStep >= 10) { + QTimer::singleShot(0, this, &IconRenderer::finishCreateIcon); + return; + } + + render({}); + + if (m_focusStep == 0) { QMetaObject::invokeMethod(m_containerItem, "setSceneToBox"); - int tries = 0; - while (tries < 10) { - ++tries; - render({}); - QMetaObject::invokeMethod(m_containerItem, "fitAndHideBox"); - } + } else if (m_focusStep > 1 && m_focusStep < 10) { + QMetaObject::invokeMethod(m_containerItem, "fitAndHideBox"); } + ++m_focusStep; + QTimer::singleShot(0, this, &IconRenderer::focusCamera); #endif +} + +void IconRenderer::finishCreateIcon() +{ QFileInfo fi(m_filePath); // Render regular size image diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.h index 6f5e36720d0..64880249305 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.h @@ -53,7 +53,9 @@ public: void setupRender(); private: - void createIcon(); + void startCreateIcon(); + void focusCamera(); + void finishCreateIcon(); void render(const QString &fileName); void resizeContent(int dimensions); bool initRhi(); @@ -66,6 +68,7 @@ private: QQuickItem *m_containerItem = nullptr; DesignerSupport m_designerSupport; bool m_is3D = false; + int m_focusStep = 0; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QQuickRenderControl *m_renderControl = nullptr; QRhi *m_rhi = nullptr; -- cgit v1.2.3