Mercurial > projects > qtd
comparison qt/core/QMetaObject.d @ 323:7a3c43424dca signals
make all examples compile with new signals/slots
author | eldar_ins@eldar-laptop |
---|---|
date | Mon, 28 Dec 2009 16:28:55 +0500 |
parents | 7c2cf27391c4 |
children | 24ebea513d66 |
comparison
equal
deleted
inserted
replaced
322:7c2cf27391c4 | 323:7a3c43424dca |
---|---|
48 int openBracket = indexOf(signature, '('); | 48 int openBracket = indexOf(signature, '('); |
49 if(signature.length - openBracket - 2 > 0) | 49 if(signature.length - openBracket - 2 > 0) |
50 return signature[openBracket + 1 .. $-1]; | 50 return signature[openBracket + 1 .. $-1]; |
51 else | 51 else |
52 return ""; | 52 return ""; |
53 } | |
54 | |
55 string name() const | |
56 { | |
57 int openBracket = indexOf(signature, '('); | |
58 return signature[0..openBracket]; | |
53 } | 59 } |
54 } | 60 } |
55 | 61 |
56 class QMetaSignal : QMetaMethod | 62 class QMetaSignal : QMetaMethod |
57 { | 63 { |
79 QMetaObjectNative *superdata; | 85 QMetaObjectNative *superdata; |
80 immutable(char) *stringdata; | 86 immutable(char) *stringdata; |
81 const(uint) *data; | 87 const(uint) *data; |
82 void *extradata; | 88 void *extradata; |
83 } | 89 } |
90 | |
91 class QMetaException : Exception { this(string msg) { super(msg); } } | |
84 | 92 |
85 final class QMetaObject | 93 final class QMetaObject |
86 { | 94 { |
87 enum Call | 95 enum Call |
88 { | 96 { |
196 | 204 |
197 QMetaMethod[] lookUpMethodOverloads(string methodName) | 205 QMetaMethod[] lookUpMethodOverloads(string methodName) |
198 { | 206 { |
199 typeof(return) result; | 207 typeof(return) result; |
200 foreach (method; _methods) | 208 foreach (method; _methods) |
201 if (startsWith(method.signature, methodName)) | 209 if (method.name == methodName) |
202 result ~= method; | 210 result ~= method; |
203 if (_base) | 211 if (_base) |
204 result ~= _base.lookUpMethodOverloads(methodName); | 212 result ~= _base.lookUpMethodOverloads(methodName); |
205 return result; | 213 return result; |
206 } | 214 } |
207 | 215 |
208 QMetaSignal[] lookUpSignalOverloads(string signalName) | 216 QMetaSignal[] lookUpSignalOverloads(string signalName) |
209 { | 217 { |
210 typeof(return) result; | 218 typeof(return) result; |
211 foreach (method; _methods) | 219 foreach (method; _methods) |
212 if (startsWith(method.signature, signalName) && cast(QMetaSignal)method) | 220 if (method.name == signalName && cast(QMetaSignal)method) |
213 result ~= cast(QMetaSignal)method; | 221 result ~= cast(QMetaSignal)method; |
214 if (_base) | 222 if (_base) |
215 result ~= _base.lookUpSignalOverloads(signalName); | 223 result ~= _base.lookUpSignalOverloads(signalName); |
216 return result; | 224 return result; |
217 } | 225 } |
302 int methodCount() | 310 int methodCount() |
303 { | 311 { |
304 return qtd_QMetaObject_methodCount(_nativeId); | 312 return qtd_QMetaObject_methodCount(_nativeId); |
305 } | 313 } |
306 | 314 |
307 static bool connectImpl(QObject sender, string signalString, QObject receiver, string methodString) | 315 static void connectImpl(QObject sender, string signalString, QObject receiver, string methodString) |
308 { | 316 { |
309 QMetaSignal[] signals; | 317 QMetaSignal[] signals; |
310 QMetaMethod[] methods; | 318 QMetaMethod[] methods; |
311 QMetaSignal signal; | 319 QMetaSignal signal; |
312 QMetaMethod method; | 320 QMetaMethod method; |
313 | 321 |
314 | |
315 if(indexOf(signalString, '(') > 0) | 322 if(indexOf(signalString, '(') > 0) |
316 signal = sender.metaObject.lookUpSignal(signalString); | 323 signal = sender.metaObject.lookUpSignal(signalString); |
317 else | 324 else |
318 signals = sender.metaObject.lookUpSignalOverloads(signalString); // parameters not specified. Looking for a match | 325 signals = sender.metaObject.lookUpSignalOverloads(signalString); // parameters not specified. Looking for a match |
319 | 326 |
322 else | 329 else |
323 methods = receiver.metaObject.lookUpMethodOverloads(methodString); // parameters not specified. Looking for a match | 330 methods = receiver.metaObject.lookUpMethodOverloads(methodString); // parameters not specified. Looking for a match |
324 | 331 |
325 if(!signal && !method) | 332 if(!signal && !method) |
326 { | 333 { |
334 Top: | |
327 foreach(sig; signals) | 335 foreach(sig; signals) |
328 foreach(meth; methods) | 336 foreach(meth; methods) |
329 if(startsWith(sig.args, meth.args)) | 337 if(startsWith(sig.args, meth.args)) |
330 { | 338 { |
331 signal = sig; | 339 signal = sig; |
332 method = meth; | 340 method = meth; |
333 goto doConnect; | 341 break Top; |
334 } | 342 } |
335 } | 343 } |
336 else if (!signal) | 344 else if (!signal) |
337 { | 345 { |
338 foreach(sig; signals) | 346 foreach(sig; signals) |
350 method = meth; | 358 method = meth; |
351 break; | 359 break; |
352 } | 360 } |
353 } | 361 } |
354 | 362 |
355 doConnect: | 363 bool success = false; |
364 | |
356 if(!signal && !method) | 365 if(!signal && !method) |
357 { | 366 { |
358 writeln(stderr, "QMetaObject: Signal and slots cannot be found"); | 367 success = false; |
359 return false; | 368 } |
360 } | 369 else |
361 int signalIndex = signal.indexOfMethod; | 370 { |
362 int methodIndex = method.indexOfMethod; | 371 int signalIndex = signal.indexOfMethod; |
363 return QMetaObject.connect(sender, signalIndex, receiver, methodIndex); | 372 int methodIndex = method.indexOfMethod; |
373 success = QMetaObject.connect(sender, signalIndex, receiver, methodIndex); | |
374 } | |
375 | |
376 if(!success) | |
377 throw new QMetaException("QMetaObject: Signal " ~ signalString ~ " and slot " ~ methodString ~ " cannot be found"); | |
364 } | 378 } |
365 } | 379 } |
366 | 380 |
367 extern(C) void qtd_QMetaObject_activate_3(void* sender, void* m, int local_signal_index, void **argv); | 381 extern(C) void qtd_QMetaObject_activate_3(void* sender, void* m, int 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); | 382 extern(C) void qtd_QMetaObject_activate_4(void *sender, void* m, int from_local_signal_index, int to_local_signal_index, void **argv); |