QmlDesigner: Fix icon generation fail when adding an item to content lib

Copy the added item's QML file to a temp directory and generate from
there. Also, fix that generated icons not appearing immediately by
separating the model refresh from the addItem(), ensuring the
refresh occurs after the icon is generated.

Change-Id: Ic4f32677b3c2f3895b7825aef7727ac6dd6240b2
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2024-06-19 00:06:10 +03:00
parent 0a649de487
commit 843dcc1ff6
2 changed files with 12 additions and 3 deletions

View File

@@ -91,7 +91,6 @@ void ContentLibraryUserModel::addItem(const QString &bundleId, const QString &na
UserCategory *cat = m_userCategories[sectionIndex]; UserCategory *cat = m_userCategories[sectionIndex];
cat->addItem(new ContentLibraryItem(cat, name, qml, type, icon, files, bundleId)); cat->addItem(new ContentLibraryItem(cat, name, qml, type, icon, files, bundleId));
emit dataChanged(index(sectionIndex), index(sectionIndex), {ItemsRole, EmptyRole});
updateIsEmpty(); updateIsEmpty();
} }

View File

@@ -573,6 +573,7 @@ void ContentLibraryView::addLibMaterial(const ModelNode &node, const QPixmap &ic
} }
m_widget->userModel()->addItem(bundleId, name, qml, QUrl::fromLocalFile(fullIconPath), depAssetsList); m_widget->userModel()->addItem(bundleId, name, qml, QUrl::fromLocalFile(fullIconPath), depAssetsList);
m_widget->userModel()->refreshSection(bundleId);
} }
QPair<QString, QSet<QString>> ContentLibraryView::modelNodeToQmlString(const ModelNode &node, int depth) QPair<QString, QSet<QString>> ContentLibraryView::modelNodeToQmlString(const ModelNode &node, int depth)
@@ -854,16 +855,24 @@ void ContentLibraryView::addLib3DItem(const ModelNode &node)
QTC_ASSERT_EXPECTED(result,); QTC_ASSERT_EXPECTED(result,);
// generate and save icon // generate and save icon
QString qmlPath = bundlePath.pathAppended(qml).toFSPathString();
QString iconPath = QLatin1String("icons/%1").arg(icon); QString iconPath = QLatin1String("icons/%1").arg(icon);
m_iconSavePath = bundlePath.pathAppended(iconPath); m_iconSavePath = bundlePath.pathAppended(iconPath);
m_iconSavePath.parentDir().ensureWritableDir(); m_iconSavePath.parentDir().ensureWritableDir();
getImageFromCache(qmlPath, [&](const QImage &image) {
// copy qml to a temp folder as icon generation fails sometimes when generating directly from
// the bundle folder
m_tempDir = std::make_unique<QTemporaryDir>();
QTC_ASSERT(m_tempDir->isValid(), return);
Utils::FilePath qmlPathTemp = Utils::FilePath::fromString(m_tempDir->path()).pathAppended(qml);
bundlePath.pathAppended(qml).copyFile(qmlPathTemp);
getImageFromCache(qmlPathTemp.toFSPathString(), [&](const QImage &image) {
bool iconSaved = image.save(m_iconSavePath.toFSPathString()); bool iconSaved = image.save(m_iconSavePath.toFSPathString());
if (iconSaved) if (iconSaved)
m_widget->userModel()->refreshSection(compUtils.user3DBundleId()); m_widget->userModel()->refreshSection(compUtils.user3DBundleId());
else else
qWarning() << "ContentLibraryView::getImageFromCache(): icon save failed" << iconPath; qWarning() << "ContentLibraryView::getImageFromCache(): icon save failed" << iconPath;
m_tempDir.reset();
}); });
// add the item to the bundle json // add the item to the bundle json
@@ -1072,6 +1081,7 @@ void ContentLibraryView::importBundle()
m_widget->userModel()->addItem(bundleId, name, qml, iconUrl, files); m_widget->userModel()->addItem(bundleId, name, qml, iconUrl, files);
} }
m_widget->userModel()->refreshSection(bundleId);
zipReader.close(); zipReader.close();