diff 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
line wrap: on
line diff
--- a/qt/core/QMetaObject.d	Sat Dec 26 05:10:16 2009 +0500
+++ b/qt/core/QMetaObject.d	Sun Dec 27 21:13:38 2009 +0500
@@ -5,6 +5,8 @@
 import qt.QtdObject;
 
 import std.algorithm;
+import std.string;
+import std.stdio;
 
 class Meta
 {
@@ -40,6 +42,15 @@
         signature = signature_;
         indexOfMethod = indexOfMethod_;
     }
+    
+    string args() const
+    {
+        int openBracket = indexOf(signature, '(');
+        if(signature.length - openBracket - 2 > 0)
+            return signature[openBracket + 1 .. $-1];
+        else
+            return "";
+    }
 }
 
 class QMetaSignal : QMetaMethod
@@ -161,27 +172,48 @@
         _methods ~= method_;
     }
     
-    int lookUpMethod(string slot)
+    QMetaMethod lookUpMethod(string slot)
     {
         foreach (method; _methods)
             if (method.signature == slot)
-                return method.indexOfMethod;
+                return method;
         if (_base)
             return _base.lookUpMethod(slot);
         else
-            return -1;
+            return null;
     }
     
-    int lookUpSignal(string signal)
+    QMetaSignal lookUpSignal(string signal)
     {
-//        auto signalBegin = signal[0..$-1];
         foreach (method; _methods)
             if (method.signature == signal && cast(QMetaSignal)method)
-                return method.indexOfMethod;
+                return cast(QMetaSignal)method;
         if (_base)
             return _base.lookUpSignal(signal);
         else
-            return -1;
+            return null;
+    }
+
+    QMetaMethod[] lookUpMethodOverloads(string methodName)
+    {
+        typeof(return) result;
+        foreach (method; _methods)
+            if (startsWith(method.signature, methodName))
+                result ~= method;
+        if (_base)
+            result ~= _base.lookUpMethodOverloads(methodName);
+        return result;
+    }
+
+    QMetaSignal[] lookUpSignalOverloads(string signalName)
+    {
+        typeof(return) result;
+        foreach (method; _methods)
+            if (startsWith(method.signature, signalName) && cast(QMetaSignal)method)
+                result ~= cast(QMetaSignal)method;
+        if (_base)
+            result ~= _base.lookUpSignalOverloads(signalName);
+        return result;
     }
     
     private QMetaObject lookupDerived(void*[] moIds)
@@ -271,7 +303,65 @@
     {
         return qtd_QMetaObject_methodCount(_nativeId);
     }
+    
+    static bool connectImpl(QObject sender, string signalString, QObject receiver, string methodString)
+    {
+        QMetaSignal[] signals;
+        QMetaMethod[] methods;
+        QMetaSignal signal;
+        QMetaMethod method;
 
+        
+        if(indexOf(signalString, '(') > 0)
+            signal = sender.metaObject.lookUpSignal(signalString);
+        else
+            signals = sender.metaObject.lookUpSignalOverloads(signalString); // parameters not specified. Looking for a match
+
+        if(indexOf(methodString, '(') > 0) 
+            method = receiver.metaObject.lookUpMethod(methodString);
+        else
+            methods = receiver.metaObject.lookUpMethodOverloads(methodString); // parameters not specified. Looking for a match
+
+        if(!signal && !method)
+        {
+            foreach(sig; signals)
+                foreach(meth; methods)
+                    if(startsWith(sig.args, meth.args))
+                    {
+                        signal = sig;
+                        method = meth;
+                        goto doConnect;
+                    }
+        }
+        else if (!signal)
+        {
+            foreach(sig; signals)
+                if(startsWith(sig.args, method.args))
+                {
+                    signal = sig;
+                    break;
+                }
+        }
+        else if (!method)
+        {
+            foreach(meth; methods)
+                if(startsWith(signal.args, meth.args))
+                {
+                    method = meth;
+                    break;
+                }
+        } 
+        
+doConnect:
+        if(!signal && !method)
+        {
+            writeln(stderr, "QMetaObject: Signal and slots cannot be found");
+            return false;
+        }
+        int signalIndex = signal.indexOfMethod;
+        int methodIndex = method.indexOfMethod;
+        return QMetaObject.connect(sender, signalIndex, receiver, methodIndex);
+    }
 }
 
 extern(C) void qtd_QMetaObject_activate_3(void* sender, void* m, int local_signal_index, void **argv);