annotate qt/core/QMetaObject.d @ 253:073b9153ed8a

Rev. 264 done right. Problems: - classwizard segfaults on exit due to a bug in signals/slots or runtime. - hellogl doesn't compile with dmd2 due to a bug in the compiler backend
author maxter
date Sun, 30 Aug 2009 09:59:12 +0000
parents
children 515d6e1c7b10 f9559a957be9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
1 module qt.core.QMetaObject;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
2
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
3 import qt.QGlobal;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
4 import qt.core.QObject;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
5 import qt.QtdObject;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
6
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
7 final class QMetaObject
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
8 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
9 private
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
10 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
11 void* _nativeId;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
12 QMetaObject _base; // super class
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
13 QMetaObject _firstDerived; // head of the linked list of derived classes
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
14 QMetaObject _next; // next sibling on this derivation level
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
15 ClassInfo _classInfo;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
16
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
17 QObject function(void* nativeId) _createWrapper;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
18 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
19
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
20 private void addDerived(QMetaObject mo)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
21 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
22 mo._next = _firstDerived;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
23 _firstDerived = mo;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
24 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
25
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
26 // NOTE: construction is split between this non-templated constructor and 'construct' function below.
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
27 this(void* nativeId, QMetaObject base)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
28 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
29 _nativeId = nativeId;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
30 if (base)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
31 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
32 base.addDerived(this);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
33 _base = base;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
34 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
35 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
36
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
37 // TODO: remove when D acquires templated constructors
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
38 void construct(T : QObject, Concrete = T)()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
39 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
40 _classInfo = T.classinfo;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
41
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
42 _createWrapper = function QObject(void* nativeId) {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
43 // COMPILER BUG: cast is should not be needed
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
44 auto obj = new Concrete(nativeId, cast(QtdObjectFlags)(QtdObjectFlags.nativeOwnership | QtdObjectFlags.dynamicEntity));
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
45 // TODO: Probably this should be a virtual call from T's constructor
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
46 T.__createEntity(nativeId, cast(void*)obj);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
47 return obj;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
48 };
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
49 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
50
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
51 /++
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
52 +/
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
53 QMetaObject base()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
54 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
55 return _base;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
56 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
57
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
58 /++
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
59 +/
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
60 void* nativeId()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
61 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
62 return _nativeId;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
63 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
64
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
65 /++
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
66 +/
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
67 ClassInfo classInfo()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
68 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
69 return _classInfo;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
70 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
71
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
72 private QMetaObject lookupDerived(void*[] moIds)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
73 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
74 assert (moIds.length >= 1);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
75
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
76 for (auto mo = _firstDerived; mo !is null; mo = mo._next)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
77 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
78 if (mo._nativeId == moIds[0])
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
79 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
80 if (moIds.length == 1) // exact match found
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
81 return mo;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
82 else // look deeper
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
83 return mo.lookupDerived(moIds[1..$]);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
84 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
85 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
86
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
87 // no initialized wrapper that matches the native object.
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
88 // use the base class wrapper
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
89 return this;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
90 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
91
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
92 QObject getObject(void* nativeObjId)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
93 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
94 QObject result;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
95
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
96 if (nativeObjId)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
97 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
98 result = cast(QObject)qtd_get_d_qobject(nativeObjId);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
99 if (!result)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
100 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
101 auto moId = qtd_QObject_metaObject(nativeObjId);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
102 if (_nativeId == moId)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
103 result = _createWrapper(nativeObjId);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
104 else
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
105 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
106 // get native metaobjects for the entire derivation lattice
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
107 // up to, but not including, the current metaobject.
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
108 size_t moCount = 1;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
109
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
110 for (void* tmp = moId;;)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
111 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
112 tmp = qtd_QMetaObject_superClass(tmp);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
113 assert(tmp);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
114 if (tmp == _nativeId)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
115 break;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
116 moCount++;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
117 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
118
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
119 void*[] moIds = (cast(void**)alloca(moCount * (void*).sizeof))[0..moCount];
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
120
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
121 moIds[--moCount] = moId;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
122 while (moCount > 0)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
123 moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
124
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
125 result = lookupDerived(moIds)._createWrapper(nativeObjId);
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
126 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
127 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
128 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
129
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
130 return result;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
131 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
132 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
133
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
134 extern(C) void* qtd_QMetaObject_superClass(void* nativeId);