1 /*
2  * DQt - D bindings for the Qt Toolkit
3  *
4  * GNU Lesser General Public License Usage
5  * This file may be used under the terms of the GNU Lesser
6  * General Public License version 3 as published by the Free Software
7  * Foundation and appearing in the file LICENSE.LGPL3 included in the
8  * packaging of this file. Please review the following information to
9  * ensure the GNU Lesser General Public License version 3 requirements
10  * will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
11  */
12 module qt.core.metaobject;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.bytearray;
17 import qt.core.global;
18 import qt.core.list;
19 import qt.core.metatype;
20 import qt.core.namespace;
21 import qt.core.object;
22 import qt.core.objectdefs;
23 import qt.core.property;
24 import qt.core.typeinfo;
25 import qt.core.variant;
26 import qt.helpers;
27 
28 
29 /+ #define Q_METAMETHOD_INVOKE_MAX_ARGS 10 +/
30 
31 /// Binding for C++ class [QMetaMethod](https://doc.qt.io/qt-6/qmetamethod.html).
32 @Q_RELOCATABLE_TYPE extern(C++, class) struct /+ Q_CORE_EXPORT +/ QMetaMethod
33 {
34 public:
35     @disable this();
36     /+pragma(inline, true) this()
37     {
38         this.mobj = null;
39         this.data = { null} ;
40     }+/
41 
42     QByteArray methodSignature() const;
43     QByteArray name() const;
44     const(char)* typeName() const;
45     int returnType() const;
46     QMetaType returnMetaType() const;
47     int parameterCount() const;
48     int parameterType(int index) const;
49     QMetaType parameterMetaType(int index) const;
50     void getParameterTypes(int* types) const;
51     QList!(QByteArray) parameterTypes() const;
52     QByteArray parameterTypeName(int index) const;
53     QList!(QByteArray) parameterNames() const;
54     const(char)* tag() const;
55     enum Access { Private, Protected, Public }
56     Access access() const;
57     enum MethodType { Method, Signal, Slot, Constructor }
58     MethodType methodType() const;
59     enum Attributes { Compatibility = 0x1, Cloned = 0x2, Scriptable = 0x4 }
60     int attributes() const;
61     int methodIndex() const;
62     int relativeMethodIndex() const;
63     int revision() const;
64     bool isConst() const;
65 
66     pragma(inline, true) const(QMetaObject)* enclosingMetaObject() const { return mobj; }
67 
68     bool invoke(QObject object,
69                     /+ Qt:: +/qt.core.namespace.ConnectionType connectionType,
70                     QGenericReturnArgument returnValue,
71                     QGenericArgument val0 = QGenericArgument(null),
72                     QGenericArgument val1 = QGenericArgument(),
73                     QGenericArgument val2 = QGenericArgument(),
74                     QGenericArgument val3 = QGenericArgument(),
75                     QGenericArgument val4 = QGenericArgument(),
76                     QGenericArgument val5 = QGenericArgument(),
77                     QGenericArgument val6 = QGenericArgument(),
78                     QGenericArgument val7 = QGenericArgument(),
79                     QGenericArgument val8 = QGenericArgument(),
80                     QGenericArgument val9 = QGenericArgument()) const;
81     pragma(inline, true) bool invoke(QObject object,
82                            QGenericReturnArgument returnValue,
83                            QGenericArgument val0 = QGenericArgument(null),
84                            QGenericArgument val1 = QGenericArgument(),
85                            QGenericArgument val2 = QGenericArgument(),
86                            QGenericArgument val3 = QGenericArgument(),
87                            QGenericArgument val4 = QGenericArgument(),
88                            QGenericArgument val5 = QGenericArgument(),
89                            QGenericArgument val6 = QGenericArgument(),
90                            QGenericArgument val7 = QGenericArgument(),
91                            QGenericArgument val8 = QGenericArgument(),
92                            QGenericArgument val9 = QGenericArgument()) const
93     {
94         return invoke(object, /+ Qt:: +/qt.core.namespace.ConnectionType.AutoConnection, returnValue,
95                       val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
96     }
97     pragma(inline, true) bool invoke(QObject object,
98                            /+ Qt:: +/qt.core.namespace.ConnectionType connectionType,
99                            QGenericArgument val0 = QGenericArgument(null),
100                            QGenericArgument val1 = QGenericArgument(),
101                            QGenericArgument val2 = QGenericArgument(),
102                            QGenericArgument val3 = QGenericArgument(),
103                            QGenericArgument val4 = QGenericArgument(),
104                            QGenericArgument val5 = QGenericArgument(),
105                            QGenericArgument val6 = QGenericArgument(),
106                            QGenericArgument val7 = QGenericArgument(),
107                            QGenericArgument val8 = QGenericArgument(),
108                            QGenericArgument val9 = QGenericArgument()) const
109     {
110         return invoke(object, connectionType, QGenericReturnArgument(),
111                       val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
112     }
113     pragma(inline, true) bool invoke(QObject object,
114                            QGenericArgument val0 = QGenericArgument(null),
115                            QGenericArgument val1 = QGenericArgument(),
116                            QGenericArgument val2 = QGenericArgument(),
117                            QGenericArgument val3 = QGenericArgument(),
118                            QGenericArgument val4 = QGenericArgument(),
119                            QGenericArgument val5 = QGenericArgument(),
120                            QGenericArgument val6 = QGenericArgument(),
121                            QGenericArgument val7 = QGenericArgument(),
122                            QGenericArgument val8 = QGenericArgument(),
123                            QGenericArgument val9 = QGenericArgument()) const
124     {
125         return invoke(object, /+ Qt:: +/qt.core.namespace.ConnectionType.AutoConnection, QGenericReturnArgument(),
126                       val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
127     }
128     bool invokeOnGadget(void* gadget,
129                             QGenericReturnArgument returnValue,
130                             QGenericArgument val0 = QGenericArgument(null),
131                             QGenericArgument val1 = QGenericArgument(),
132                             QGenericArgument val2 = QGenericArgument(),
133                             QGenericArgument val3 = QGenericArgument(),
134                             QGenericArgument val4 = QGenericArgument(),
135                             QGenericArgument val5 = QGenericArgument(),
136                             QGenericArgument val6 = QGenericArgument(),
137                             QGenericArgument val7 = QGenericArgument(),
138                             QGenericArgument val8 = QGenericArgument(),
139                             QGenericArgument val9 = QGenericArgument()) const;
140     pragma(inline, true) bool invokeOnGadget(void* gadget,
141                                    QGenericArgument val0 = QGenericArgument(null),
142                                    QGenericArgument val1 = QGenericArgument(),
143                                    QGenericArgument val2 = QGenericArgument(),
144                                    QGenericArgument val3 = QGenericArgument(),
145                                    QGenericArgument val4 = QGenericArgument(),
146                                    QGenericArgument val5 = QGenericArgument(),
147                                    QGenericArgument val6 = QGenericArgument(),
148                                    QGenericArgument val7 = QGenericArgument(),
149                                    QGenericArgument val8 = QGenericArgument(),
150                                    QGenericArgument val9 = QGenericArgument()) const
151     {
152         return invokeOnGadget(gadget, QGenericReturnArgument(),
153                               val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
154     }
155 
156     pragma(inline, true) bool isValid() const { return mobj !is null; }
157 
158     /+ template <typename PointerToMemberFunction> +/
159     /+ static inline QMetaMethod fromSignal(PointerToMemberFunction signal)
160     {
161         typedef QtPrivate::FunctionPointer<PointerToMemberFunction> SignalType;
162         static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
163                       "No Q_OBJECT in the class with the signal");
164         return fromSignalImpl(&SignalType::Object::staticMetaObject,
165                               reinterpret_cast<void **>(&signal));
166     } +/
167 
168 private:
169     static QMetaMethod fromSignalImpl(const(QMetaObject)* , void** );
170     static QMetaMethod fromRelativeMethodIndex(const(QMetaObject)* mobj, int index);
171     static QMetaMethod fromRelativeConstructorIndex(const(QMetaObject)* mobj, int index);
172 
173     struct Data {
174         enum { Size = 6 }
175 
176         uint name() const { return d[0]; }
177         uint argc() const { return d[1]; }
178         uint parameters() const { return d[2]; }
179         uint tag() const { return d[3]; }
180         uint flags() const { return d[4]; }
181         uint metaTypeOffset() const { return d[5]; }
182         /+bool operator ==(ref const(Data) other) const { return d == other.d; }+/
183 
184         const(uint)* d;
185     }
186     this(const(QMetaObject)* metaObject, ref const(Data) data_)
187     {
188         this.mobj = metaObject;
189         this.data = data_;
190     }
191 
192     const(QMetaObject)* mobj = null;
193     Data data = {null};
194     /+ friend class QMetaMethodPrivate; +/
195     /+ friend struct QMetaObject; +/
196     /+ friend struct QMetaObjectPrivate; +/
197     /+ friend class QObject; +/
198     /+ friend bool operator==(const QMetaMethod &m1, const QMetaMethod &m2) noexcept
199     { return m1.data == m2.data; } +/
200     /+ friend bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2) noexcept
201     { return !(m1 == m2); } +/
202     mixin(CREATE_CONVENIENCE_WRAPPERS);
203 }
204 /+ Q_DECLARE_TYPEINFO(QMetaMethod, Q_RELOCATABLE_TYPE); +/
205 
206 /// Binding for C++ class [QMetaEnum](https://doc.qt.io/qt-6/qmetaenum.html).
207 @Q_RELOCATABLE_TYPE extern(C++, class) struct /+ Q_CORE_EXPORT +/ QMetaEnum
208 {
209 public:
210     @disable this();
211     /+pragma(inline, true) this()
212     {
213         this.mobj = null;
214         this.data = { null} ;
215     }+/
216 
217     const(char)* name() const;
218     const(char)* enumName() const;
219     bool isFlag() const;
220     bool isScoped() const;
221 
222     int keyCount() const;
223     const(char)* key(int index) const;
224     int value(int index) const;
225 
226     //const(char)* scope_() const;
227 
228     int keyToValue(const(char)* key, bool* ok = null) const;
229     const(char)* valueToKey(int value) const;
230     int keysToValue(const(char)* keys, bool* ok = null) const;
231     QByteArray valueToKeys(int value) const;
232 
233     pragma(inline, true) const(QMetaObject)* enclosingMetaObject() const { return mobj; }
234 
235     pragma(inline, true) bool isValid() const { return name() !is null; }
236 
237     /+ template<typename T> +/
238     /+ static QMetaEnum fromType()
239     {
240         static_assert(QtPrivate::IsQEnumHelper<T>::Value,
241                       "QMetaEnum::fromType only works with enums declared as "
242                       "Q_ENUM, Q_ENUM_NS, Q_FLAG or Q_FLAG_NS");
243         const QMetaObject *metaObject = qt_getEnumMetaObject(T());
244         const char *name = qt_getEnumName(T());
245         return metaObject->enumerator(metaObject->indexOfEnumerator(name));
246     } +/
247 
248 private:
249     struct Data {
250         enum { Size = 5 }
251         quint32 name() const { return d[0]; }
252         quint32 alias_() const { return d[1]; }
253         quint32 flags() const { return d[2]; }
254         qint32 keyCount() const { return static_cast!(qint32)(d[3]); }
255         quint32 data() const { return d[4]; }
256 
257         const(uint)* d;
258     }
259 
260     this(const(QMetaObject)* mobj, int index);
261 
262     const(QMetaObject)* mobj = null;
263     Data data = {null};
264     /+ friend struct QMetaObject; +/
265     /+ friend struct QMetaObjectPrivate; +/
266     mixin(CREATE_CONVENIENCE_WRAPPERS);
267 }
268 /+ Q_DECLARE_TYPEINFO(QMetaEnum, Q_RELOCATABLE_TYPE); +/
269 
270 /// Binding for C++ class [QMetaProperty](https://doc.qt.io/qt-6/qmetaproperty.html).
271 extern(C++, class) struct /+ Q_CORE_EXPORT +/ QMetaProperty
272 {
273 public:
274     @disable this();
275     /+this()
276     {
277         this.mobj = null;
278         this.data = { null} ;
279     }+/
280 
281     const(char)* name() const;
282     const(char)* typeName() const;
283 /+ #if QT_DEPRECATED_SINCE(6, 0)
284     QT_WARNING_PUSH
285     QT_WARNING_DISABLE_DEPRECATED +/
286     /+ QT_DEPRECATED_VERSION_6_0 +/
287         QVariant.Type type() const
288     { int t = userType(); return t >= QMetaType.Type.User ? QVariant.Type.UserType : cast(QVariant.Type)(t); }
289     /+ QT_WARNING_POP
290 #endif +/
291     int userType() const { return typeId(); }
292     int typeId() const { return metaType().id(); }
293     QMetaType metaType() const;
294     int propertyIndex() const;
295     int relativePropertyIndex() const;
296 
297     bool isReadable() const;
298     bool isWritable() const;
299     bool isResettable() const;
300     bool isDesignable() const;
301     bool isScriptable() const;
302     bool isStored() const;
303     bool isUser() const;
304     bool isConstant() const;
305     bool isFinal() const;
306     bool isRequired() const;
307     bool isBindable() const;
308 
309     bool isFlagType() const;
310     bool isEnumType() const;
311     QMetaEnum enumerator() const;
312 
313     bool hasNotifySignal() const;
314     QMetaMethod notifySignal() const;
315     int notifySignalIndex() const;
316 
317     int revision() const;
318 
319     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
320     QVariant read(const(QObject) obj) const;
321     }));
322     bool write(QObject obj, ref const(QVariant) value) const;
323     bool reset(QObject obj) const;
324 
325     QUntypedBindable bindable(QObject object) const;
326 
327     QVariant readOnGadget(const(void)* gadget) const;
328     bool writeOnGadget(void* gadget, ref const(QVariant) value) const;
329     bool resetOnGadget(void* gadget) const;
330 
331     bool hasStdCppSet() const;
332     bool isAlias() const;
333     pragma(inline, true) bool isValid() const { return isReadable(); }
334     pragma(inline, true) const(QMetaObject)* enclosingMetaObject() const { return mobj; }
335 
336 private:
337     int registerPropertyType() const;
338 
339     struct Data {
340         enum { Size = 5 }
341 
342         uint name() const { return d[0]; }
343         uint type() const { return d[1]; }
344         uint flags() const { return d[2]; }
345         uint notifyIndex() const { return d[3]; }
346         uint revision() const { return d[4]; }
347 
348         int index(const(QMetaObject)* mobj) const;
349 
350         const(uint)* d;
351     }
352 
353     this(const(QMetaObject)* mobj, int index);
354     //static Data getMetaPropertyData(const(QMetaObject)* mobj, int index);
355 
356     const(QMetaObject)* mobj = null;
357     Data data = {null};
358     QMetaEnum menum;
359     /+ friend struct QMetaObject; +/
360     /+ friend struct QMetaObjectPrivate; +/
361     mixin(CREATE_CONVENIENCE_WRAPPERS);
362 }
363 
364 /// Binding for C++ class [QMetaClassInfo](https://doc.qt.io/qt-6/qmetaclassinfo.html).
365 @Q_RELOCATABLE_TYPE extern(C++, class) struct /+ Q_CORE_EXPORT +/ QMetaClassInfo
366 {
367 public:
368     @disable this();
369     /+pragma(inline, true) this()
370     {
371         this.mobj = null;
372         this.data = { null} ;
373     }+/
374     const(char)* name() const;
375     const(char)* value() const;
376     pragma(inline, true) const(QMetaObject)* enclosingMetaObject() const { return mobj; }
377 
378 private:
379     struct Data {
380         enum { Size = 2 }
381 
382         uint name() const { return d[0]; }
383         uint value() const { return d[1]; }
384 
385         const(uint)* d;
386     }
387 
388     const(QMetaObject)* mobj = null;
389     Data data = {null};
390     /+ friend struct QMetaObject; +/
391     mixin(CREATE_CONVENIENCE_WRAPPERS);
392 }
393 /+ Q_DECLARE_TYPEINFO(QMetaClassInfo, Q_RELOCATABLE_TYPE); +/
394