forked from qt-creator/qt-creator
QmlDesigner: Add necessary QML imports when importing 3d asset
Necessary missing import statements are generated when a 3D asset is imported to a project. Task-number: QDS-3683 Change-Id: I93da8ddaf5691d8ef66e167ea8b0fefd7e1c6c91 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -29,6 +29,8 @@
|
|||||||
#include "rewriterview.h"
|
#include "rewriterview.h"
|
||||||
#include "model.h"
|
#include "model.h"
|
||||||
#include "puppetcreator.h"
|
#include "puppetcreator.h"
|
||||||
|
#include "rewritertransaction.h"
|
||||||
|
#include "rewritingexception.h"
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QDirIterator>
|
#include <QDirIterator>
|
||||||
@@ -194,6 +196,7 @@ void ItemLibraryAssetImporter::reset()
|
|||||||
m_qmlPuppetCount = 0;
|
m_qmlPuppetCount = 0;
|
||||||
m_qmlImportFinishedCount = 0;
|
m_qmlImportFinishedCount = 0;
|
||||||
m_parseData.clear();
|
m_parseData.clear();
|
||||||
|
m_requiredImports.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths,
|
void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths,
|
||||||
@@ -313,6 +316,9 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd)
|
|||||||
qmlInfo.append(".");
|
qmlInfo.append(".");
|
||||||
qmlInfo.append(pd.assetName);
|
qmlInfo.append(pd.assetName);
|
||||||
qmlInfo.append('\n');
|
qmlInfo.append('\n');
|
||||||
|
m_requiredImports.append(Import::createLibraryImport(
|
||||||
|
QStringLiteral("%1.%2").arg(pd.targetDir.dirName(),
|
||||||
|
pd.assetName), version));
|
||||||
while (qmlIt.hasNext()) {
|
while (qmlIt.hasNext()) {
|
||||||
qmlIt.next();
|
qmlIt.next();
|
||||||
QFileInfo fi = QFileInfo(qmlIt.filePath());
|
QFileInfo fi = QFileInfo(qmlIt.filePath());
|
||||||
@@ -344,6 +350,24 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd)
|
|||||||
out << "canBeDroppedInFormEditor: false" << Qt::endl;
|
out << "canBeDroppedInFormEditor: false" << Qt::endl;
|
||||||
out << "canBeDroppedInView3D: true" << Qt::endl;
|
out << "canBeDroppedInView3D: true" << Qt::endl;
|
||||||
file.close();
|
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<QByteArray> 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())) {
|
if (startIconProcess(24, iconFileName, qmlIt.filePath())) {
|
||||||
// Since icon is generated by external process, the file won't be
|
// Since icon is generated by external process, the file won't be
|
||||||
@@ -563,6 +587,24 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport()
|
|||||||
if (counter == 10) {
|
if (counter == 10) {
|
||||||
model->rewriterView()->textModifier()->replace(0, 0, {});
|
model->rewriterView()->textModifier()->replace(0, 0, {});
|
||||||
} else if (counter == 19) {
|
} else if (counter == 19) {
|
||||||
|
try {
|
||||||
|
const QList<Import> currentImports = model->imports();
|
||||||
|
QList<Import> 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();
|
doc->updateSubcomponentManager();
|
||||||
} else if (counter >= 20) {
|
} else if (counter >= 20) {
|
||||||
if (!m_overwrittenImports.isEmpty())
|
if (!m_overwrittenImports.isEmpty())
|
||||||
|
@@ -117,5 +117,6 @@ private:
|
|||||||
int m_importIdCounter = 1000000; // Use ids in range unlikely to clash with any normal process exit codes
|
int m_importIdCounter = 1000000; // Use ids in range unlikely to clash with any normal process exit codes
|
||||||
QHash<int, ParseData> m_parseData;
|
QHash<int, ParseData> m_parseData;
|
||||||
QString m_progressTitle;
|
QString m_progressTitle;
|
||||||
|
QList<Import> m_requiredImports;
|
||||||
};
|
};
|
||||||
} // QmlDesigner
|
} // QmlDesigner
|
||||||
|
Reference in New Issue
Block a user