changeset 87:f46133029d8b

qtd: Implement QMetaType. QVariant may save D types now.
author SokoL_SD
date Tue, 26 May 2009 10:59:07 +0000
parents bee1446909c5
children 201684eb20ee
files build/core.txt cpp/qt_core/QMetaType_shell.cpp cpp/qt_core/QVariant_shell.cpp qt/core/QMetaType.d qt/core/QVariant.d
diffstat 5 files changed, 251 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/build/core.txt	Tue May 26 06:25:44 2009 +0000
+++ b/build/core.txt	Tue May 26 10:59:07 2009 +0000
@@ -5,7 +5,7 @@
     qt_core/QLine_shell qt_core/QLineF_shell
     qt_core/QRect_shell qt_core/QRectF_shell
     qt_core/QString_shell qt_core/QVariant_shell
-    qt_core/QModelIndex_shell)
+    qt_core/QModelIndex_shell qt_core/QMetaType_shell)
 ## Module specific d files.
 set (d_files QGlobal qtd/Array qtd/Str QtDObject qtd/ArrayOpsPrimitive
     core/QPoint core/QPointF
@@ -13,7 +13,7 @@
     core/QLine core/QLineF
     core/QRect core/QRectF
     core/QString core/QVariant
-    core/QModelIndex)
+    core/QModelIndex core/QMetaType)
 set (d_version_files Signal)
 set (d_generated_files core/Qt)
 ## Classes.
@@ -52,5 +52,6 @@
     QAbstractListModel
     QCryptographicHash
     QSettings
+   ## QProcess
     )
 	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpp/qt_core/QMetaType_shell.cpp	Tue May 26 10:59:07 2009 +0000
@@ -0,0 +1,28 @@
+
+#include <QMetaType>
+#include "qtd_core.h"
+
+typedef void * Ctor (const void *copy);
+typedef void Dtor(void *obj);
+
+extern "C" DLL_PUBLIC int qtd_registerType(char* namePtr, Ctor ctor, Dtor dtor)
+{   
+    return QMetaType::registerType(namePtr, dtor, ctor);
+}
+
+typedef void (*SaveOperator)(void *, void *);
+typedef void (*LoadOperator)(void *, void *);
+
+
+extern "C" DLL_PUBLIC void qtd_registerStreamOperators(const char *typeName, SaveOperator saveOp,
+                                        LoadOperator loadOp)
+{   
+    QMetaType::registerStreamOperators(typeName, reinterpret_cast<QMetaType::SaveOperator>(saveOp),
+                                       reinterpret_cast<QMetaType::LoadOperator>(loadOp));
+}
+    
+
+extern "C" DLL_PUBLIC int qtd_MetatypeId(char *id)
+{
+    return QMetaType::type(id);
+}
--- a/cpp/qt_core/QVariant_shell.cpp	Tue May 26 06:25:44 2009 +0000
+++ b/cpp/qt_core/QVariant_shell.cpp	Tue May 26 10:59:07 2009 +0000
@@ -938,7 +938,14 @@
     return __java_return_value;
 }
 
+extern "C" DLL_PUBLIC void *qtd_QVariant_data(void* __this_nativeId)
+{
+    QVariant_QtDShell *__qt_this = (QVariant_QtDShell *) __this_nativeId;
+    return __qt_this->data();
+}
+
 // ---externC---end
 // Field accessors
 
 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qt/core/QMetaType.d	Tue May 26 10:59:07 2009 +0000
@@ -0,0 +1,113 @@
+module qt.core.QMetaType;
+public import qt.core.Qt;
+private import qt.core.QDataStream;
+
+version (Tango)
+{
+    import tango.core.Array;
+    import tango.stdc.stringz;
+    import tango.core.Traits;
+}
+
+alias extern(C) void *function(void *copy) Ctor;
+alias extern(C) void function(void *obj) Dtor;
+alias extern(C) void function(void *stream, void * object) StreamOp;
+
+struct DArrayToC
+{
+    void[] array;
+}
+
+public template MetaTypeOps(T)
+{
+   // TODO:
+   // static assert(typeof(new T), "Type " ~ T.stringof ~ " has no default constructor");
+   // static assert(typeof(new T(T.init))), "Type " ~ T.stringof ~ " has no default copy constructor");
+
+    extern(C) void* ctor(void* copy)
+    {
+	static if (is(T == class) || is(T == interface))
+	{
+	    return cast(void*)(copy ? new T(cast(T)copy) : new T);
+	}
+	else static if (isDynamicArrayType!(T) || isStaticArrayType!(T) )
+	{
+	    auto darray = new DArrayToC;
+	    if(copy)
+		darray.array = (cast(DArrayToC*)copy).array.dup;
+	    return cast(void*)darray;
+	}
+	else
+	{
+	    auto data = new T;
+	    if(copy)
+		*data = *cast(T*)copy;
+	    return cast(void*)data;
+	}
+    }
+    
+
+    extern(C) void dtor(void* obj)
+    {
+        static if (is(T == class) || is(T == interface))
+	{
+	    auto tmp = cast(T)obj;
+            delete tmp;
+	}
+	else
+	{
+	    auto tmp = cast(T*)obj;
+            delete tmp;
+	}
+    }
+}
+
+public int qRegisterMetaType(T)(string name = null)
+{
+    if (!name.length)
+	name = typeid(T).toString; 
+
+    return qtd_registerType(toStringz(name), &MetaTypeOps!(T).ctor, &MetaTypeOps!(T).dtor);
+}
+
+/* Not work....
+private class DataStreamPriv: QDataStream
+{
+    this(void * cobj)
+    {
+	super(cobj);
+    }
+}
+*/
+/*
+public void qRegisterMetaTypeStreamOperators(T)(void function(ref QDataStream, T ) saveOp, void function (ref QDataStream, ref T) loadOp, string name = null)
+{
+    static void function(ref QDataStream, T ) SaveOp;
+    static void function (ref QDataStream, ref T)  LoadOp;
+    SaveOp = saveOp;
+    LoadOp = loadOp;
+    
+    if (!name.length)
+	name = typeid(T).toString; 
+    
+    extern(C) void saveOpC(void *stream, void *object)
+    {
+	QDataStream dstream = new DataStreamPriv(stream);
+	Stdout(object).newline;
+	static if (is(T == class) || is(T == interface))
+	    SaveOp(dstream, cast(T)object);	
+	else 
+	    SaveOp(dstream, *cast(T*)object);
+    }
+    
+    extern(C) void loadOpC(void *stream, void *object)
+    {
+	//return stream;
+    }
+
+    qtd_registerStreamOperators(toStringz(name), cast(StreamOp)&saveOpC, cast(StreamOp)&loadOpC);
+}
+*/
+private extern(C) void qtd_registerStreamOperators(char *typeName, StreamOp saveOp, StreamOp loadOp);
+private extern(C) int qtd_registerType(in char* namePtr, Ctor ctor, Dtor dtor);
+extern(C) int qtd_MetatypeId(char *id); // TODO: wrap to D.
\ No newline at end of file
--- a/qt/core/QVariant.d	Tue May 26 06:25:44 2009 +0000
+++ b/qt/core/QVariant.d	Tue May 26 10:59:07 2009 +0000
@@ -2,6 +2,7 @@
 
 public import qt.QGlobal;
 private import qt.QtDObject;
+private import qt.core.QMetaType;
 
 // automatic imports-------------
 private import qt.core.QSizeF;
@@ -28,6 +29,7 @@
     import tango.core.Array;
     import tango.stdc.stringz;
     import tango.text.convert.Utf;
+    import tango.core.Traits;
 }
 
 
@@ -91,8 +93,38 @@
 
         LastType = 0xffffffff // need this so that gcc >= 3.4 allocates 32 bits for Type
     }
+    
+// Functions
 
-// Functions
+    static public QVariant fromValue(T)(T obj)
+    {
+	QVariant var;
+	static if (is(T == class) || is(T == interface))
+	{
+	    int i = qtd_MetatypeId(toStringz(obj.classinfo.name));
+	    var = new QVariant(i, cast(void*)(obj));
+	}
+	else static if (isDynamicArrayType!(T) || isStaticArrayType!(T) )
+	{
+	    int i = qtd_MetatypeId(toStringz(typeid(ElementTypeOfArray!(T)).toString ~ "[]"));
+	    auto darray = new DArrayToC;
+	    darray.array = obj.dup;
+	    var = new QVariant(i, cast(void*)(darray));
+	}
+	else
+	{
+	    int i = qtd_MetatypeId(toStringz(typeid(T).toString));
+	    auto data = new T;
+	    *data = obj;
+	    var = new QVariant(i, cast(void*)(data));
+	}
+	return var;
+    }
+    
+    static public QVariant opCall(T)(T obj)
+    {
+	return fromValue(obj);
+    }
 
     public this() {
         void* __qt_return_value = qtd_QVariant_QVariant();
@@ -267,11 +299,75 @@
         super(__qt_return_value);
     }
 
-
     public final bool canConvert(Type type) {
         return qtd_QVariant_canConvert(nativeId, type);
     }
 
+    public final Type value(Type)() {
+	static if ( is(Type == QBitArray) )
+	    return toBitArra; 
+	else static if ( is(Type == bool) )
+	    return toBool; 
+	else static if ( is(Type == QByteArray) )
+	    return toByteArray; 
+	else static if ( is(Type == QDate) )
+	    return toDate; 
+	else static if ( is(Type == QDateTime) )
+	    return toDateTime; 
+	else static if ( is(Type == double) )
+	    return toDouble; 
+	else static if ( is(Type == int) )
+	    return toInt; 
+	else static if ( is(Type == QLine) )
+	    return toLine; 
+	else static if ( is(Type == QLineF) )
+	    return toLineF; 
+	else static if ( is(Type == QLocale) )
+	    return toLocale; 
+	else static if ( is(Type == long) )
+	    return toLongLong; 
+	else static if ( is(Type == QPoint) )
+	    return toPoint; 
+	else static if ( is(Type == QPointF) )
+	    return toPointF;
+	else static if ( is(Type == QRect) )
+	    return toRect;
+	else static if ( is(Type == QRectF) )
+	    return toRectF;
+	else static if ( is(Type == QRegExp) )
+	    return toRegExp;
+	else static if ( is(Type == QSize) )
+	    return toSize;
+	else static if ( is(Type == QSizeF) )
+	    return toSizeF;
+	else  static if ( is(Type == string) )
+	    return toString;
+	else  static if ( is(Type == QTime) )
+	    return toTime;
+	else static if ( is(Type == uint) )
+	    return toUInt;
+	else static if ( is(Type == ulong) )
+	    return toULongLong;
+	else static if ( is(Type == QUrl) )
+	    return toUrl;
+	else static if( is( Type == class ) || is( Type == interface ) )
+	{
+	    Object object = cast(Object)qtd_QVariant_data(nativeId);
+	    if(object)
+		return cast(Type)(object);
+	    return null;
+	}
+	else static if (isDynamicArrayType!(Type) || isStaticArrayType!(Type) )
+	{
+	    auto array = cast(DArrayToC*)qtd_QVariant_data(nativeId);
+	    return cast(Type)(array.array);
+	}
+	else
+	{
+	    return *cast(Type*)qtd_QVariant_data(nativeId);
+	}
+    }
+
     public final void clear() {
         qtd_QVariant_clear(nativeId);
     }
@@ -530,8 +626,8 @@
 private extern(C) void*  qtd_QVariant_toUrl(void* __this_nativeId);
 private extern(C) char*  qtd_QVariant_typeName(void* __this_nativeId);
 private extern(C) int  qtd_QVariant_userType(void* __this_nativeId);
+private extern(C) void *qtd_QVariant_data(void* __this_nativeId);
+
 // Just the private functions for abstract functions implemeneted in superclasses
 
-
-
 // Virtual Dispatch functions