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);