aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/modelinglib/qmt/model_ui/treemodel.h
blob: d0840f56c0d8338218a30f759db952645ed7954c (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
// Copyright (C) 2016 Jochen Becher
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0

#pragma once

#include <QStandardItemModel>
#include "qmt/infrastructure/qmt_global.h"

#include <qmt/stereotype/stereotypeicon.h>
#include <qmt/style/styleengine.h>

#include <QScopedPointer>
#include <QHash>

QT_BEGIN_NAMESPACE
class QIcon;
QT_END_NAMESPACE

namespace qmt {

class MElement;
class MObject;
class MDiagram;
class MRelation;
class ModelController;
class StereotypeController;
class StyleController;

class QMT_EXPORT TreeModel : public QStandardItemModel
{
    Q_OBJECT

    class ModelItem;
    class ItemFactory;
    class ItemUpdater;

public:
    enum ItemType {
        Package,
        Diagram,
        Element,
        Relation
    };

    enum Roles {
        RoleItemType = Qt::UserRole + 1
    };

    explicit TreeModel(QObject *parent = nullptr);
    ~TreeModel() override;

    ModelController *modelController() const { return m_modelController; }
    void setModelController(ModelController *modelController);
    StereotypeController *stereotypeController() const { return m_stereotypeController; }
    void setStereotypeController(StereotypeController *stereotypeController);
    StyleController *styleController() const { return m_styleController; }
    void setStyleController(StyleController *styleController);

    MElement *element(const QModelIndex &index) const;
    QModelIndex indexOf(const MElement *element) const;
    QIcon icon(const QModelIndex &index) const;

    Qt::DropActions supportedDropActions() const override;
    QStringList mimeTypes() const override;

private:
    void onBeginResetModel();
    void onEndResetModel();
    void onBeginUpdateObject(int row, const MObject *parent);
    void onEndUpdateObject(int row, const MObject *parent);
    void onBeginInsertObject(int row, const MObject *parent);
    void onEndInsertObject(int row, const MObject *parent);
    void onBeginRemoveObject(int row, const MObject *parent);
    void onEndRemoveObject(int row, const MObject *parent);
    void onBeginMoveObject(int formerRow, const MObject *formerOwner);
    void onEndMoveObject(int row, const MObject *owner);
    void onBeginUpdateRelation(int row, const MObject *parent);
    void onEndUpdateRelation(int row, const MObject *parent);
    void onBeginInsertRelation(int row, const MObject *parent);
    void onEndInsertRelation(int row, const MObject *parent);
    void onBeginRemoveRelation(int row, const MObject *parent);
    void onEndRemoveRelation(int row, const MObject *parent);
    void onBeginMoveRelation(int formerRow, const MObject *formerOwner);
    void onEndMoveRelation(int row, const MObject *owner);
    void onRelationEndChanged(MRelation *relation, MObject *endObject);
    void onModelDataChanged(const QModelIndex &topleft, const QModelIndex &bottomright);

    void clear();
    ModelItem *createItem(const MElement *element);
    void createChildren(const MObject *parentObject, ModelItem *parentItem);
    void removeObjectFromItemMap(const MObject *object);
    QString filterLabel(const QString &label) const;
    QString createObjectLabel(const MObject *object);
    QString createRelationLabel(const MRelation *relation);
    QIcon createIcon(StereotypeIcon::Element stereotypeIconElement,
                     StyleEngine::ElementType styleElementType, const QStringList &stereotypes,
                     const QString &defaultIconPath);

    enum Busy {
        NotBusy,
        ResetModel,
        UpdateElement,
        InsertElement,
        RemoveElement,
        MoveElement,
        UpdateDiagram,
        InsertDiagram,
        RemoveDiagram,
        MoveDiagram,
        UpdateRelation,
        InsertRelation,
        RemoveRelation,
        MoveRelation
    };

    ModelController *m_modelController = nullptr;
    StereotypeController *m_stereotypeController = nullptr;
    StyleController *m_styleController = nullptr;
    ModelItem *m_rootItem = nullptr;
    QHash<const MObject *, ModelItem *> m_objectToItemMap;
    QHash<ModelItem *, const MObject *> m_itemToObjectMap;
    Busy m_busyState = NotBusy;
};

} // namespace qmt