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
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of Qt Designer. This header
// file may change from version to version without notice, or even be removed.
//
// We mean it.
//
#ifndef OBJECTINSPECTORMODEL_H
#define OBJECTINSPECTORMODEL_H
#include <layoutinfo_p.h>
#include <QtGui/qstandarditemmodel.h>
#include <QtGui/qicon.h>
#include <QtCore/qstring.h>
#include <QtCore/qlist.h>
#include <QtCore/qmap.h>
#include <QtCore/qpointer.h>
QT_BEGIN_NAMESPACE
class QDesignerFormWindowInterface;
namespace qdesigner_internal {
// Data structure containing the fixed item type icons
struct ObjectInspectorIcons {
QIcon layoutIcons[LayoutInfo::UnknownLayout + 1];
};
struct ModelRecursionContext;
// Data structure representing one item of the object inspector.
class ObjectData {
public:
enum Type {
Object,
Action,
SeparatorAction,
ChildWidget, // A child widget
LayoutableContainer, // A container that can be laid out
LayoutWidget, // A QLayoutWidget
ExtensionContainer // QTabWidget and the like, container extension
};
using StandardItemList = QList<QStandardItem *>;
explicit ObjectData(QObject *parent, QObject *object, const ModelRecursionContext &ctx);
ObjectData();
inline Type type() const { return m_type; }
inline QObject *object() const { return m_object; }
inline QObject *parent() const { return m_parent; }
inline QString objectName() const { return m_objectName; }
bool equals(const ObjectData & me) const;
enum ChangedMask { ClassNameChanged = 1, ObjectNameChanged = 2,
ClassIconChanged = 4, TypeChanged = 8,
LayoutTypeChanged = 16};
unsigned compare(const ObjectData & me) const;
// Initially set up a row
void setItems(const StandardItemList &row, const ObjectInspectorIcons &icons) const;
// Update row data according to change mask
void setItemsDisplayData(const StandardItemList &row, const ObjectInspectorIcons &icons, unsigned mask) const;
private:
void initObject(const ModelRecursionContext &ctx);
void initWidget(QWidget *w, const ModelRecursionContext &ctx);
QObject *m_parent = nullptr;
QObject *m_object = nullptr;
Type m_type = Object;
QString m_className;
QString m_objectName;
QIcon m_classIcon;
LayoutInfo::Type m_managedLayoutType = LayoutInfo::NoLayout;
};
inline bool operator==(const ObjectData &e1, const ObjectData &e2) { return e1.equals(e2); }
inline bool operator!=(const ObjectData &e1, const ObjectData &e2) { return !e1.equals(e2); }
using ObjectModel = QList<ObjectData>;
// QStandardItemModel for ObjectInspector. Uses ObjectData/ObjectModel
// internally for its updates.
class ObjectInspectorModel : public QStandardItemModel {
public:
using StandardItemList = QList<QStandardItem *>;
enum { ObjectNameColumn, ClassNameColumn, NumColumns };
explicit ObjectInspectorModel(QObject *parent);
enum UpdateResult { NoForm, Rebuilt, Updated };
UpdateResult update(QDesignerFormWindowInterface *fw);
const QModelIndexList indexesOf(QObject *o) const { return m_objectIndexMultiMap.values(o); }
QObject *objectAt(const QModelIndex &index) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
private:
typedef QMultiMap<QObject *,QModelIndex> ObjectIndexMultiMap;
void rebuild(const ObjectModel &newModel);
void updateItemContents(ObjectModel &oldModel, const ObjectModel &newModel);
void clearItems();
StandardItemList rowAt(QModelIndex index) const;
ObjectInspectorIcons m_icons;
ObjectIndexMultiMap m_objectIndexMultiMap;
ObjectModel m_model;
QPointer<QDesignerFormWindowInterface> m_formWindow;
};
} // namespace qdesigner_internal
QT_END_NAMESPACE
#endif // OBJECTINSPECTORMODEL_H
|