Mercurial > projects > qtd
comparison d1/qt/core/QMetaObject.d @ 311:8674fd5f34f4 lifetime
Added d1/d2 top directories
author | maxter <spambox@d-coding.com> |
---|---|
date | Wed, 23 Dec 2009 16:17:22 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
310:5bcfe9e7db7f | 311:8674fd5f34f4 |
---|---|
1 module qt.core.QMetaObject; | |
2 | |
3 import | |
4 qt.Core, | |
5 qt.core.QObject, | |
6 qt.QtdObject; | |
7 | |
8 /++ | |
9 Meta-object for QObject classes. | |
10 +/ | |
11 final class QMetaObject : QtdMetaObjectBase | |
12 { | |
13 alias typeof(this) This; | |
14 | |
15 this(void* nativeId, QtdMetaObjectBase base, CreateWrapper createWrapper) | |
16 { | |
17 super(nativeId, base, createWrapper); | |
18 } | |
19 | |
20 private QMetaObject lookupDerived(void*[] moIds) | |
21 { | |
22 assert (moIds.length >= 1); | |
23 | |
24 for (auto mo = static_cast!(This)(firstDerived); mo !is null; mo = static_cast!(This)(mo.next)) | |
25 { | |
26 if (mo.nativeId == moIds[0]) | |
27 { | |
28 if (moIds.length == 1) // exact match found | |
29 return mo; | |
30 else // look deeper | |
31 return mo.lookupDerived(moIds[1..$]); | |
32 } | |
33 } | |
34 | |
35 // no initialized wrapper that matches the native object. | |
36 // use the base class wrapper | |
37 return this; | |
38 } | |
39 | |
40 QObject wrap(void* nativeObjId, QtdObjectFlags flags = QtdObjectFlags.none) | |
41 { | |
42 QObject result; | |
43 | |
44 if (nativeObjId) | |
45 { | |
46 result = cast(QObject)qtd_get_d_qobject(nativeObjId); | |
47 if (!result) | |
48 { | |
49 auto moId = qtd_QObject_typeId(nativeObjId); | |
50 if (nativeId == moId) | |
51 result = static_cast!(QObject)(_createWrapper(nativeObjId, flags)); | |
52 else | |
53 { | |
54 // get native metaobjects for the entire derivation lattice | |
55 // up to, but not including, the current metaobject. | |
56 size_t moCount = 1; | |
57 | |
58 for (void* tmp = moId;;) | |
59 { | |
60 tmp = qtd_QMetaObject_superClass(tmp); | |
61 if (!tmp) | |
62 return null; | |
63 | |
64 if (tmp == nativeId) | |
65 break; | |
66 moCount++; | |
67 } | |
68 | |
69 void*[] moIds = (cast(void**)alloca(moCount * (void*).sizeof))[0..moCount]; | |
70 | |
71 moIds[--moCount] = moId; | |
72 while (moCount > 0) | |
73 moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId); | |
74 | |
75 auto mo = lookupDerived(moIds); | |
76 result = static_cast!(QObject)(mo._createWrapper(nativeObjId, flags)); | |
77 } | |
78 } | |
79 } | |
80 | |
81 return result; | |
82 } | |
83 } | |
84 | |
85 extern(C) void* qtd_QMetaObject_superClass(void* nativeId); |