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
|