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