1 module dqml.qdeclarative; 2 3 import dqml.dothersideinterface; 4 import dqml.qobject; 5 import std.string; 6 import std.traits; 7 import std.stdio; 8 import core.memory; 9 10 QObject createObject(T)() 11 { 12 return new T(); 13 } 14 15 extern(C) void createSafeObject(T)(int id, void* wrapper, ref void* dObject, ref void* dosQObject) 16 { 17 QObject qobject = createObject!T(); 18 GC.addRoot(cast(void*)qobject); 19 GC.setAttr(cast(void*)qobject, GC.BlkAttr.NO_MOVE); 20 dObject = cast(void*)(qobject); 21 dosQObject = qobject.voidPointer(); 22 qobject.setVoidPointer(wrapper, false); 23 } 24 25 extern(C) void deleteSafeObject(int id, void* object) 26 { 27 GC.clrAttr(object, GC.BlkAttr.NO_MOVE); 28 GC.removeRoot(object); 29 } 30 31 int qmlRegisterType(T)(string uri, int major, int minor, string qmlName) if (__traits(compiles, createObject!T)) 32 { 33 auto createFunction = &(createSafeObject!T); 34 auto deleteFunction = &deleteSafeObject; 35 auto staticMetaObject = T.staticMetaObject(); 36 37 DosQmlRegisterType args; 38 args.uri = uri.toStringz(); 39 args.major = major; 40 args.minor = minor; 41 args.qml = qmlName.toStringz(); 42 args.staticMetaObject = staticMetaObject.voidPointer(); 43 args.createFunction = createFunction; 44 args.deleteFunction = deleteFunction; 45 46 return dos_qdeclarative_qmlregistertype(args); 47 } 48 49 int qmlRegisterSingletonType(T)(string uri, int major, int minor, string qmlName) if (__traits(compiles, createObject!T)) 50 { 51 auto createFunction = &(createSafeObject!T); 52 auto deleteFunction = &deleteSafeObject; 53 auto staticMetaObject = T.staticMetaObject(); 54 55 DosQmlRegisterType args; 56 args.uri = uri.toStringz(); 57 args.major = major; 58 args.minor = minor; 59 args.qml = qmlName.toStringz(); 60 args.staticMetaObject = staticMetaObject.voidPointer(); 61 args.createFunction = createFunction; 62 args.deleteFunction = deleteFunction; 63 64 return dos_qdeclarative_qmlregistersingletontype(args); 65 }