1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4//
5// W A R N I N G
6// -------------
7//
8// This file is not part of the Qt API. It exists for the convenience
9// of Qt Designer. This header file may change from version to version
10// without notice, or even be removed.
11//
12// We mean it.
13//
14
15#ifndef QTPROPERTYBROWSER_H
16#define QTPROPERTYBROWSER_H
17
18#include <QtWidgets/QWidget>
19#include <QtCore/QSet>
20
21QT_BEGIN_NAMESPACE
22
23class QtAbstractPropertyManager;
24class QtPropertyPrivate;
25
26class QtProperty
27{
28public:
29 virtual ~QtProperty();
30
31 QList<QtProperty *> subProperties() const;
32 QtProperty *parentProperty() const;
33
34 QtAbstractPropertyManager *propertyManager() const;
35
36 QString toolTip() const { return valueToolTip(); } // Compatibility
37 QString valueToolTip() const;
38 QString descriptionToolTip() const;
39 QString statusTip() const;
40 QString whatsThis() const;
41 QString propertyName() const;
42 bool isEnabled() const;
43 bool isModified() const;
44
45 bool hasValue() const;
46 QIcon valueIcon() const;
47 QString valueText() const;
48
49 void setToolTip(const QString &text) { setValueToolTip(text); } // Compatibility
50 void setValueToolTip(const QString &text);
51 void setDescriptionToolTip(const QString &text);
52 void setStatusTip(const QString &text);
53 void setWhatsThis(const QString &text);
54 void setPropertyName(const QString &text);
55 void setEnabled(bool enable);
56 void setModified(bool modified);
57
58 void addSubProperty(QtProperty *property);
59 void insertSubProperty(QtProperty *property, QtProperty *afterProperty);
60 void removeSubProperty(QtProperty *property);
61protected:
62 explicit QtProperty(QtAbstractPropertyManager *manager);
63 void propertyChanged();
64private:
65 friend class QtAbstractPropertyManager;
66 QScopedPointer<QtPropertyPrivate> d_ptr;
67};
68
69class QtAbstractPropertyManagerPrivate;
70
71class QtAbstractPropertyManager : public QObject
72{
73 Q_OBJECT
74public:
75 explicit QtAbstractPropertyManager(QObject *parent = nullptr);
76 ~QtAbstractPropertyManager() override;
77
78 QSet<QtProperty *> properties() const;
79 void clear() const;
80
81 QtProperty *addProperty(const QString &name = QString());
82Q_SIGNALS:
83 void propertyInserted(QtProperty *property, QtProperty *parent, QtProperty *after);
84 void propertyChanged(QtProperty *property);
85 void propertyRemoved(QtProperty *property, QtProperty *parent);
86 void propertyDestroyed(QtProperty *property);
87protected:
88 virtual bool hasValue(const QtProperty *property) const;
89 virtual QIcon valueIcon(const QtProperty *property) const;
90 virtual QString valueText(const QtProperty *property) const;
91 virtual void initializeProperty(QtProperty *property) = 0;
92 virtual void uninitializeProperty(QtProperty *property);
93 virtual QtProperty *createProperty();
94private:
95 friend class QtProperty;
96 QScopedPointer<QtAbstractPropertyManagerPrivate> d_ptr;
97 Q_DECLARE_PRIVATE(QtAbstractPropertyManager)
98 Q_DISABLE_COPY_MOVE(QtAbstractPropertyManager)
99};
100
101class QtAbstractEditorFactoryBase : public QObject
102{
103 Q_OBJECT
104public:
105 virtual QWidget *createEditor(QtProperty *property, QWidget *parent) = 0;
106protected:
107 explicit QtAbstractEditorFactoryBase(QObject *parent = nullptr) : QObject(parent) { }
108
109 virtual void breakConnection(QtAbstractPropertyManager *manager) = 0;
110protected Q_SLOTS:
111 virtual void managerDestroyed(QObject *manager) = 0;
112
113 friend class QtAbstractPropertyBrowser;
114};
115
116template <class PropertyManager>
117class QtAbstractEditorFactory : public QtAbstractEditorFactoryBase
118{
119public:
120 explicit QtAbstractEditorFactory(QObject *parent) : QtAbstractEditorFactoryBase(parent) {}
121 QWidget *createEditor(QtProperty *property, QWidget *parent) override
122 {
123 for (PropertyManager *manager : std::as_const(m_managers)) {
124 if (manager == property->propertyManager()) {
125 return createEditor(manager, property, parent);
126 }
127 }
128 return nullptr;
129 }
130 void addPropertyManager(PropertyManager *manager)
131 {
132 if (m_managers.contains(manager))
133 return;
134 m_managers.insert(manager);
135 connectPropertyManager(manager);
136 connect(manager, &QObject::destroyed,
137 this, &QtAbstractEditorFactory<PropertyManager>::managerDestroyed);
138 }
139 void removePropertyManager(PropertyManager *manager)
140 {
141 auto it = m_managers.constFind(manager);
142 if (it == m_managers.cend())
143 return;
144 disconnect(manager, &QObject::destroyed,
145 this, &QtAbstractEditorFactory<PropertyManager>::managerDestroyed);
146 disconnectPropertyManager(manager);
147 m_managers.erase(it);
148 }
149 QSet<PropertyManager *> propertyManagers() const
150 {
151 return m_managers;
152 }
153 PropertyManager *propertyManager(QtProperty *property) const
154 {
155 QtAbstractPropertyManager *manager = property->propertyManager();
156 for (PropertyManager *m : std::as_const(m_managers)) {
157 if (m == manager) {
158 return m;
159 }
160 }
161 return 0;
162 }
163protected:
164 virtual void connectPropertyManager(PropertyManager *manager) = 0;
165 virtual QWidget *createEditor(PropertyManager *manager, QtProperty *property,
166 QWidget *parent) = 0;
167 virtual void disconnectPropertyManager(PropertyManager *manager) = 0;
168 void managerDestroyed(QObject *manager) override
169 {
170 for (PropertyManager *m : std::as_const(m_managers)) {
171 if (m == manager) {
172 m_managers.remove(m);
173 return;
174 }
175 }
176 }
177private:
178 void breakConnection(QtAbstractPropertyManager *manager) override
179 {
180 for (PropertyManager *m : std::as_const(m_managers)) {
181 if (m == manager) {
182 removePropertyManager(manager: m);
183 return;
184 }
185 }
186 }
187private:
188 QSet<PropertyManager *> m_managers;
189 friend class QtAbstractPropertyEditor;
190};
191
192class QtAbstractPropertyBrowser;
193class QtBrowserItemPrivate;
194
195class QtBrowserItem
196{
197public:
198 QtProperty *property() const;
199 QtBrowserItem *parent() const;
200 QList<QtBrowserItem *> children() const;
201 QtAbstractPropertyBrowser *browser() const;
202private:
203 explicit QtBrowserItem(QtAbstractPropertyBrowser *browser, QtProperty *property, QtBrowserItem *parent);
204 ~QtBrowserItem();
205 QScopedPointer<QtBrowserItemPrivate> d_ptr;
206 friend class QtAbstractPropertyBrowserPrivate;
207};
208
209class QtAbstractPropertyBrowserPrivate;
210
211class QtAbstractPropertyBrowser : public QWidget
212{
213 Q_OBJECT
214public:
215 explicit QtAbstractPropertyBrowser(QWidget *parent = nullptr);
216 ~QtAbstractPropertyBrowser() override;
217
218 QList<QtProperty *> properties() const;
219 QList<QtBrowserItem *> items(QtProperty *property) const;
220 QtBrowserItem *topLevelItem(QtProperty *property) const;
221 QList<QtBrowserItem *> topLevelItems() const;
222 void clear();
223
224 template <class PropertyManager>
225 void setFactoryForManager(PropertyManager *manager,
226 QtAbstractEditorFactory<PropertyManager> *factory) {
227 QtAbstractPropertyManager *abstractManager = manager;
228 QtAbstractEditorFactoryBase *abstractFactory = factory;
229
230 if (addFactory(abstractManager, abstractFactory))
231 factory->addPropertyManager(manager);
232 }
233
234 void unsetFactoryForManager(QtAbstractPropertyManager *manager);
235
236 QtBrowserItem *currentItem() const;
237 void setCurrentItem(QtBrowserItem *);
238
239Q_SIGNALS:
240 void currentItemChanged(QtBrowserItem *);
241
242public Q_SLOTS:
243
244 QtBrowserItem *addProperty(QtProperty *property);
245 QtBrowserItem *insertProperty(QtProperty *property, QtProperty *afterProperty);
246 void removeProperty(QtProperty *property);
247
248protected:
249
250 virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) = 0;
251 virtual void itemRemoved(QtBrowserItem *item) = 0;
252 // can be tooltip, statustip, whatsthis, name, icon, text.
253 virtual void itemChanged(QtBrowserItem *item) = 0;
254
255 virtual QWidget *createEditor(QtProperty *property, QWidget *parent);
256private:
257
258 bool addFactory(QtAbstractPropertyManager *abstractManager,
259 QtAbstractEditorFactoryBase *abstractFactory);
260
261 QScopedPointer<QtAbstractPropertyBrowserPrivate> d_ptr;
262 Q_DECLARE_PRIVATE(QtAbstractPropertyBrowser)
263 Q_DISABLE_COPY_MOVE(QtAbstractPropertyBrowser)
264};
265
266QT_END_NAMESPACE
267
268#endif // QTPROPERTYBROWSER_H
269

source code of qttools/src/shared/qtpropertybrowser/qtpropertybrowser_p.h