7#include <QtCore/qobject.h>
8#include <QtCore/qlist.h>
9#include <QtCore/qmetaobject.h>
10#include <QtCore/qstringlist.h>
14using namespace Qt::StringLiterals;
22 for (
const QByteArray &b : l)
23 rc += QString::fromUtf8(b);
31 return QString::fromUtf8(c);
36 class QDesignerMetaEnum :
public QDesignerMetaEnumInterface {
38 QDesignerMetaEnum(
const QMetaEnum &qEnum);
39 bool isFlag()
const override {
return m_enum.isFlag(); }
40 QString key(
int index)
const override {
return charToQString(m_enum.key(index)); }
41 int keyCount()
const override {
return m_enum.keyCount(); }
42 int keyToValue(
const QString &key)
const override;
43 int keysToValue(
const QString &keys)
const override;
44 QString name()
const override {
return m_name; }
45 QString enumName()
const override {
return charToQString(m_enum.enumName()); }
46 QString scope()
const override {
return m_scope; }
47 QString separator()
const override;
48 int value(
int index)
const override {
return m_enum.value(index); }
49 QString valueToKey(
int value)
const override;
50 QString valueToKeys(
int value)
const override;
53 const QMetaEnum m_enum;
55 const QString m_scope;
58 QDesignerMetaEnum::QDesignerMetaEnum(
const QMetaEnum &qEnum) :
60 m_name(charToQString(m_enum.name())),
61 m_scope(charToQString(m_enum.scope()))
65 QString QDesignerMetaEnum::separator()
const
70 int QDesignerMetaEnum::keyToValue(
const QString &key)
const
72 return m_enum.keyToValue(key.toUtf8().constData());
75 int QDesignerMetaEnum::keysToValue(
const QString &keys)
const
77 return m_enum.keysToValue(keys.toUtf8().constData());
80 QString QDesignerMetaEnum::valueToKey(
int value)
const
82 return charToQString(m_enum.valueToKey(value));
85 QString QDesignerMetaEnum::valueToKeys(
int value)
const
87 return QString::fromUtf8(m_enum.valueToKeys(value));
91 class QDesignerMetaProperty :
public QDesignerMetaPropertyInterface {
93 QDesignerMetaProperty(
const QMetaProperty &property);
94 ~QDesignerMetaProperty() override;
96 const QDesignerMetaEnumInterface *enumerator()
const override {
return m_enumerator; }
98 Kind kind()
const override {
return m_kind; }
100 AccessFlags accessFlags()
const override {
return m_access; }
101 Attributes attributes()
const override;
103 int type()
const override {
return m_property.metaType().id(); }
104 QString name()
const override {
return m_name; }
105 QString typeName()
const override {
return m_typeName; }
106 int userType()
const override {
return m_property.userType(); }
107 bool hasSetter()
const override {
return m_property.hasStdCppSet(); }
109 QVariant read(
const QObject *object)
const override {
return m_property.read(object); }
110 bool reset(QObject *object)
const override {
return m_property.reset(object); }
111 bool write(QObject *object,
const QVariant &value)
const override {
return m_property.write(object, value); }
114 const QMetaProperty m_property;
115 const QString m_name;
116 const QString m_typeName;
118 AccessFlags m_access;
119 Attributes m_defaultAttributes;
120 QDesignerMetaEnumInterface *m_enumerator;
123 QDesignerMetaProperty::QDesignerMetaProperty(
const QMetaProperty &property) :
124 m_property(property),
125 m_name(charToQString(m_property.name())),
126 m_typeName(charToQString(m_property.typeName())),
128 m_enumerator(
nullptr)
130 if (m_property.isFlagType() || m_property.isEnumType()) {
131 const QMetaEnum metaEnum = m_property.enumerator();
132 Q_ASSERT(metaEnum.isValid());
133 m_enumerator =
new QDesignerMetaEnum(metaEnum);
136 if (m_property.isFlagType())
139 if (m_property.isEnumType())
142 if (m_property.isReadable())
143 m_access |= ReadAccess;
144 if (m_property.isWritable())
145 m_access |= WriteAccess;
146 if (m_property.isResettable())
147 m_access |= ResetAccess;
149 if (m_property.isDesignable())
150 m_defaultAttributes |= DesignableAttribute;
151 if (m_property.isScriptable())
152 m_defaultAttributes |= ScriptableAttribute;
153 if (m_property.isStored())
154 m_defaultAttributes |= StoredAttribute;
155 if (m_property.isUser())
156 m_defaultAttributes |= UserAttribute;
159 QDesignerMetaProperty::~QDesignerMetaProperty()
164 QDesignerMetaProperty::Attributes QDesignerMetaProperty::attributes()
const
166 return m_defaultAttributes;
171 class QDesignerMetaMethod :
public QDesignerMetaMethodInterface {
173 QDesignerMetaMethod(
const QMetaMethod &method);
175 Access access()
const override {
return m_access; }
176 MethodType methodType()
const override {
return m_methodType; }
177 QStringList parameterNames()
const override {
return m_parameterNames; }
178 QStringList parameterTypes()
const override {
return m_parameterTypes; }
179 QString signature()
const override {
return m_signature; }
180 QString normalizedSignature()
const override {
return m_normalizedSignature; }
181 QString tag()
const override {
return m_tag; }
182 QString typeName()
const override {
return m_typeName; }
186 MethodType m_methodType;
187 const QStringList m_parameterNames;
188 const QStringList m_parameterTypes;
189 const QString m_signature;
190 const QString m_normalizedSignature;
192 const QString m_typeName;
195 QDesignerMetaMethod::QDesignerMetaMethod(
const QMetaMethod &method) :
196 m_parameterNames(byteArrayListToStringList(method.parameterNames())),
197 m_parameterTypes(byteArrayListToStringList(method.parameterTypes())),
198 m_signature(QString::fromLatin1(method.methodSignature())),
199 m_normalizedSignature(QString::fromLatin1(QMetaObject::normalizedSignature(method.methodSignature().constData()))),
200 m_tag(charToQString(method.tag())),
201 m_typeName(charToQString(method.typeName()))
203 switch (method.access()) {
204 case QMetaMethod::Public:
207 case QMetaMethod::Protected:
208 m_access = Protected;
210 case QMetaMethod::Private:
215 switch (method.methodType()) {
216 case QMetaMethod::Constructor:
217 m_methodType = Constructor;
219 case QMetaMethod::Method:
220 m_methodType = Method;
222 case QMetaMethod::Signal:
223 m_methodType = Signal;
226 case QMetaMethod::Slot:
233 class QDesignerMetaObject :
public QDesignerMetaObjectInterface {
235 QDesignerMetaObject(
const qdesigner_internal::QDesignerIntrospection *introspection,
const QMetaObject *metaObject);
236 ~QDesignerMetaObject() override;
238 QString className()
const override {
return m_className; }
239 const QDesignerMetaEnumInterface *enumerator(
int index)
const override
240 {
return m_enumerators[index]; }
241 int enumeratorCount()
const override {
return m_enumerators.size(); }
242 int enumeratorOffset()
const override {
return m_metaObject->enumeratorOffset(); }
244 int indexOfEnumerator(
const QString &name)
const override
245 {
return m_metaObject->indexOfEnumerator(name.toUtf8().constData()); }
246 int indexOfMethod(
const QString &method)
const override
247 {
return m_metaObject->indexOfMethod(method.toUtf8().constData()); }
248 int indexOfProperty(
const QString &name)
const override
249 {
return m_metaObject->indexOfProperty(name.toUtf8().constData()); }
250 int indexOfSignal(
const QString &signal)
const override
251 {
return m_metaObject->indexOfSignal(signal.toUtf8().constData()); }
252 int indexOfSlot(
const QString &slot)
const override
253 {
return m_metaObject->indexOfSlot(slot.toUtf8().constData()); }
255 const QDesignerMetaMethodInterface *method(
int index)
const override
256 {
return m_methods[index]; }
257 int methodCount()
const override {
return m_methods.size(); }
258 int methodOffset()
const override {
return m_metaObject->methodOffset(); }
260 const QDesignerMetaPropertyInterface *property(
int index)
const override
261 {
return m_properties[index]; }
262 int propertyCount()
const override {
return m_properties.size(); }
263 int propertyOffset()
const override {
return m_metaObject->propertyOffset(); }
265 const QDesignerMetaObjectInterface *superClass()
const override;
266 const QDesignerMetaPropertyInterface *userProperty()
const override
267 {
return m_userProperty; }
270 const QString m_className;
271 const qdesigner_internal::QDesignerIntrospection *m_introspection;
272 const QMetaObject *m_metaObject;
274 using Enumerators = QList<QDesignerMetaEnumInterface *>;
275 Enumerators m_enumerators;
277 using Methods = QList<QDesignerMetaMethodInterface *>;
280 using Properties = QList<QDesignerMetaPropertyInterface *>;
281 Properties m_properties;
283 QDesignerMetaPropertyInterface *m_userProperty;
286 QDesignerMetaObject::QDesignerMetaObject(
const qdesigner_internal::QDesignerIntrospection *introspection,
const QMetaObject *metaObject) :
287 m_className(charToQString(metaObject->className())),
288 m_introspection(introspection),
289 m_metaObject(metaObject),
290 m_userProperty(
nullptr)
292 const int numEnumerators = metaObject->enumeratorCount();
293 m_enumerators.reserve(numEnumerators);
294 for (
int i = 0; i < numEnumerators; i++)
295 m_enumerators.push_back(
new QDesignerMetaEnum(metaObject->enumerator(i)));
296 const int numMethods = metaObject->methodCount();
297 m_methods.reserve(numMethods);
298 for (
int i = 0; i < numMethods; i++)
299 m_methods.push_back(
new QDesignerMetaMethod(metaObject->method(i)));
301 const int numProperties = metaObject->propertyCount();
302 m_properties.reserve(numProperties);
303 for (
int i = 0; i < numProperties; i++)
304 m_properties.push_back(
new QDesignerMetaProperty(metaObject->property(i)));
306 const QMetaProperty userProperty = metaObject->userProperty();
307 if (userProperty.isValid())
308 m_userProperty =
new QDesignerMetaProperty(userProperty);
311 QDesignerMetaObject::~QDesignerMetaObject()
313 qDeleteAll(m_enumerators);
314 qDeleteAll(m_methods);
315 qDeleteAll(m_properties);
316 delete m_userProperty;
319 const QDesignerMetaObjectInterface *QDesignerMetaObject::superClass()
const
321 const QMetaObject *qSuperClass = m_metaObject->superClass();
324 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)