comparison qt/core/QMetaObject.d @ 288:f9559a957be9 signals

new signals and slots implementation
author eldar
date Sun, 08 Nov 2009 19:28:01 +0000
parents 073b9153ed8a
children 7c2cf27391c4
comparison
equal deleted inserted replaced
287:b6984b290e46 288:f9559a957be9
2 2
3 import qt.QGlobal; 3 import qt.QGlobal;
4 import qt.core.QObject; 4 import qt.core.QObject;
5 import qt.QtdObject; 5 import qt.QtdObject;
6 6
7 import std.algorithm;
8
9 class Meta
10 {
11 string name;
12 }
13
14 class MetaType : Meta
15 {
16 this()
17 {
18 }
19 }
20
21 class MetaVariable : Meta
22 {
23 MetaType type;
24 }
25
26 class MetaCallable : Meta { }
27
28 class MetaMethod : Meta { }
29
30 class QMetaArgument : MetaVariable { }
31
32 class QMetaMethod : MetaMethod
33 {
34 // QMetaArgument[] arguments;
35 string signature;
36 int indexOfMethod;
37
38 this(string signature_, int indexOfMethod_)
39 {
40 signature = signature_;
41 indexOfMethod = indexOfMethod_;
42 }
43 }
44
45 class QMetaSignal : QMetaMethod
46 {
47 this(string signature_, int indexOfMethod_)
48 {
49 super(signature_, indexOfMethod_);
50 }
51 }
52
53 class QMetaSlot : QMetaMethod
54 {
55 this(string signature_, int indexOfMethod_)
56 {
57 super(signature_, indexOfMethod_);
58 }
59 }
60
61 class MetaObject : MetaType
62 {
63 MetaObject _base;
64 }
65
66 struct QMetaObjectNative
67 {
68 QMetaObjectNative *superdata;
69 immutable(char) *stringdata;
70 const(uint) *data;
71 void *extradata;
72 }
73
7 final class QMetaObject 74 final class QMetaObject
8 { 75 {
76 enum Call
77 {
78 InvokeMetaMethod,
79 ReadProperty,
80 WriteProperty,
81 ResetProperty,
82 QueryPropertyDesignable,
83 QueryPropertyScriptable,
84 QueryPropertyStored,
85 QueryPropertyEditable,
86 QueryPropertyUser,
87 CreateInstance
88 }
89
9 private 90 private
10 { 91 {
11 void* _nativeId; 92 QMetaObjectNative* _nativeId;
12 QMetaObject _base; // super class 93 QMetaObject _base; // super class
13 QMetaObject _firstDerived; // head of the linked list of derived classes 94 QMetaObject _firstDerived; // head of the linked list of derived classes
14 QMetaObject _next; // next sibling on this derivation level 95 QMetaObject _next; // next sibling on this derivation level
96 QMetaMethod[] _methods;
15 ClassInfo _classInfo; 97 ClassInfo _classInfo;
16 98
17 QObject function(void* nativeId) _createWrapper; 99 QObject function(void* nativeId) _createWrapper;
18 } 100 }
19 101
22 mo._next = _firstDerived; 104 mo._next = _firstDerived;
23 _firstDerived = mo; 105 _firstDerived = mo;
24 } 106 }
25 107
26 // NOTE: construction is split between this non-templated constructor and 'construct' function below. 108 // NOTE: construction is split between this non-templated constructor and 'construct' function below.
27 this(void* nativeId, QMetaObject base) 109 this(QMetaObjectNative* nativeId, QMetaObject base)
28 { 110 {
29 _nativeId = nativeId; 111 _nativeId = nativeId;
30 if (base) 112 if (base)
31 { 113 {
32 base.addDerived(this); 114 base.addDerived(this);
55 return _base; 137 return _base;
56 } 138 }
57 139
58 /++ 140 /++
59 +/ 141 +/
60 void* nativeId() 142 QMetaObjectNative* nativeId()
61 { 143 {
62 return _nativeId; 144 return _nativeId;
63 } 145 }
64 146
65 /++ 147 /++
66 +/ 148 +/
67 ClassInfo classInfo() 149 ClassInfo classInfo()
68 { 150 {
69 return _classInfo; 151 return _classInfo;
152 }
153
154 const (QMetaMethod[]) methods()
155 {
156 return _methods;
157 }
158
159 void addMethod(QMetaMethod method_)
160 {
161 _methods ~= method_;
162 }
163
164 int lookUpMethod(string slot)
165 {
166 foreach (method; _methods)
167 if (method.signature == slot)
168 return method.indexOfMethod;
169 if (_base)
170 return _base.lookUpMethod(slot);
171 else
172 return -1;
173 }
174
175 int lookUpSignal(string signal)
176 {
177 // auto signalBegin = signal[0..$-1];
178 foreach (method; _methods)
179 if (method.signature == signal && cast(QMetaSignal)method)
180 return method.indexOfMethod;
181 if (_base)
182 return _base.lookUpSignal(signal);
183 else
184 return -1;
70 } 185 }
71 186
72 private QMetaObject lookupDerived(void*[] moIds) 187 private QMetaObject lookupDerived(void*[] moIds)
73 { 188 {
74 assert (moIds.length >= 1); 189 assert (moIds.length >= 1);
121 moIds[--moCount] = moId; 236 moIds[--moCount] = moId;
122 while (moCount > 0) 237 while (moCount > 0)
123 moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId); 238 moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId);
124 239
125 result = lookupDerived(moIds)._createWrapper(nativeObjId); 240 result = lookupDerived(moIds)._createWrapper(nativeObjId);
126 } 241 }
127 } 242 }
128 } 243 }
129 244
130 return result; 245 return result;
131 } 246 }
132 } 247
248 static void activate(QObject sender, QMetaObject m, int local_signal_index, void **argv)
249 {
250 qtd_QMetaObject_activate_3(sender.__nativeId, m.nativeId, local_signal_index, argv);
251 }
252
253 static void activate(QObject sender, QMetaObject m, int from_local_signal_index, int to_local_signal_index, void **argv)
254 {
255 qtd_QMetaObject_activate_4(sender.__nativeId, m.nativeId, from_local_signal_index, to_local_signal_index, argv);
256 }
257
258 static bool connect(const QObject sender, int signal_index,
259 const QObject receiver, int method_index,
260 int type = 0, int *types = null)
261 {
262 return qtd_QMetaObject_connect(sender.__nativeId, signal_index, receiver.__nativeId, method_index, type, types);
263 }
264
265 int indexOfMethod_Cpp(string method)
266 {
267 return qtd_QMetaObject_indexOfMethod(_nativeId, toStringz(method));
268 }
269
270 int methodCount()
271 {
272 return qtd_QMetaObject_methodCount(_nativeId);
273 }
274
275 }
276
277 extern(C) void qtd_QMetaObject_activate_3(void* sender, void* m, int local_signal_index, void **argv);
278 extern(C) void qtd_QMetaObject_activate_4(void *sender, void* m, int from_local_signal_index, int to_local_signal_index, void **argv);
279 extern(C) bool qtd_QMetaObject_connect(const void* sender, int signal_index,
280 const void* receiver, int method_index,
281 int type, int *types);
282
283 extern(C) int qtd_QMetaObject_indexOfMethod(void *nativeId, const(char) *method);
284 extern(C) int qtd_QMetaObject_methodCount(void *nativeId);
133 285
134 extern(C) void* qtd_QMetaObject_superClass(void* nativeId); 286 extern(C) void* qtd_QMetaObject_superClass(void* nativeId);