253
|
1 module qt.core.QMetaObject;
|
|
2
|
|
3 import qt.QGlobal;
|
|
4 import qt.core.QObject;
|
|
5 import qt.QtdObject;
|
|
6
|
259
|
7 /++
|
|
8 Meta-object for QObject classes.
|
|
9 +/
|
|
10 final class QMetaObject : MetaObject
|
253
|
11 {
|
259
|
12 alias typeof(this) This;
|
253
|
13
|
259
|
14 private void* _nativeId;
|
253
|
15
|
|
16 this(void* nativeId, QMetaObject base)
|
|
17 {
|
|
18 _nativeId = nativeId;
|
259
|
19 super(base);
|
|
20 }
|
253
|
21
|
|
22 /++
|
|
23 +/
|
|
24 void* nativeId()
|
|
25 {
|
|
26 return _nativeId;
|
|
27 }
|
|
28
|
|
29 private QMetaObject lookupDerived(void*[] moIds)
|
|
30 {
|
|
31 assert (moIds.length >= 1);
|
|
32
|
259
|
33 for (auto mo = static_cast!(This)(firstDerived); mo !is null; mo = static_cast!(This)(mo.next))
|
253
|
34 {
|
|
35 if (mo._nativeId == moIds[0])
|
|
36 {
|
|
37 if (moIds.length == 1) // exact match found
|
|
38 return mo;
|
|
39 else // look deeper
|
|
40 return mo.lookupDerived(moIds[1..$]);
|
|
41 }
|
|
42 }
|
|
43
|
|
44 // no initialized wrapper that matches the native object.
|
|
45 // use the base class wrapper
|
|
46 return this;
|
|
47 }
|
|
48
|
259
|
49 QObject wrap(void* nativeObjId, QtdObjectFlags flags = QtdObjectFlags.none)
|
253
|
50 {
|
|
51 QObject result;
|
|
52
|
|
53 if (nativeObjId)
|
|
54 {
|
|
55 result = cast(QObject)qtd_get_d_qobject(nativeObjId);
|
|
56 if (!result)
|
|
57 {
|
|
58 auto moId = qtd_QObject_metaObject(nativeObjId);
|
|
59 if (_nativeId == moId)
|
259
|
60 result = _createWrapper(nativeObjId, flags);
|
253
|
61 else
|
|
62 {
|
|
63 // get native metaobjects for the entire derivation lattice
|
|
64 // up to, but not including, the current metaobject.
|
|
65 size_t moCount = 1;
|
|
66
|
|
67 for (void* tmp = moId;;)
|
|
68 {
|
|
69 tmp = qtd_QMetaObject_superClass(tmp);
|
259
|
70 if (!tmp)
|
|
71 return null;
|
|
72
|
253
|
73 if (tmp == _nativeId)
|
|
74 break;
|
|
75 moCount++;
|
|
76 }
|
|
77
|
|
78 void*[] moIds = (cast(void**)alloca(moCount * (void*).sizeof))[0..moCount];
|
|
79
|
|
80 moIds[--moCount] = moId;
|
|
81 while (moCount > 0)
|
|
82 moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId);
|
|
83
|
259
|
84 result = lookupDerived(moIds)._createWrapper(nativeObjId, flags);
|
253
|
85 }
|
|
86 }
|
|
87 }
|
|
88
|
|
89 return result;
|
|
90 }
|
|
91 }
|
|
92
|
|
93 extern(C) void* qtd_QMetaObject_superClass(void* nativeId); |