1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2019 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of Qt Creator. 7 ** 8 ** Commercial License Usage 9 ** Licensees holding valid commercial Qt licenses may use this file in 10 ** accordance with the commercial license agreement provided with the 11 ** Software or, alternatively, in accordance with the terms contained in 12 ** a written agreement between you and The Qt Company. For licensing terms 13 ** and conditions see https://www.qt.io/terms-conditions. For further 14 ** information use the contact form at https://www.qt.io/contact-us. 15 ** 16 ** GNU General Public License Usage 17 ** Alternatively, this file may be used under the terms of the GNU 18 ** General Public License version 3 as published by the Free Software 19 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT 20 ** included in the packaging of this file. Please review the following 21 ** information to ensure the GNU General Public License requirements will 22 ** be met: https://www.gnu.org/licenses/gpl-3.0.html. 23 ** 24 ****************************************************************************/ 25 #pragma once 26 27 #include "import.h" 28 29 #include <qprocessuniqueptr.h> 30 31 #include <QSet> 32 #include <QHash> 33 #include <QJsonObject> 34 #include <QObject> 35 #include <QProcess> 36 #include <QStringList> 37 #include <QDir> 38 #include <QFileInfo> 39 40 QT_BEGIN_NAMESPACE 41 class QSSGAssetImportManager; 42 class QTemporaryDir; 43 QT_END_NAMESPACE 44 45 namespace QmlDesigner { 46 47 class ItemLibraryAssetImporter : public QObject 48 { 49 Q_OBJECT 50 51 public: 52 ItemLibraryAssetImporter(QObject *parent = nullptr); 53 ~ItemLibraryAssetImporter(); 54 55 void importQuick3D(const QStringList &inputFiles, const QString &importPath, 56 const QVector<QJsonObject> &options, 57 const QHash<QString, int> &extToImportOptionsMap, 58 const QSet<QString> &preselectedFilesForOverwrite); 59 60 bool isImporting() const; 61 void cancelImport(); 62 bool isCancelled() const; 63 64 void addError(const QString &errMsg, const QString &srcPath = {}) const; 65 void addWarning(const QString &warningMsg, const QString &srcPath = {}) const; 66 void addInfo(const QString &infoMsg, const QString &srcPath = {}) const; 67 68 signals: 69 void errorReported(const QString &, const QString &) const; 70 void warningReported(const QString &, const QString &) const; 71 void infoReported(const QString &, const QString &) const; 72 void progressChanged(int value, const QString &text) const; 73 void importNearlyFinished() const; 74 void importFinished(); 75 76 private slots: 77 void importProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); 78 void iconProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); 79 80 private: 81 struct ParseData { 82 QJsonObject options; 83 QDir targetDir; 84 QDir outDir; 85 QString targetDirPath; 86 QFileInfo sourceInfo; 87 QString assetName; 88 QString originalAssetName; 89 int importId; 90 }; 91 92 void notifyFinished(); 93 void reset(); 94 void parseFiles(const QStringList &filePaths, const QVector<QJsonObject> &options, 95 const QHash<QString, int> &extToImportOptionsMap, 96 const QSet<QString> &preselectedFilesForOverwrite); 97 bool preParseQuick3DAsset(const QString &file, ParseData &pd, 98 const QSet<QString> &preselectedFilesForOverwrite); 99 void postParseQuick3DAsset(const ParseData &pd); 100 void copyImportedFiles(); 101 102 void notifyProgress(int value, const QString &text); 103 void notifyProgress(int value); 104 void keepUiAlive() const; 105 106 enum class OverwriteResult { 107 Skip, 108 Overwrite, 109 Update 110 }; 111 112 OverwriteResult confirmAssetOverwrite(const QString &assetName); 113 bool startImportProcess(const ParseData &pd); 114 bool startIconProcess(int size, const QString &iconFile, const QString &iconSource); 115 void postImport(); 116 void finalizeQuick3DImport(); 117 QString sourceSceneTargetFilePath(const ParseData &pd); 118 119 QSet<QHash<QString, QString>> m_importFiles; 120 QHash<QString, QStringList> m_overwrittenImports; 121 bool m_isImporting = false; 122 bool m_cancelled = false; 123 QString m_importPath; 124 QTemporaryDir *m_tempDir = nullptr; 125 std::vector<QProcessUniquePointer> m_qmlPuppetProcesses; 126 int m_qmlPuppetCount = 0; 127 int m_qmlImportFinishedCount = 0; 128 int m_importIdCounter = 1000000; // Use ids in range unlikely to clash with any normal process exit codes 129 QHash<int, ParseData> m_parseData; 130 QString m_progressTitle; 131 QList<Import> m_requiredImports; 132 }; 133 } // QmlDesigner 134