aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp')
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp92
1 files changed, 69 insertions, 23 deletions
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
index deb50e0a66..c67b527abb 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
@@ -32,6 +32,7 @@
#include <QtCore/qdir.h>
#include <QtCore/qdiriterator.h>
#include <QtCore/qsavefile.h>
+#include <QtCore/qfile.h>
#include <QtCore/qloggingcategory.h>
#include <QtCore/qtemporarydir.h>
#include <QtWidgets/qapplication.h>
@@ -63,7 +64,8 @@ ItemLibraryAssetImporter::~ItemLibraryAssetImporter() {
void ItemLibraryAssetImporter::importQuick3D(const QStringList &inputFiles,
const QString &importPath,
- const QVariantMap &options)
+ const QVector<QJsonObject> &options,
+ const QHash<QString, int> &extToImportOptionsMap)
{
if (m_isImporting)
cancelImport();
@@ -79,7 +81,7 @@ void ItemLibraryAssetImporter::importQuick3D(const QStringList &inputFiles,
m_importPath = importPath;
- parseFiles(inputFiles, options);
+ parseFiles(inputFiles, options, extToImportOptionsMap);
if (!isCancelled()) {
// Don't allow cancel anymore as existing asset overwrites are not trivially recoverable.
@@ -221,7 +223,9 @@ void ItemLibraryAssetImporter::reset()
#endif
}
-void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths, const QVariantMap &options)
+void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths,
+ const QVector<QJsonObject> &options,
+ const QHash<QString, int> &extToImportOptionsMap)
{
if (isCancelled())
return;
@@ -236,8 +240,11 @@ void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths, const QV
for (const QString &file : filePaths) {
if (isCancelled())
return;
- if (isQuick3DAsset(file))
- parseQuick3DAsset(file, options);
+ if (isQuick3DAsset(file)) {
+ QVariantMap varOpts;
+ int index = extToImportOptionsMap.value(QFileInfo(file).suffix());
+ parseQuick3DAsset(file, options[index].toVariantMap());
+ }
notifyProgress(qRound(++count * quota), progressTitle);
}
notifyProgress(100, progressTitle);
@@ -296,31 +303,70 @@ void ItemLibraryAssetImporter::parseQuick3DAsset(const QString &file, const QVar
return;
}
- // Generate qmldir file
- outDir.setNameFilters({QStringLiteral("*.qml")});
- const QFileInfoList qmlFiles = outDir.entryInfoList(QDir::Files);
-
- if (!qmlFiles.isEmpty()) {
- QString qmldirFileName = outDir.absoluteFilePath(QStringLiteral("qmldir"));
+ // Generate qmldir file if importer doesn't already make one
+ QString qmldirFileName = outDir.absoluteFilePath(QStringLiteral("qmldir"));
+ if (!QFileInfo(qmldirFileName).exists()) {
QSaveFile qmldirFile(qmldirFileName);
QString version = QStringLiteral("1.0");
- if (qmldirFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
- for (const auto &fi : qmlFiles) {
+
+ // Note: Currently Quick3D importers only generate externally usable qml files on the top
+ // level of the import directory, so we don't search subdirectories. The qml files in
+ // subdirs assume they are used within the context of the toplevel qml files.
+ QDirIterator qmlIt(outDir.path(), {QStringLiteral("*.qml")}, QDir::Files);
+ if (qmlIt.hasNext()) {
+ outDir.mkdir(Constants::QUICK_3D_ASSET_ICON_DIR);
+ if (qmldirFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
QString qmlInfo;
- qmlInfo.append(fi.baseName());
- qmlInfo.append(QLatin1Char(' '));
- qmlInfo.append(version);
- qmlInfo.append(QLatin1Char(' '));
- qmlInfo.append(fi.fileName());
+ qmlInfo.append("module ");
+ qmlInfo.append(m_importPath.split('/').last());
+ qmlInfo.append(".");
+ qmlInfo.append(assetName);
+ qmlInfo.append('\n');
+ while (qmlIt.hasNext()) {
+ qmlIt.next();
+ QFileInfo fi = QFileInfo(qmlIt.filePath());
+ qmlInfo.append(fi.baseName());
+ qmlInfo.append(' ');
+ qmlInfo.append(version);
+ qmlInfo.append(' ');
+ qmlInfo.append(outDir.relativeFilePath(qmlIt.filePath()));
+ qmlInfo.append('\n');
+
+ // Generate item library icon for qml file based on root component
+ QFile qmlFile(qmlIt.filePath());
+ if (qmlFile.open(QIODevice::ReadOnly)) {
+ QString iconFileName = outDir.path() + '/'
+ + Constants::QUICK_3D_ASSET_ICON_DIR + '/' + fi.baseName()
+ + Constants::QUICK_3D_ASSET_LIBRARY_ICON_SUFFIX;
+ QString iconFileName2x = iconFileName + "@2x";
+ QByteArray content = qmlFile.readAll();
+ int braceIdx = content.indexOf('{');
+ if (braceIdx != -1) {
+ int nlIdx = content.lastIndexOf('\n', braceIdx);
+ QByteArray rootItem = content.mid(nlIdx, braceIdx - nlIdx).trimmed();
+ if (rootItem == "Node") {
+ QFile::copy(":/ItemLibrary/images/item-3D_model-icon.png",
+ iconFileName);
+ QFile::copy(":/ItemLibrary/images/item-3D_model-icon@2x.png",
+ iconFileName2x);
+ } else {
+ QFile::copy(":/ItemLibrary/images/item-default-icon.png",
+ iconFileName);
+ QFile::copy(":/ItemLibrary/images/item-default-icon@2x.png",
+ iconFileName2x);
+ }
+ }
+ }
+ }
qmldirFile.write(qmlInfo.toUtf8());
+ qmldirFile.commit();
+ } else {
+ addError(tr("Failed to create qmldir file for asset: \"%1\"").arg(assetName));
}
- qmldirFile.commit();
- } else {
- addError(tr("Failed to create qmldir file for asset: \"%1\"").arg(assetName));
}
}
- // Gather generated files
+ // Gather all generated files
const int outDirPathSize = outDir.path().size();
QDirIterator dirIt(outDir.path(), QDir::Files, QDirIterator::Subdirectories);
QHash<QString, QString> assetFiles;
@@ -334,7 +380,7 @@ void ItemLibraryAssetImporter::parseQuick3DAsset(const QString &file, const QVar
// Copy the original asset into a subdirectory
assetFiles.insert(sourceInfo.absoluteFilePath(),
- targetDirPath + QStringLiteral("/source model/") + sourceInfo.fileName());
+ targetDirPath + QStringLiteral("/source scene/") + sourceInfo.fileName());
m_importFiles.insert(assetFiles);
#else