6#include <QtCore/qobject.h>
7#include <QtCore/qlist.h>
8#include <QtCore/qmetaobject.h>
9#include <QtCore/qstringlist.h>
13using namespace Qt::StringLiterals;
21 for (
const QByteArray &b : l)
22 rc += QString::fromUtf8(b);
30 return QString::fromUtf8(c);
35 class QDesignerMetaEnum :
public QDesignerMetaEnumInterface {
37 QDesignerMetaEnum(
const QMetaEnum &qEnum);
38 bool isFlag()
const override {
return m_enum.isFlag(); }
39 QString key(
int index)
const override {
return charToQString(m_enum.key(index)); }
40 int keyCount()
const override {
return m_enum.keyCount(); }
41 int keyToValue(
const QString &key)
const override {
return m_enum.keyToValue(key.toUtf8()); }
42 int keysToValue(
const QString &keys)
const override {
return m_enum.keysToValue(keys.toUtf8()); }
43 QString name()
const override {
return m_name; }
44 QString enumName()
const override {
return charToQString(m_enum.enumName()); }
45 QString scope()
const override {
return m_scope; }
46 QString separator()
const override;
47 int value(
int index)
const override {
return m_enum.value(index); }
48 QString valueToKey(
int value)
const override {
return charToQString(m_enum.valueToKey(value)); }
49 QString valueToKeys(
int value)
const override {
return charToQString(m_enum.valueToKeys(value)); }
52 const QMetaEnum m_enum;
54 const QString m_scope;
57 QDesignerMetaEnum::QDesignerMetaEnum(
const QMetaEnum &qEnum) :
59 m_name(charToQString(m_enum.name())),
60 m_scope(charToQString(m_enum.scope()))
64 QString QDesignerMetaEnum::separator()
const
70 class QDesignerMetaProperty :
public QDesignerMetaPropertyInterface {
72 QDesignerMetaProperty(
const QMetaProperty &property);
73 ~QDesignerMetaProperty() override;
75 const QDesignerMetaEnumInterface *enumerator()
const override {
return m_enumerator; }
77 Kind kind()
const override {
return m_kind; }
79 AccessFlags accessFlags()
const override {
return m_access; }
80 Attributes attributes()
const override;
82 int type()
const override {
return m_property.metaType().id(); }
83 QString name()
const override {
return m_name; }
84 QString typeName()
const override {
return m_typeName; }
85 int userType()
const override {
return m_property.userType(); }
86 bool hasSetter()
const override {
return m_property.hasStdCppSet(); }
88 QVariant read(
const QObject *object)
const override {
return m_property.read(object); }
89 bool reset(QObject *object)
const override {
return m_property.reset(object); }
90 bool write(QObject *object,
const QVariant &value)
const override {
return m_property.write(object, value); }
93 const QMetaProperty m_property;
95 const QString m_typeName;
98 Attributes m_defaultAttributes;
99 QDesignerMetaEnumInterface *m_enumerator;
102 QDesignerMetaProperty::QDesignerMetaProperty(
const QMetaProperty &property) :
103 m_property(property),
104 m_name(charToQString(m_property.name())),
105 m_typeName(charToQString(m_property.typeName())),
107 m_enumerator(
nullptr)
109 if (m_property.isFlagType() || m_property.isEnumType()) {
110 const QMetaEnum metaEnum = m_property.enumerator();
111 Q_ASSERT(metaEnum.isValid());
112 m_enumerator =
new QDesignerMetaEnum(metaEnum);
115 if (m_property.isFlagType())
118 if (m_property.isEnumType())
121 if (m_property.isReadable())
122 m_access |= ReadAccess;
123 if (m_property.isWritable())
124 m_access |= WriteAccess;
125 if (m_property.isResettable())
126 m_access |= ResetAccess;
128 if (m_property.isDesignable())
129 m_defaultAttributes |= DesignableAttribute;
130 if (m_property.isScriptable())
131 m_defaultAttributes |= ScriptableAttribute;
132 if (m_property.isStored())
133 m_defaultAttributes |= StoredAttribute;
134 if (m_property.isUser())
135 m_defaultAttributes |= UserAttribute;
138 QDesignerMetaProperty::~QDesignerMetaProperty()
143 QDesignerMetaProperty::Attributes QDesignerMetaProperty::attributes()
const
145 return m_defaultAttributes;
150 class QDesignerMetaMethod :
public QDesignerMetaMethodInterface {
152 QDesignerMetaMethod(
const QMetaMethod &method);
154 Access access()
const override {
return m_access; }
155 MethodType methodType()
const override {
return m_methodType; }
156 QStringList parameterNames()
const override {
return m_parameterNames; }
157 QStringList parameterTypes()
const override {
return m_parameterTypes; }
158 QString signature()
const override {
return m_signature; }
159 QString normalizedSignature()
const override {
return m_normalizedSignature; }
160 QString tag()
const override {
return m_tag; }
161 QString typeName()
const override {
return m_typeName; }
165 MethodType m_methodType;
166 const QStringList m_parameterNames;
167 const QStringList m_parameterTypes;
168 const QString m_signature;
169 const QString m_normalizedSignature;
171 const QString m_typeName;
174 QDesignerMetaMethod::QDesignerMetaMethod(
const QMetaMethod &method) :
175 m_parameterNames(byteArrayListToStringList(method.parameterNames())),
176 m_parameterTypes(byteArrayListToStringList(method.parameterTypes())),
177 m_signature(QString::fromLatin1(method.methodSignature())),
178 m_normalizedSignature(QString::fromLatin1(QMetaObject::normalizedSignature(method.methodSignature().constData()))),
179 m_tag(charToQString(method.tag())),
180 m_typeName(charToQString(method.typeName()))
182 switch (method.access()) {
183 case QMetaMethod::Public:
186 case QMetaMethod::Protected:
187 m_access = Protected;
189 case QMetaMethod::Private:
194 switch (method.methodType()) {
195 case QMetaMethod::Constructor:
196 m_methodType = Constructor;
198 case QMetaMethod::Method:
199 m_methodType = Method;
201 case QMetaMethod::Signal:
202 m_methodType = Signal;
205 case QMetaMethod::Slot:
212 class QDesignerMetaObject :
public QDesignerMetaObjectInterface {
214 QDesignerMetaObject(
const qdesigner_internal::QDesignerIntrospection *introspection,
const QMetaObject *metaObject);
215 ~QDesignerMetaObject() override;
217 QString className()
const override {
return m_className; }
218 const QDesignerMetaEnumInterface *enumerator(
int index)
const override
219 {
return m_enumerators[index]; }
220 int enumeratorCount()
const override {
return m_enumerators.size(); }
221 int enumeratorOffset()
const override {
return m_metaObject->enumeratorOffset(); }
223 int indexOfEnumerator(
const QString &name)
const override
224 {
return m_metaObject->indexOfEnumerator(name.toUtf8()); }
225 int indexOfMethod(
const QString &method)
const override
226 {
return m_metaObject->indexOfMethod(method.toUtf8()); }
227 int indexOfProperty(
const QString &name)
const override
228 {
return m_metaObject->indexOfProperty(name.toUtf8()); }
229 int indexOfSignal(
const QString &signal)
const override
230 {
return m_metaObject->indexOfSignal(signal.toUtf8()); }
231 int indexOfSlot(
const QString &slot)
const override
232 {
return m_metaObject->indexOfSlot(slot.toUtf8()); }
234 const QDesignerMetaMethodInterface *method(
int index)
const override
235 {
return m_methods[index]; }
236 int methodCount()
const override {
return m_methods.size(); }
237 int methodOffset()
const override {
return m_metaObject->methodOffset(); }
239 const QDesignerMetaPropertyInterface *property(
int index)
const override
240 {
return m_properties[index]; }
241 int propertyCount()
const override {
return m_properties.size(); }
242 int propertyOffset()
const override {
return m_metaObject->propertyOffset(); }
244 const QDesignerMetaObjectInterface *superClass()
const override;
245 const QDesignerMetaPropertyInterface *userProperty()
const override
246 {
return m_userProperty; }
249 const QString m_className;
250 const qdesigner_internal::QDesignerIntrospection *m_introspection;
251 const QMetaObject *m_metaObject;
253 using Enumerators = QList<QDesignerMetaEnumInterface *>;
254 Enumerators m_enumerators;
256 using Methods = QList<QDesignerMetaMethodInterface *>;
259 using Properties = QList<QDesignerMetaPropertyInterface *>;
260 Properties m_properties;
262 QDesignerMetaPropertyInterface *m_userProperty;
265 QDesignerMetaObject::QDesignerMetaObject(
const qdesigner_internal::QDesignerIntrospection *introspection,
const QMetaObject *metaObject) :
266 m_className(charToQString(metaObject->className())),
267 m_introspection(introspection),
268 m_metaObject(metaObject),
269 m_userProperty(
nullptr)
271 const int numEnumerators = metaObject->enumeratorCount();
272 m_enumerators.reserve(numEnumerators);
273 for (
int i = 0; i < numEnumerators; i++)
274 m_enumerators.push_back(
new QDesignerMetaEnum(metaObject->enumerator(i)));
275 const int numMethods = metaObject->methodCount();
276 m_methods.reserve(numMethods);
277 for (
int i = 0; i < numMethods; i++)
278 m_methods.push_back(
new QDesignerMetaMethod(metaObject->method(i)));
280 const int numProperties = metaObject->propertyCount();
281 m_properties.reserve(numProperties);
282 for (
int i = 0; i < numProperties; i++)
283 m_properties.push_back(
new QDesignerMetaProperty(metaObject->property(i)));
285 const QMetaProperty userProperty = metaObject->userProperty();
286 if (userProperty.isValid())
287 m_userProperty =
new QDesignerMetaProperty(userProperty);
290 QDesignerMetaObject::~QDesignerMetaObject()
292 qDeleteAll(m_enumerators);
293 qDeleteAll(m_methods);
294 qDeleteAll(m_properties);
295 delete m_userProperty;
298 const QDesignerMetaObjectInterface *QDesignerMetaObject::superClass()
const
300 const QMetaObject *qSuperClass = m_metaObject->superClass();
303 return m_introspection->metaObjectForQMetaObject(qSuperClass);
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
static QString charToQString(const char *c)
static QStringList byteArrayListToStringList(const QByteArrayList &l)