Mercurial > projects > qtd
comparison qt/core/QMetaObject.d @ 322:7c2cf27391c4 signals
A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
author | eldar_ins@eldar-laptop |
---|---|
date | Sun, 27 Dec 2009 21:13:38 +0500 |
parents | f9559a957be9 |
children | 7a3c43424dca |
comparison
equal
deleted
inserted
replaced
321:d458ed66e871 | 322:7c2cf27391c4 |
---|---|
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; | 7 import std.algorithm; |
8 import std.string; | |
9 import std.stdio; | |
8 | 10 |
9 class Meta | 11 class Meta |
10 { | 12 { |
11 string name; | 13 string name; |
12 } | 14 } |
37 | 39 |
38 this(string signature_, int indexOfMethod_) | 40 this(string signature_, int indexOfMethod_) |
39 { | 41 { |
40 signature = signature_; | 42 signature = signature_; |
41 indexOfMethod = indexOfMethod_; | 43 indexOfMethod = indexOfMethod_; |
44 } | |
45 | |
46 string args() const | |
47 { | |
48 int openBracket = indexOf(signature, '('); | |
49 if(signature.length - openBracket - 2 > 0) | |
50 return signature[openBracket + 1 .. $-1]; | |
51 else | |
52 return ""; | |
42 } | 53 } |
43 } | 54 } |
44 | 55 |
45 class QMetaSignal : QMetaMethod | 56 class QMetaSignal : QMetaMethod |
46 { | 57 { |
159 void addMethod(QMetaMethod method_) | 170 void addMethod(QMetaMethod method_) |
160 { | 171 { |
161 _methods ~= method_; | 172 _methods ~= method_; |
162 } | 173 } |
163 | 174 |
164 int lookUpMethod(string slot) | 175 QMetaMethod lookUpMethod(string slot) |
165 { | 176 { |
166 foreach (method; _methods) | 177 foreach (method; _methods) |
167 if (method.signature == slot) | 178 if (method.signature == slot) |
168 return method.indexOfMethod; | 179 return method; |
169 if (_base) | 180 if (_base) |
170 return _base.lookUpMethod(slot); | 181 return _base.lookUpMethod(slot); |
171 else | 182 else |
172 return -1; | 183 return null; |
173 } | 184 } |
174 | 185 |
175 int lookUpSignal(string signal) | 186 QMetaSignal lookUpSignal(string signal) |
176 { | 187 { |
177 // auto signalBegin = signal[0..$-1]; | |
178 foreach (method; _methods) | 188 foreach (method; _methods) |
179 if (method.signature == signal && cast(QMetaSignal)method) | 189 if (method.signature == signal && cast(QMetaSignal)method) |
180 return method.indexOfMethod; | 190 return cast(QMetaSignal)method; |
181 if (_base) | 191 if (_base) |
182 return _base.lookUpSignal(signal); | 192 return _base.lookUpSignal(signal); |
183 else | 193 else |
184 return -1; | 194 return null; |
195 } | |
196 | |
197 QMetaMethod[] lookUpMethodOverloads(string methodName) | |
198 { | |
199 typeof(return) result; | |
200 foreach (method; _methods) | |
201 if (startsWith(method.signature, methodName)) | |
202 result ~= method; | |
203 if (_base) | |
204 result ~= _base.lookUpMethodOverloads(methodName); | |
205 return result; | |
206 } | |
207 | |
208 QMetaSignal[] lookUpSignalOverloads(string signalName) | |
209 { | |
210 typeof(return) result; | |
211 foreach (method; _methods) | |
212 if (startsWith(method.signature, signalName) && cast(QMetaSignal)method) | |
213 result ~= cast(QMetaSignal)method; | |
214 if (_base) | |
215 result ~= _base.lookUpSignalOverloads(signalName); | |
216 return result; | |
185 } | 217 } |
186 | 218 |
187 private QMetaObject lookupDerived(void*[] moIds) | 219 private QMetaObject lookupDerived(void*[] moIds) |
188 { | 220 { |
189 assert (moIds.length >= 1); | 221 assert (moIds.length >= 1); |
269 | 301 |
270 int methodCount() | 302 int methodCount() |
271 { | 303 { |
272 return qtd_QMetaObject_methodCount(_nativeId); | 304 return qtd_QMetaObject_methodCount(_nativeId); |
273 } | 305 } |
274 | 306 |
307 static bool connectImpl(QObject sender, string signalString, QObject receiver, string methodString) | |
308 { | |
309 QMetaSignal[] signals; | |
310 QMetaMethod[] methods; | |
311 QMetaSignal signal; | |
312 QMetaMethod method; | |
313 | |
314 | |
315 if(indexOf(signalString, '(') > 0) | |
316 signal = sender.metaObject.lookUpSignal(signalString); | |
317 else | |
318 signals = sender.metaObject.lookUpSignalOverloads(signalString); // parameters not specified. Looking for a match | |
319 | |
320 if(indexOf(methodString, '(') > 0) | |
321 method = receiver.metaObject.lookUpMethod(methodString); | |
322 else | |
323 methods = receiver.metaObject.lookUpMethodOverloads(methodString); // parameters not specified. Looking for a match | |
324 | |
325 if(!signal && !method) | |
326 { | |
327 foreach(sig; signals) | |
328 foreach(meth; methods) | |
329 if(startsWith(sig.args, meth.args)) | |
330 { | |
331 signal = sig; | |
332 method = meth; | |
333 goto doConnect; | |
334 } | |
335 } | |
336 else if (!signal) | |
337 { | |
338 foreach(sig; signals) | |
339 if(startsWith(sig.args, method.args)) | |
340 { | |
341 signal = sig; | |
342 break; | |
343 } | |
344 } | |
345 else if (!method) | |
346 { | |
347 foreach(meth; methods) | |
348 if(startsWith(signal.args, meth.args)) | |
349 { | |
350 method = meth; | |
351 break; | |
352 } | |
353 } | |
354 | |
355 doConnect: | |
356 if(!signal && !method) | |
357 { | |
358 writeln(stderr, "QMetaObject: Signal and slots cannot be found"); | |
359 return false; | |
360 } | |
361 int signalIndex = signal.indexOfMethod; | |
362 int methodIndex = method.indexOfMethod; | |
363 return QMetaObject.connect(sender, signalIndex, receiver, methodIndex); | |
364 } | |
275 } | 365 } |
276 | 366 |
277 extern(C) void qtd_QMetaObject_activate_3(void* sender, void* m, int local_signal_index, void **argv); | 367 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); | 368 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, | 369 extern(C) bool qtd_QMetaObject_connect(const void* sender, int signal_index, |