From edd07ff986b6edb4ad001a88d673c152501b555f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 18 Oct 2022 16:49:09 +0200 Subject: [PATCH] QmlDesigner: Delay project preview generation by 10 seconds This way the preview generation does not block opening the project and the project is fully loaded. If the preview is null we store this in the data base and wait one hour until we try to regenerate it. Otherwise we might try to render a preview whenever we switch files. Task-number: QDS-7992 Change-Id: I80a078ec7b8d418fa1fccd14bc4603b82c36c5e0 Reviewed-by: Marco Bubke Reviewed-by: Qt CI Bot --- .../qmldesigner/qmldesignerprojectmanager.cpp | 28 ++++++++++++++----- .../qmldesigner/qmldesignerprojectmanager.h | 3 ++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp b/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp index 366f1ef04e3..95ad8eff6a6 100644 --- a/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp +++ b/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp @@ -138,7 +138,7 @@ public: ImageCacheCollector collector{connectionManager, QSize{300, 300}, QSize{1000, 1000}, - ImageCacheCollectorNullImageHandling::DontCaptureNullImage}; + ImageCacheCollectorNullImageHandling::CaptureNullImage}; PreviewTimeStampProvider timeStampProvider; AsynchronousImageFactory factory; QPointer<::ProjectExplorer::Target> activeTarget; @@ -167,6 +167,11 @@ QmlDesignerProjectManager::QmlDesignerProjectManager() QObject::connect(sessionManager, &::ProjectExplorer::SessionManager::projectRemoved, [&](auto *project) { projectRemoved(project); }); + + QObject::connect(&m_previewTimer, + &QTimer::timeout, + this, + &QmlDesignerProjectManager::generatePreview); } QmlDesignerProjectManager::~QmlDesignerProjectManager() = default; @@ -196,13 +201,8 @@ void QmlDesignerProjectManager::currentEditorChanged(::Core::IEditor *) if (!m_projectData || !m_projectData->activeTarget) return; - ::QmlProjectManager::QmlBuildSystem *qmlBuildSystem = getQmlBuildSystem( - m_projectData->activeTarget); + m_previewTimer.start(10000); - if (qmlBuildSystem) { - m_projectData->collector.setTarget(m_projectData->activeTarget); - m_projectData->factory.generate(qmlBuildSystem->mainFilePath().toString().toUtf8()); - } } void QmlDesignerProjectManager::editorsClosed(const QList<::Core::IEditor *> &) {} @@ -221,6 +221,20 @@ void QmlDesignerProjectManager::aboutToRemoveProject(::ProjectExplorer::Project void QmlDesignerProjectManager::projectRemoved(::ProjectExplorer::Project *) {} +void QmlDesignerProjectManager::generatePreview() +{ + if (!m_projectData || !m_projectData->activeTarget) + return; + + ::QmlProjectManager::QmlBuildSystem *qmlBuildSystem = getQmlBuildSystem( + m_projectData->activeTarget); + + if (qmlBuildSystem) { + m_projectData->collector.setTarget(m_projectData->activeTarget); + m_projectData->factory.generate(qmlBuildSystem->mainFilePath().toString().toUtf8()); + } +} + QmlDesignerProjectManager::ImageCacheData *QmlDesignerProjectManager::imageCacheData() { std::call_once(imageCacheFlag, [this]() { diff --git a/src/plugins/qmldesigner/qmldesignerprojectmanager.h b/src/plugins/qmldesigner/qmldesignerprojectmanager.h index 68cd809be3d..78001988128 100644 --- a/src/plugins/qmldesigner/qmldesignerprojectmanager.h +++ b/src/plugins/qmldesigner/qmldesignerprojectmanager.h @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -68,6 +69,7 @@ private: void projectAdded(::ProjectExplorer::Project *project); void aboutToRemoveProject(::ProjectExplorer::Project *project); void projectRemoved(::ProjectExplorer::Project *project); + void generatePreview(); ImageCacheData *imageCacheData(); private: @@ -75,5 +77,6 @@ private: std::unique_ptr m_imageCacheData; std::unique_ptr m_previewImageCacheData; std::unique_ptr m_projectData; + QTimer m_previewTimer; }; } // namespace QmlDesigner