summaryrefslogtreecommitdiffstats
path: root/editorlib/src/editorsceneitemmodel.h
blob: eee5c686f01066794a396e6e526d2eba786a22c3 (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
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt3D Editor of the Qt Toolkit.
**
** $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 EDITORSCENEITEMMODEL_H
#define EDITORSCENEITEMMODEL_H

#include "editorutils.h"

#include <QtCore/QAbstractItemModel>

namespace Qt3DCore {
    class QEntity;
}

class EditorScene;
class EditorSceneItem;
class EditorSceneItemModel : public QAbstractItemModel
{
    Q_OBJECT
    Q_PROPERTY(bool importEntityInProgress READ importEntityInProgress NOTIFY importEntityInProgressChanged)

public:
    enum EditorSceneItemRoles {
        ItemRole = Qt::UserRole + 1,
        NameRole,
        IdRole
    };

    EditorSceneItemModel(EditorScene *scene = 0);
    ~EditorSceneItemModel();

    QModelIndex index(int row, int column, const QModelIndex &parent) const;
    QModelIndex parent(const QModelIndex &child) const;
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    bool hasChildren(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);
    Qt::ItemFlags flags(const QModelIndex &index) const;
    QHash<int, QByteArray> roleNames() const;
    void resetModel();

    Q_INVOKABLE EditorSceneItem *editorSceneItemFromIndex(const QModelIndex &index) const;
    Qt3DCore::QEntity *insertEntity(EditorUtils::InsertableEntities type,
                                    const QVector3D &pos,
                                    const QModelIndex &parentIndex = QModelIndex());
    void insertExistingEntity(Qt3DCore::QEntity *entity, int row,
                              const QModelIndex &parentIndex = QModelIndex());
    Qt3DCore::QEntity *createEntity(EditorUtils::InsertableEntities type,
                                    const QVector3D &pos,
                                    const QModelIndex &parentIndex);
    Q_INVOKABLE QModelIndex lastInsertedIndex();
    void removeEntity(const QModelIndex &index = QModelIndex());
    const QString setEntityName(const QModelIndex &index, const QString &name);
    Q_INVOKABLE const QString entityName(const QModelIndex &index) const;
    Q_INVOKABLE QModelIndex sceneEntityIndex();
    Q_INVOKABLE QModelIndex getModelIndex(Qt3DCore::QEntity *entity);
    Q_INVOKABLE QModelIndex getModelIndexByName(const QString &entityName);
    EditorSceneItem *getItemByName(const QString &entityName);
    QString generateValidName(const QString &desiredName, const Qt3DCore::QEntity *skipEntity);
    EditorScene *scene() { return m_scene; }
    Q_INVOKABLE QStringList parentList(const QStringList &originalList);
    Q_INVOKABLE bool canReparent(EditorSceneItem *newParentItem, EditorSceneItem *movedItem,
                                 bool allowSameParent = false);
    void reparentEntity(const QModelIndex &newParentIndex, const QModelIndex &entityIndex);
    Q_INVOKABLE void addExpandedItem(const QModelIndex &index);
    Q_INVOKABLE void removeExpandedItem(const QModelIndex &index);
    void removeExpandedItems(Qt3DCore::QEntity *entity);
    void clearExpandedItems() { m_expandedItems.clear(); }
    QString importEntity(const QUrl &fileUrl);
    QString insertSceneLoaderEntity(const QUrl &fileUrl);
    Qt3DCore::QEntity *duplicateEntity(Qt3DCore::QEntity *entity,
                                       Qt3DCore::QEntity *newParent = nullptr,
                                       const QVector3D &duplicateOffset = QVector3D(),
                                       bool offset = true);
    Q_INVOKABLE bool importEntityInProgress() const { return m_sceneLoaderEntity != nullptr; }
    void abortImportEntity();

signals:
    void freeViewChanged(bool enabled);
    void expandItems(const QModelIndexList &items);
    void selectIndex(const QModelIndex &selectIndex);
    void importEntityInProgressChanged(bool importInProgress);

private slots:
    void handleEntityNameChange();
    void handleImportEntityLoaderStatusChanged();
    void handleSceneLoaderStatusChanged();

private:
    QString fixEntityName(const QString &desiredName);
    void collectEntityNames(QStringList &nameList, const Qt3DCore::QEntity *entity,
                            const Qt3DCore::QEntity *skipEntity);
    void connectEntity(Qt3DCore::QEntity *entity);
    void disconnectEntity(Qt3DCore::QEntity *entity);
    void fixEntityNames(Qt3DCore::QEntity *entity);
    void ensureTransforms(Qt3DCore::QEntity *entity);
    bool pruneNonMeshEntitites(Qt3DCore::QEntity *entity, bool justCheck);

    EditorScene *m_scene;
    QModelIndex m_lastInsertedIndex;
    QStringList m_expandedItems;
    Qt3DCore::QEntity *m_sceneLoaderEntity;
};

Q_DECLARE_METATYPE(EditorSceneItemModel*)

#endif // EDITORSCENEITEMMODEL_H