diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index bb510674acd..d60cf7e63ad 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -29,6 +29,8 @@ #include "rewriterview.h" #include "model.h" #include "puppetcreator.h" +#include "rewritertransaction.h" +#include "rewritingexception.h" #include #include @@ -194,6 +196,7 @@ void ItemLibraryAssetImporter::reset() m_qmlPuppetCount = 0; m_qmlImportFinishedCount = 0; m_parseData.clear(); + m_requiredImports.clear(); } void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths, @@ -313,6 +316,9 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd) qmlInfo.append("."); qmlInfo.append(pd.assetName); qmlInfo.append('\n'); + m_requiredImports.append(Import::createLibraryImport( + QStringLiteral("%1.%2").arg(pd.targetDir.dirName(), + pd.assetName), version)); while (qmlIt.hasNext()) { qmlIt.next(); QFileInfo fi = QFileInfo(qmlIt.filePath()); @@ -344,6 +350,24 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd) out << "canBeDroppedInFormEditor: false" << Qt::endl; out << "canBeDroppedInView3D: true" << Qt::endl; file.close(); + + // Add quick3D import unless it is already added + if (m_requiredImports.first().url() != "QtQuick3D") { + QByteArray import3dStr{"import QtQuick3D"}; + int importIdx = content.indexOf(import3dStr); + if (importIdx != -1 && importIdx < braceIdx) { + importIdx += import3dStr.size(); + int nlIdx = content.indexOf('\n', importIdx); + QByteArray versionStr = content.mid(importIdx, nlIdx - importIdx).trimmed(); + // There could be 'as abc' after version, so just take first part + QList parts = versionStr.split(' '); + QString impVersion; + if (parts.size() >= 1) + impVersion = QString::fromUtf8(parts[0]); + m_requiredImports.prepend(Import::createLibraryImport( + "QtQuick3D", impVersion)); + } + } } if (startIconProcess(24, iconFileName, qmlIt.filePath())) { // Since icon is generated by external process, the file won't be @@ -563,6 +587,24 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport() if (counter == 10) { model->rewriterView()->textModifier()->replace(0, 0, {}); } else if (counter == 19) { + try { + const QList currentImports = model->imports(); + QList newImportsToAdd; + for (auto &imp : qAsConst(m_requiredImports)) { + if (!currentImports.contains(imp)) + newImportsToAdd.append(imp); + } + if (!newImportsToAdd.isEmpty()) { + RewriterTransaction transaction + = model->rewriterView()->beginRewriterTransaction( + QByteArrayLiteral("ItemLibraryAssetImporter::finalizeQuick3DImport")); + + model->changeImports(newImportsToAdd, {}); + transaction.commit(); + } + } catch (const RewritingException &e) { + addError(tr("Failed to update imports: %1").arg(e.description())); + } doc->updateSubcomponentManager(); } else if (counter >= 20) { if (!m_overwrittenImports.isEmpty()) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h index a0a759a2307..022859a8527 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h @@ -117,5 +117,6 @@ private: int m_importIdCounter = 1000000; // Use ids in range unlikely to clash with any normal process exit codes QHash m_parseData; QString m_progressTitle; + QList m_requiredImports; }; } // QmlDesigner