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;
42 int keysToValue(
const QString &keys)
const override;
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;
49 QString valueToKeys(
int value)
const override;
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
69 int QDesignerMetaEnum::keyToValue(
const QString &key)
const
71 return m_enum.keyToValue(key.toUtf8().constData());
74 int QDesignerMetaEnum::keysToValue(
const QString &keys)
const
76 return m_enum.keysToValue(keys.toUtf8().constData());
79 QString QDesignerMetaEnum::valueToKey(
int value)
const
81 return charToQString(m_enum.valueToKey(value));
84 QString QDesignerMetaEnum::valueToKeys(
int value)
const
86 return QString::fromUtf8(m_enum.valueToKeys(value));
90 class QDesignerMetaProperty :
public QDesignerMetaPropertyInterface {
92 QDesignerMetaProperty(
const QMetaProperty &property);
93 ~QDesignerMetaProperty() override;
95 const QDesignerMetaEnumInterface *enumerator()
const override {
return m_enumerator; }
97 Kind kind()
const override {
return m_kind; }
99 AccessFlags accessFlags()
const override {
return m_access; }
100 Attributes attributes()
const override;
102 int type()
const override {
return m_property.metaType().id(); }
103 QString name()
const override {
return m_name; }
104 QString typeName()
const override {
return m_typeName; }
105 int userType()
const override {
return m_property.userType(); }
106 bool hasSetter()
const override {
return m_property.hasStdCppSet(); }
108 QVariant read(
const QObject *object)
const override {
return m_property.read(object); }
109 bool reset(QObject *object)
const override {
return m_property.reset(object); }
110 bool write(QObject *object,
const QVariant &value)
const override {
return m_property.write(object, value); }
113 const QMetaProperty m_property;
114 const QString m_name;
115 const QString m_typeName;
117 AccessFlags m_access;
118 Attributes m_defaultAttributes;
119 QDesignerMetaEnumInterface *m_enumerator;
122 QDesignerMetaProperty::QDesignerMetaProperty(
const QMetaProperty &property) :
123 m_property(property),
124 m_name(charToQString(m_property.name())),
125 m_typeName(charToQString(m_property.typeName())),
127 m_enumerator(
nullptr)
129 if (m_property.isFlagType() || m_property.isEnumType()) {
130 const QMetaEnum metaEnum = m_property.enumerator();
131 Q_ASSERT(metaEnum.isValid());
132 m_enumerator =
new QDesignerMetaEnum(metaEnum);
135 if (m_property.isFlagType())
138 if (m_property.isEnumType())
141 if (m_property.isReadable())
142 m_access |= ReadAccess;
143 if (m_property.isWritable())
144 m_access |= WriteAccess;
145 if (m_property.isResettable())
146 m_access |= ResetAccess;
148 if (m_property.isDesignable())
149 m_defaultAttributes |= DesignableAttribute;
150 if (m_property.isScriptable())
151 m_defaultAttributes |= ScriptableAttribute;
152 if (m_property.isStored())
153 m_defaultAttributes |= StoredAttribute;
154 if (m_property.isUser())
155 m_defaultAttributes |= UserAttribute;
158 QDesignerMetaProperty::~QDesignerMetaProperty()
163 QDesignerMetaProperty::Attributes QDesignerMetaProperty::attributes()
const
165 return m_defaultAttributes;
170 class QDesignerMetaMethod :
public QDesignerMetaMethodInterface {
172 QDesignerMetaMethod(
const QMetaMethod &method);
174 Access access()
const override {
return m_access; }
175 MethodType methodType()
const override {
return m_methodType; }
176 QStringList parameterNames()
const override {
return m_parameterNames; }
177 QStringList parameterTypes()
const override {
return m_parameterTypes; }
178 QString signature()
const override {
return m_signature; }
179 QString normalizedSignature()
const override {
return m_normalizedSignature; }
180 QString tag()
const override {
return m_tag; }
181 QString typeName()
const override {
return m_typeName; }
185 MethodType m_methodType;
186 const QStringList m_parameterNames;
187 const QStringList m_parameterTypes;
188 const QString m_signature;
189 const QString m_normalizedSignature;
191 const QString m_typeName;
194 QDesignerMetaMethod::QDesignerMetaMethod(
const QMetaMethod &method) :
195 m_parameterNames(byteArrayListToStringList(method.parameterNames())),
196 m_parameterTypes(byteArrayListToStringList(method.parameterTypes())),
197 m_signature(QString::fromLatin1(method.methodSignature())),
198 m_normalizedSignature(QString::fromLatin1(QMetaObject::normalizedSignature(method.methodSignature().constData()))),
199 m_tag(charToQString(method.tag())),
200 m_typeName(charToQString(method.typeName()))
202 switch (method.access()) {
203 case QMetaMethod::Public:
206 case QMetaMethod::Protected:
207 m_access = Protected;
209 case QMetaMethod::Private:
214 switch (method.methodType()) {
215 case QMetaMethod::Constructor:
216 m_methodType = Constructor;
218 case QMetaMethod::Method:
219 m_methodType = Method;
221 case QMetaMethod::Signal:
222 m_methodType = Signal;
225 case QMetaMethod::Slot:
232 class QDesignerMetaObject :
public QDesignerMetaObjectInterface {
234 QDesignerMetaObject(
const qdesigner_internal::QDesignerIntrospection *introspection,
const QMetaObject *metaObject);
235 ~QDesignerMetaObject() override;
237 QString className()
const override {
return m_className; }
238 const QDesignerMetaEnumInterface *enumerator(
int index)
const override
239 {
return m_enumerators[index]; }
240 int enumeratorCount()
const override {
return m_enumerators.size(); }
241 int enumeratorOffset()
const override {
return m_metaObject->enumeratorOffset(); }
243 int indexOfEnumerator(
const QString &name)
const override
244 {
return m_metaObject->indexOfEnumerator(name.toUtf8().constData()); }
245 int indexOfMethod(
const QString &method)
const override
246 {
return m_metaObject->indexOfMethod(method.toUtf8().constData()); }
247 int indexOfProperty(
const QString &name)
const override
248 {
return m_metaObject->indexOfProperty(name.toUtf8().constData()); }
249 int indexOfSignal(
const QString &signal)
const override
250 {
return m_metaObject->indexOfSignal(signal.toUtf8().constData()); }
251 int indexOfSlot(
const QString &slot)
const override
252 {
return m_metaObject->indexOfSlot(slot.toUtf8().constData()); }
254 const QDesignerMetaMethodInterface *method(
int index)
const override
255 {
return m_methods[index]; }
256 int methodCount()
const override {
return m_methods.size(); }
257 int methodOffset()
const override {
return m_metaObject->methodOffset(); }
259 const QDesignerMetaPropertyInterface *property(
int index)
const override
260 {
return m_properties[index]; }
261 int propertyCount()
const override {
return m_properties.size(); }
262 int propertyOffset()
const override {
return m_metaObject->propertyOffset(); }
264 const QDesignerMetaObjectInterface *superClass()
const override;
265 const QDesignerMetaPropertyInterface *userProperty()
const override
266 {
return m_userProperty; }
269 const QString m_className;
270 const qdesigner_internal::QDesignerIntrospection *m_introspection;
271 const QMetaObject *m_metaObject;
273 using Enumerators = QList<QDesignerMetaEnumInterface *>;
274 Enumerators m_enumerators;
276 using Methods = QList<QDesignerMetaMethodInterface *>;
279 using Properties = QList<QDesignerMetaPropertyInterface *>;
280 Properties m_properties;
282 QDesignerMetaPropertyInterface *m_userProperty;
285 QDesignerMetaObject::QDesignerMetaObject(
const qdesigner_internal::QDesignerIntrospection *introspection,
const QMetaObject *metaObject) :
286 m_className(charToQString(metaObject->className())),
287 m_introspection(introspection),
288 m_metaObject(metaObject),
289 m_userProperty(
nullptr)
291 const int numEnumerators = metaObject->enumeratorCount();
292 m_enumerators.reserve(numEnumerators);
293 for (
int i = 0; i < numEnumerators; i++)
294 m_enumerators.push_back(
new QDesignerMetaEnum(metaObject->enumerator(i)));
295 const int numMethods = metaObject->methodCount();
296 m_methods.reserve(numMethods);
297 for (
int i = 0; i < numMethods; i++)
298 m_methods.push_back(
new QDesignerMetaMethod(metaObject->method(i)));
300 const int numProperties = metaObject->propertyCount();
301 m_properties.reserve(numProperties);
302 for (
int i = 0; i < numProperties; i++)
303 m_properties.push_back(
new QDesignerMetaProperty(metaObject->property(i)));
305 const QMetaProperty userProperty = metaObject->userProperty();
306 if (userProperty.isValid())
307 m_userProperty =
new QDesignerMetaProperty(userProperty);
310 QDesignerMetaObject::~QDesignerMetaObject()
312 qDeleteAll(m_enumerators);
313 qDeleteAll(m_methods);
314 qDeleteAll(m_properties);
315 delete m_userProperty;
318 const QDesignerMetaObjectInterface *QDesignerMetaObject::superClass()
const
320 const QMetaObject *qSuperClass = m_metaObject->superClass();
323 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)