Mercurial > projects > qtd
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); |