changeset 302:55ee4603365d signals

string arguments for signals
author eldar_ins@eldar-laptop
date Sat, 12 Dec 2009 03:22:54 +0500
parents 4d8481385c71
children 98b211f3ee34
files build/core.makefile build/core.txt cpp/qt_core/QString_shell.cpp generator/dgenerator.cpp qt/core/QList.d qt/core/QString.d qt/d2/qt/Signal.d qt/qtd/MOC.d qt/qtd/MetaMarshall.d
diffstat 9 files changed, 124 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/build/core.makefile	Tue Dec 08 21:13:24 2009 +0000
+++ b/build/core.makefile	Sat Dec 12 03:22:54 2009 +0500
@@ -79,4 +79,5 @@
     QBuffer \
     QMetaType \
     QLibraryInfo \
+    QFileSystemWatcher \
     QXmlStreamEntityResolver
\ No newline at end of file
--- a/build/core.txt	Tue Dec 08 21:13:24 2009 +0000
+++ b/build/core.txt	Sat Dec 12 03:22:54 2009 +0500
@@ -79,5 +79,6 @@
     QBuffer
     QLibraryInfo
     QXmlStreamEntityResolver
+    QFileSystemWatcher
     )
 	
--- a/cpp/qt_core/QString_shell.cpp	Tue Dec 08 21:13:24 2009 +0000
+++ b/cpp/qt_core/QString_shell.cpp	Sat Dec 12 03:22:54 2009 +0500
@@ -55,3 +55,13 @@
     QString *result = new (place)QString((const QString& )__qt_string0);
     return (void *) result;
 }
+
+extern "C" DLL_PUBLIC void qtd_QString_placed_ctor(void* place) {
+    new (place) QString();
+}
+
+extern "C" DLL_PUBLIC void qtd_QString_assign_fromUtf8
+(QString *__qt_this, DArray text)
+{
+    *__qt_this = QString::fromUtf8((const char *)text.ptr, text.length);
+}
\ No newline at end of file
--- a/generator/dgenerator.cpp	Tue Dec 08 21:13:24 2009 +0000
+++ b/generator/dgenerator.cpp	Sat Dec 12 03:22:54 2009 +0500
@@ -1783,7 +1783,7 @@
                       << INDENT << cppContainerConversionName(d_class, type, FromCpp) << "(" << arg_ptr << ", &" << arg_name << ");" << endl;
                 } else if (type->isTargetLangString()) {
                     s << INDENT << "auto " << arg_name << "_ptr = " << arg_ptr << ";" << endl
-                      << INDENT << "string " << arg_name << " = QString.toNativeString(" << arg_name << "_ptr);";
+                      << INDENT << "string " << arg_name << " = QStringUtil.toNativeString(" << arg_name << "_ptr);";
                 } else if(type->isPrimitive() || type->isEnum() || type->isFlags() || type->typeEntry()->isStructInD()) {
                     QString type_name = argument->type()->typeEntry()->qualifiedTargetLangName();
                     if (type->isFlags())
@@ -2987,7 +2987,7 @@
                     s << INDENT << "string " << arg_name << "_d_ref = toUTF8("
                                 << arg_name << "[0.." << arg_name << "_size]);";
                 else if (type->typeEntry()->isValue() && type->isNativePointer() && type->typeEntry()->name() == "QString") {
-                    s << INDENT << "auto " << arg_name << "_d_qstr = QString(" << arg_name << ", true);" << endl
+                    s << INDENT << "auto " << arg_name << "_d_qstr = QStringUtil(" << arg_name << ", true);" << endl
                       << INDENT << "string " << arg_name << "_d_ref = " << arg_name << "_d_qstr.toNativeString();";
                 } else if(type->isVariant())
                     s << INDENT << "scope " << arg_name << "_d_ref = new QVariant(" << arg_name << ", QtdObjectFlags.nativeOwnership);";
--- a/qt/core/QList.d	Tue Dec 08 21:13:24 2009 +0000
+++ b/qt/core/QList.d	Sat Dec 12 03:22:54 2009 +0500
@@ -337,7 +337,7 @@
                 static if(is(T == string))
                 {
                     void* ptr = cast(void*)(TI.isLarge || TI.isStatic ? v : &this);
-                    return QString.toNativeString(ptr);
+                    return QStringUtil.toNativeString(ptr);
                 }
                 else static if (isValueType!T)
                 {
--- a/qt/core/QString.d	Tue Dec 08 21:13:24 2009 +0000
+++ b/qt/core/QString.d	Sat Dec 12 03:22:54 2009 +0500
@@ -13,30 +13,26 @@
 
 struct QString
 {
-    public static QString opCall(void* ptr, bool proxy) {
+    public static QString opCall()
+    {
         QString str;
-        str.__nativeId = ptr;
+        qtd_QString_placed_ctor(&str);
         return str;
     }
     
-    public void* __nativeId;
-    
-    public static final string toNativeString(void* qstring) {
-        wchar* arr = qtd_QString_utf16(qstring);
-        int size = qtd_QString_size(qstring);
-        return .toUTF8(arr[0..size]);
+    ~this()
+    {
+        qtd_QString_call_destructor(&this);
     }
     
-    public final string toNativeString() {
-        return toNativeString(__nativeId);
+    void opAssign(string str)
+    {
+        qtd_QString_assign_fromUtf8(&this, str);
     }
     
-    public void assign(string text) {
-        qtd_QString_operatorAssign(__nativeId, text);
-    }
-    
-    public static string fromUtf8(string source) {
-        return source;
+    this(string str)
+    {
+        qtd_QString_new_fromUtf8_at(&this, str);
     }
     
     public static void __constructPlacedQString(void* place, string source) {
@@ -67,6 +63,38 @@
         enum bool isPointer = false;
         enum bool isDummy = false;
     }
+    
+private:
+    void *dummy; // sizeof(QString) == sizeof(void*)
+}
+
+struct QStringUtil
+{
+    public static final string toNativeString(void* qstring) {
+        wchar* arr = qtd_QString_utf16(qstring);
+        int size = qtd_QString_size(qstring);
+        return .toUTF8(arr[0..size]);
+    }
+
+    public static string fromUtf8(string source) {
+        return source;
+    }
+
+    public static QStringUtil opCall(void* ptr, bool proxy) {
+        QStringUtil str;
+        str.__nativeId = ptr;
+        return str;
+    }
+    
+    public void* __nativeId;
+
+    public final string toNativeString() {
+        return QStringUtil.toNativeString(__nativeId);
+    }
+    
+    public void assign(string text) {
+        qtd_QString_operatorAssign(__nativeId, text);
+    }
 }
 private extern(C) void* qtd_QString_placed_copy(const void* orig, void* place);
 
@@ -78,4 +106,7 @@
 private extern (C) wchar* qtd_QString_utf16(void* __this_nativeId);
 private extern (C) int qtd_QString_size(void* __this_nativeId);
 private extern (C) void qtd_QString_operatorAssign(void* __this_nativeId, string text);
-private extern (C) void qtd_QString_new_fromUtf8_at(void* place, string text);
\ No newline at end of file
+private extern (C) void* qtd_QString_new_fromUtf8_at(void* place, string text);
+
+private extern (C) void qtd_QString_placed_ctor(void* place);
+private extern (C) void qtd_QString_assign_fromUtf8(QString *__qt_this, string text);
\ No newline at end of file
--- a/qt/d2/qt/Signal.d	Tue Dec 08 21:13:24 2009 +0000
+++ b/qt/d2/qt/Signal.d	Sat Dec 12 03:22:54 2009 +0500
@@ -315,37 +315,13 @@
     alias findSymbolsImpl!(prefix, C, 0, pred).result findSymbols;
 }
 
-string __toString(long v)
-{
-    if (v == 0)
-        return "0";
-
-    string ret;
-
-    bool neg;
-    if (v < 0)
-    {
-        neg = true;
-        v = -v;
-    }
-
-    while (v != 0)
-    {
-        ret = cast(char)(v % 10 + '0') ~ ret;
-        v = cast(long)(v / 10);
-    }
-
-    if (neg)
-        ret = "-" ~ ret;
-
-    return ret;
-}
-
 string convertSignalArguments(Args...)()
 {
 //        void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
-
-    string res = "void*[" ~ __toString(Args.length+1) ~ "] _a = [null";
+    // at least for string argument need to construct a QString value
+    string res = prepareSignalArguments!(Args);
+    
+    res ~= "void*[" ~ __toString(Args.length+1) ~ "] _a = [null";
     foreach(i, _; Args)
         res ~= ", " ~ "cast(void*) &" ~ convertSignalArgument!(Args[i])("_t" ~ __toString(i));
     res ~= "];\n";
@@ -463,7 +439,7 @@
             
             static if (signalType == SignalType.NewSignal)
             {
-//                pragma (msg, SignalEmitter!(ArgTypes)(SignalType.NewSignal, getFunc!_Name(fullName), defVals, localIndex));
+                pragma (msg, SignalEmitter!(ArgTypes)(SignalType.NewSignal, getFunc!_Name(fullName), defVals, localIndex));
                 mixin (SignalEmitter!(ArgTypes)(SignalType.NewSignal, getFunc!_Name(fullName), defVals, localIndex));
             }
         }
@@ -487,7 +463,10 @@
     {
         if(i > 0)
             res ~= ",";
-        res ~= T[i].stringof;
+        static if (isNativeType!(T[i]))
+            res ~= Unqual!(T[i]).stringof;
+        else
+            res ~= T[i].stringof;
     }
     res ~= ")";
     return res;
--- a/qt/qtd/MOC.d	Tue Dec 08 21:13:24 2009 +0000
+++ b/qt/qtd/MOC.d	Sat Dec 12 03:22:54 2009 +0500
@@ -6,6 +6,7 @@
 
 import qt.Signal;
 import qt.qtd.MetaMarshall;
+public import qt.core.QString;
 
 public import std.traits;
 /**
@@ -529,6 +530,6 @@
     
     alias TupleWrapper!(findSymbols!(slotPrefix,   typeof(this), ByOwner!(typeof(this)))) Slots;
     alias TupleWrapper!(findSymbols!(signalPrefix, typeof(this), ByOwner!(typeof(this)))) Signals;
-//    pragma(msg, generateMetaInfo!((typeof(this)).stringof, Signals, Slots)());
+    pragma(msg, generateMetaInfo!((typeof(this)).stringof, Signals, Slots)());
     mixin(generateMetaInfo!((typeof(this)).stringof, Signals, Slots)());
 }
--- a/qt/qtd/MetaMarshall.d	Tue Dec 08 21:13:24 2009 +0000
+++ b/qt/qtd/MetaMarshall.d	Sat Dec 12 03:22:54 2009 +0500
@@ -2,6 +2,34 @@
 
 import std.traits;
 
+// shouldn't be here
+
+string __toString(long v)
+{
+    if (v == 0)
+        return "0";
+
+    string ret;
+
+    bool neg;
+    if (v < 0)
+    {
+        neg = true;
+        v = -v;
+    }
+
+    while (v != 0)
+    {
+        ret = cast(char)(v % 10 + '0') ~ ret;
+        v = cast(long)(v / 10);
+    }
+
+    if (neg)
+        ret = "-" ~ ret;
+
+    return ret;
+}
+
 template isQObjectType(T) // is a QObject type that belongs to the library
 {
     enum isQObjectType = is(T.__isQObjectType);
@@ -19,7 +47,12 @@
 
 template isNativeType(T) // type that doesn't require conversion i.e. is the same in C++ and D
 {
-    enum isNativeType = isNumeric!T || is(T == bool);
+    enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct);
+}
+
+template isStringType(T) // string type
+{
+    enum isStringType = is(T == string);
 }
 
 // converts an argumnent from C++ to D in qt_metacall
@@ -29,6 +62,8 @@
         return T.stringof ~ ".__getObject(*cast(void**)(" ~ ptr ~ "))";
     else static if (isNativeType!T)
         return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")";
+    else static if (isStringType!T)
+        return "QStringUtil.toNativeString(" ~ ptr ~ ")";
     else
         return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")";
         //res = T.stringof;
@@ -39,8 +74,10 @@
 {
     static if (isQObjectType!T)
         return T.stringof ~ "*";
+    else static if (isStringType!T)
+        return "QString";
     else static if (isNativeType!T)
-        return T.stringof;
+        return Unqual!T.stringof;
     else
         return T.stringof;
 }
@@ -50,8 +87,19 @@
 {
     static if (isQObjectType!T)
         return arg ~ ".__nativeId";
+    else static if (isStringType!T)
+        return "_qt" ~ arg;
     else static if (isNativeType!T)
         return arg;
     else
         return arg;
 }
+
+string prepareSignalArguments(Args...)()
+{
+    string res;
+    foreach(i, _; Args)
+        static if (isStringType!(Args[i]))
+            res ~= "auto _qt_t" ~ __toString(i) ~ " = QString(_t" ~ __toString(i) ~ ");\n";
+    return res;
+}