# HG changeset patch # User SokoL_SD # Date 1243335547 0 # Node ID f46133029d8b35a4381ea1cf89b5692236a6bf73 # Parent bee1446909c5e3262a32d3c9bbf823e9c1823444 qtd: Implement QMetaType. QVariant may save D types now. diff -r bee1446909c5 -r f46133029d8b build/core.txt --- 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 ) diff -r bee1446909c5 -r f46133029d8b cpp/qt_core/QMetaType_shell.cpp --- /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 +#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(saveOp), + reinterpret_cast(loadOp)); +} + + +extern "C" DLL_PUBLIC int qtd_MetatypeId(char *id) +{ + return QMetaType::type(id); +} diff -r bee1446909c5 -r f46133029d8b cpp/qt_core/QVariant_shell.cpp --- 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 + diff -r bee1446909c5 -r f46133029d8b qt/core/QMetaType.d --- /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 diff -r bee1446909c5 -r f46133029d8b qt/core/QVariant.d --- 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