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,