forked from qt-creator/qt-creator
QmlDesigner: Use lazy initialization for the ImageCache
Change-Id: I42f6f047882c4056a1523bb85b4801f53e50fbe5 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
@@ -84,30 +84,7 @@ public:
|
||||
ItemLibraryView::ItemLibraryView(QObject* parent)
|
||||
: AbstractView(parent)
|
||||
|
||||
{
|
||||
m_imageCacheData = std::make_unique<ImageCacheData>();
|
||||
|
||||
auto setTargetInImageCache =
|
||||
[imageCacheData = m_imageCacheData.get()](ProjectExplorer::Target *target) {
|
||||
if (target == imageCacheData->collector.target())
|
||||
return;
|
||||
|
||||
if (target)
|
||||
imageCacheData->cache.clean();
|
||||
|
||||
imageCacheData->collector.setTarget(target);
|
||||
};
|
||||
|
||||
if (auto project = ProjectExplorer::SessionManager::startupProject(); project) {
|
||||
m_imageCacheData->collector.setTarget(project->activeTarget());
|
||||
connect(project, &ProjectExplorer::Project::activeTargetChanged, this, setTargetInImageCache);
|
||||
}
|
||||
|
||||
connect(ProjectExplorer::SessionManager::instance(),
|
||||
&ProjectExplorer::SessionManager::startupProjectChanged,
|
||||
this,
|
||||
[=](ProjectExplorer::Project *project) { setTargetInImageCache(activeTarget(project)); });
|
||||
}
|
||||
{}
|
||||
|
||||
ItemLibraryView::~ItemLibraryView()
|
||||
{
|
||||
@@ -121,9 +98,9 @@ bool ItemLibraryView::hasWidget() const
|
||||
WidgetInfo ItemLibraryView::widgetInfo()
|
||||
{
|
||||
if (m_widget.isNull()) {
|
||||
m_widget = new ItemLibraryWidget{m_imageCacheData->cache,
|
||||
m_imageCacheData->asynchronousFontImageCache,
|
||||
m_imageCacheData->synchronousFontImageCache};
|
||||
m_widget = new ItemLibraryWidget{imageCacheData()->cache,
|
||||
imageCacheData()->asynchronousFontImageCache,
|
||||
imageCacheData()->synchronousFontImageCache};
|
||||
}
|
||||
|
||||
return createWidgetInfo(m_widget.data(),
|
||||
@@ -206,9 +183,41 @@ void ItemLibraryView::setResourcePath(const QString &resourcePath)
|
||||
m_widget->setResourcePath(resourcePath);
|
||||
}
|
||||
|
||||
ImageCacheData *ItemLibraryView::imageCacheData()
|
||||
{
|
||||
std::call_once(imageCacheFlag, [this]() {
|
||||
m_imageCacheData = std::make_unique<ImageCacheData>();
|
||||
auto setTargetInImageCache =
|
||||
[imageCacheData = m_imageCacheData.get()](ProjectExplorer::Target *target) {
|
||||
if (target == imageCacheData->collector.target())
|
||||
return;
|
||||
|
||||
if (target)
|
||||
imageCacheData->cache.clean();
|
||||
|
||||
imageCacheData->collector.setTarget(target);
|
||||
};
|
||||
|
||||
if (auto project = ProjectExplorer::SessionManager::startupProject(); project) {
|
||||
m_imageCacheData->collector.setTarget(project->activeTarget());
|
||||
connect(project,
|
||||
&ProjectExplorer::Project::activeTargetChanged,
|
||||
this,
|
||||
setTargetInImageCache);
|
||||
}
|
||||
connect(ProjectExplorer::SessionManager::instance(),
|
||||
&ProjectExplorer::SessionManager::startupProjectChanged,
|
||||
this,
|
||||
[=](ProjectExplorer::Project *project) {
|
||||
setTargetInImageCache(activeTarget(project));
|
||||
});
|
||||
});
|
||||
return m_imageCacheData.get();
|
||||
}
|
||||
|
||||
AsynchronousImageCache &ItemLibraryView::imageCache()
|
||||
{
|
||||
return m_imageCacheData->cache;
|
||||
return imageCacheData()->cache;
|
||||
}
|
||||
|
||||
void ItemLibraryView::documentMessagesChanged(const QList<DocumentMessage> &errors, const QList<DocumentMessage> &)
|
||||
|
@@ -29,6 +29,7 @@
|
||||
|
||||
#include <QPointer>
|
||||
|
||||
#include <mutex>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
@@ -66,6 +67,9 @@ protected:
|
||||
void updateImports();
|
||||
|
||||
private:
|
||||
ImageCacheData *imageCacheData();
|
||||
|
||||
std::once_flag imageCacheFlag;
|
||||
std::unique_ptr<ImageCacheData> m_imageCacheData;
|
||||
QPointer<ItemLibraryWidget> m_widget;
|
||||
bool m_hasErrors = false;
|
||||
|
Reference in New Issue
Block a user