summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Qt3DStudio/Palettes/Project/ProjectFileSystemModel.h
blob: 8fb63805ae66c8ede26b451eb677f1da04e00669 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt 3D Studio.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef TREEVIEWADAPTOR_H
#define TREEVIEWADAPTOR_H

#include "StudioObjectTypes.h"
#include "DocumentEditorEnumerations.h"
#include "Qt3DSFileTools.h"
#include "Dispatch.h"

#include <QtWidgets/qfilesystemmodel.h>
#include <QtWidgets/qmessagebox.h>
#include <QtCore/qabstractitemmodel.h>
#include <QtCore/qlist.h>
#include <QtCore/qurl.h>
#include <QtCore/qtimer.h>
#include <QtQml/qqmlapplicationengine.h>

QT_FORWARD_DECLARE_CLASS(QFileSystemModel)
class CDataInputDialogItem;

class ProjectFileSystemModel : public QAbstractListModel
{
    Q_OBJECT

public:
    explicit ProjectFileSystemModel(QObject *parent = nullptr);

    enum {
        IsExpandableRole = QFileSystemModel::FilePermissions + 1,
        IsDraggableRole,
        IsReferencedRole,
        IsProjectReferencedRole, // Means some other presentation in the project uses this file
        DepthRole,
        ExpandedRole,
        FileIdRole,
        ExtraIconRole,
        HasWarningRole
    };

    void setRootPath(const QString &path);
    void selectFile(const QString &path);

    QHash<int, QByteArray> roleNames() const override;
    int rowCount(const QModelIndex &parent = {}) const override;
    QVariant data(const QModelIndex &index, int role) const override;
    QMimeData *mimeData(const QModelIndexList &indexes) const override;

    QString filePath(int row) const;
    bool isRefreshable(int row) const;
    bool isCollapsable(int row) const;
    bool isCurrentPresentation(const QString &path) const;
    bool isInitialPresentation(const QString &path) const;
    QString presentationId(const QString &path) const;

    Q3DStudio::DocumentEditorFileType::Enum assetTypeForRow(int row);
    int rowForPath(const QString &path) const;
    void updateRoles(const QVector<int> &roles, int startRow = 0, int endRow = -1);

    Q_INVOKABLE void expand(int row);
    Q_INVOKABLE void collapse(int row);

    Q_INVOKABLE void importUrls(const QList<QUrl> &urls, int row, bool autoSort = true);
    Q_INVOKABLE bool hasValidUrlsForDropping(const QList<QUrl> &urls) const;

    void asyncUpdateReferences();
    void onFilesChanged(const Q3DStudio::TFileModificationList &inFileModificationList);
    void clearModelData();
    void checkShaders(const int startRow = -1, const int endRow = -1);
    void showItemError(const QModelIndex index);

Q_SIGNALS:
    void modelChanged(QAbstractItemModel *model);
    void selectFileChanged(int idx);

private:
    void setRootIndex(const QModelIndex &rootIndex);
    void showModelTopLevelItems();
    void showModelChildItems(const QModelIndex &parentItem, int start, int end);
    int modelIndexRow(const QModelIndex &modelIndex) const;
    bool isExpanded(const QModelIndex &modelIndex) const;
    QString getIconName(const QString &path) const;
    EStudioObjectType getIconType(const QString &path) const;
    bool isVisible(const QModelIndex& modelIndex) const;
    bool hasVisibleChildren(const QModelIndex &modelIndex) const;
    void importUrl(QDir &targetDir, const QUrl &url,
                   QHash<QString, QString> &outPresentationNodes,
                   QStringList &outImportedFiles,
                   QMap<QString, CDataInputDialogItem *> &outDataInputs,
                   int &outOverrideChoice) const;
    void importPresentationAssets(const QFileInfo &uipSrc, const QFileInfo &uipTarget,
                                  QHash<QString, QString> &outPresentationNodes,
                                  QStringList &outImportedFiles, QSet<QString> &outDataInputs,
                                  QSet<QString> &outDataOutputs,int &outOverrideChoice) const;

    void modelRowsInserted(const QModelIndex &parent, int start, int end);
    void modelRowsRemoved(const QModelIndex &parent, int start, int end);
    void modelRowsMoved(const QModelIndex &parent, int start, int end);
    void modelLayoutChanged();
    void importQmlAssets(const QObject *qmlNode, const QDir &srcDir, const QDir &targetDir,
                         QStringList &outImportedFiles, int &outOverrideChoice) const;
    void updateDefaultDirMap();
    void addPathsToReferences(QSet<QString> &references, const QString &projectPath,
                              const QString &origPath);
    void handlePresentationIdChange(const QString &path, const QString &id);
    void asyncExpandPresentations();
    void updateReferences();
    bool addUniqueImportFile(const QString &importFile, QStringList &outImportedFiles) const;
    void overridableCopyFile(const QString &srcFile, const QString &targetFile,
                             QStringList &outImportedFiles, int &outOverrideChoice) const;
    void updateProjectReferences();
    void getQmlAssets(const QObject *qmlNode, QSet<QString> &outAssetPaths) const;
    QObject *getQmlStreamRootNode(QQmlApplicationEngine &qmlEngine, const QString &filePath,
                                  bool &outIsQmlStream) const;

    struct TreeItem {
        QPersistentModelIndex index;
        int depth;
        bool expanded;
        TreeItem *parent;
        int childCount;
        QString error;
    };

    QFileSystemModel *m_model = nullptr;
    QPersistentModelIndex m_rootIndex;
    QList<TreeItem> m_items;
    QSet<QString> m_references;
    QHash<QString, QString> m_defaultDirToAbsPathMap;

    // Cache of assets referred by other presentation files and qml streams in the project
    // Key: Absolute presentation file path
    // Value: Set of absolute asset file paths referred by the presentation file
    QHash<QString, QSet<QString>> m_presentationReferences;

    // Compilation of all m_presentationReferences sets and their parent paths
    QSet<QString> m_projectReferences;

    // Key: uip that needs update
    // Value: if true, uip was modified or created. If false, it was removed.
    QHash<QString, bool> m_projectReferencesUpdateMap;
    QTimer m_projectReferencesUpdateTimer;
    QTimer m_shaderCheckTimer;
    std::shared_ptr<qt3dsdm::ISignalConnection> m_directoryConnection;
    QString m_selectFile; // file to be selected on next layout change
};

#endif // TREEVIEWADAPTOR_H