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); 23 qobject.setDisableDosCalls(true); 24 } 25 26 extern(C) void deleteSafeObject(int id, void* object) 27 { 28 GC.clrAttr(object, GC.BlkAttr.NO_MOVE); 29 GC.removeRoot(object); 30 } 31 32 int qmlRegisterType(T)(string uri, int major, int minor, string qmlName) if (__traits(compiles, createObject!T)) 33 { 34 auto createFunction = &(createSafeObject!T); 35 auto deleteFunction = &deleteSafeObject; 36 auto staticMetaObject = T.staticMetaObject(); 37 38 DosQmlRegisterType args; 39 args.uri = uri.toStringz(); 40 args.major = major; 41 args.minor = minor; 42 args.qml = qmlName.toStringz(); 43 args.staticMetaObject = staticMetaObject.voidPointer(); 44 args.createFunction = createFunction; 45 args.deleteFunction = deleteFunction; 46 47 return dos_qdeclarative_qmlregistertype(args); 48 } 49 50 int qmlRegisterSingletonType(T)(string uri, int major, int minor, string qmlName) if (__traits(compiles, createObject!T)) 51 { 52 auto createFunction = &(createSafeObject!T); 53 auto deleteFunction = &deleteSafeObject; 54 auto staticMetaObject = T.staticMetaObject(); 55 56 DosQmlRegisterType args; 57 args.uri = uri.toStringz(); 58 args.major = major; 59 args.minor = minor; 60 args.qml = qmlName.toStringz(); 61 args.staticMetaObject = staticMetaObject.voidPointer(); 62 args.createFunction = createFunction; 63 args.deleteFunction = deleteFunction; 64 65 return dos_qdeclarative_qmlregistersingletontype(args); 66 }